Elasticsearch嵌套过滤器包含与不包含

Elasticsearch嵌套过滤器包含与不包含,第1张

Elasticsearch嵌套过滤器包含与不包含

我相信在这里您可能需要一个扁平化的值列表的优势,例如值数组。数组和嵌套对象之间的主要区别在于,后者“知道”嵌套属性的哪个值对应于 同一
嵌套对象中另一个属性的另一个值。另一方面,值数组将使某个属性的值变平,并且您将失去a

client_id
和a 之间的“关联”
name
。含义是,您拥有
props.client_id = [null, 2]
和的数组
props.name = ["petlover","premiumshopper"]

使用

nested
过滤器,您希望将该字符串与所有值匹配,以
props.name
表示一个父文档的 所有
嵌套
props.name
s都需要匹配。嗯,嵌套对象不会发生这种情况,因为嵌套文档是分开的,并且要分别查询。并且,如果至少一个嵌套文档匹配,则将其视为匹配。

换句话说,对于像

"query": "props.name:(carlover NOTpetlover)"
您这样的查询,基本上需要像数组一样针对扁平化的值列表运行它。您需要针对[“ carlover”,“ petlover”]运行查询。

我对您的建议是制作嵌套文档

"include_in_parent": true
(即在父级中保留一个扁平的,类似数组的值列表)并稍微更改一下查询:

  • 对于
    query_string
    零件,请使用扁平化的属性方法来匹配您查询的元素组合列表,而不是逐个元素。
  • 对于
    match
    (或
    term
    参见下文),
    missing
    零件使用嵌套属性方法,因为您可以
    null
    在其中使用。一个
    missing
    阵列上只会匹配,如果整个阵列丢失,而不是在它的一个值,所以在这里我们不能使用相同的方法作为查询,那里的值在数组中夷为平地。
  • 可选,但对于
    query
    match
    整数,我将使用
    term
    ,因为它不是字符串而是整数,并且默认为
    not_analyzed

说了这些,有了以上更改,这些更改就是:

{  "mappings" : {    ...        "props": {          "type": "nested",          "include_in_parent": true,   ...
  1. 应该(并且确实)返回零结果

    GET /nesting-test/_search?pretty=true
    {
    “query”: {
    “filtered”: {
    “filter”: {
    “and”: [
    {
    “query”: {
    “query_string”: { “query”: “props.name:((carlover AND premiumshopper) NOT petlover)” }
    }
    },
    {
    “nested”: {
    “path”: “props”,
    “filter”: {
    “or”: [ { “query”: { “match”: { “props.client_id”: 1 } } }, { “missing”: { “field”: “props.client_id” } } ]
    }
    }
    }
    ]
    }
    }
    }
    }

  2. 应该(并且确实)只返回1

    GET /nesting-test/_search?pretty=true
    {
    “query”: {
    “filtered”: {
    “filter”: {
    “and”: [
    {“query”: {“query_string”: { “query”: “props.name:(carlover NOT petlover)” } } },
    {
    “nested”: {
    “path”: “props”,
    “filter”: {
    “or”: [{ “query”: { “match”: { “props.client_id”: 1 } } },{ “missing”: { “field”: “props.client_id” } } ]
    }
    }
    }
    ]
    }
    }
    }
    }

  3. 应该(并且确实)只返回2

    GET /nesting-test/_search?pretty=true
    {
    “query”: {
    “filtered”: {
    “filter”: {
    “and”: [
    { “query”: {“query_string”: { “query”: “props.name:(* NOT carlover)” } } },
    {
    “nested”: {
    “path”: “props”,
    “filter”: {
    “or”: [{ “query”: { “term”: { “props.client_id”: 1 } } },{ “missing”: { “field”: “props.client_id” } }
    ]
    }
    }
    }
    ]
    }
    }
    }
    }



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4937286.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存