【问题标题】:Search document with empty array field, on ElasticSearch在 ElasticSearch 上搜索具有空数组字段的文档
【发布时间】:2018-09-19 00:29:11
【问题描述】:

我有一组文档(输入'article'),我想在数组字段

{
    "_type": "article",
    "_source": {
        "title": "Article 1",
        "locations": [
            {
                "address": "ES headquarter",
                "city": "Berlin"
            }
        ]
    }
}

我想要两个查询(只有一个,但有一点变化):

  • 获取所有有位置的文章
  • 获取所有没有位置的文章

我尝试了不同的方法,但可能我对 ElasticSearch 太差了:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": [
        {
          "type": {
            "value": "article"
          }
        },
        {
          "bool": {
            "must_not": {
              "missing": {
                "field": "location",
                "existence": true,
                "null_value": true
              }
            }
          }
        }
      ]
    }
  }
}

这不起作用。

  • 您将如何解决我的查询?

但主要是:

  • 如何对字段为空数组的文档执行此搜索?

【问题讨论】:

    标签: arrays database elasticsearch isnullorempty


    【解决方案1】:

    如果addresslocation 数组中的必填字段,您可以修改查询:

    "must_not": {
      "missing": {
        "field": "locations.address"
      }
    }
    

    AFAIK,在 ES 中你不能查询非叶元素(比如你的 location 字段)(参见 issue),如果 object 类型 ES 扁平化嵌套字段(参见 nested typeobject type )。这就是为什么我建议改为查询叶子元素之一。但它要求其中之一是强制性的(不幸的是,您的情况并不满足)。

    无论如何,我使用source_filtering 中的_source 参数找到了解决方案:

    "must_not": {
      "script": {
        "script": "_source.locations.size() > 0"
      }
    }
    

    注意使用"lang":"groovy"你应该写:"script": "_source.locations.size > 0"

    【讨论】:

    • 不,它不是必填字段; 我还能怎么解决?如果它是强制性的,会有什么区别?.
    • 哇,谢谢!这似乎几乎是我需要的解决方案 :) 问题:_________1) 我得到一个 script_lang not supported [groovy] (仅删除 lang 语句即可解决); 2) 我得到一个 Error: could not access: size;在课堂上:java.util.ArrayList,我不知道如何处理:(
    • 好吧,这可能超出了我对 ES 的实际了解,但这里是我的提示:
    • 解决了!是_source.locations.size() > 0!错过了括号!它现在完美运行:D!如果您更新答案,我会将其设置为最佳答案^^
    • 超级!现在很清楚了:对于mvel 脚本语言,我们应该使用size(),但对于groovy,我们应该使用size
    【解决方案2】:

    如果您不想启用脚本,您可以将 Exists Querymust_not 布尔查询结合起来,例如:

    {
      "query":{
        "bool":{
          "must_not":[
            {
              "exists":{
                "field":"tags"
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      好像已经回答了类似的问题,我没有测试解决方案,但您可以尝试一下:>> elasticsearch filtering by the size of a field that is an array

      【讨论】:

      • 我已经尝试过了,但我无法让它工作。我总是在读取类似"script" : "doc['locations'].values.length > 0" 的字段 'locations' 时遇到问题。而且我不明白为什么它找不到该字段:-(
      猜你喜欢
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 2018-12-28
      • 2012-08-12
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多