gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:33:19 28 4
gpt4 key购买 nike

我有一个对象映射,它以类似标签的方式使用嵌套对象(在我们的示例中为props)。
每个标签可以属于一个客户/用户,并且当我们想允许我们的用户针对query_string生成props.name样式搜索时。

问题是,当我们运行查询时,如果一个对象有多个 Prop ,并且当其他 Prop 不返回时,如果多个 Prop 之一与过滤器匹配,则当我们想要相反时-如果一个 Prop 返回false,则不返回vs。如果返回true,则返回true。

我在这里发布了一个综合示例:https://gist.github.com/d2kagw/1c9d4ef486b7a2450d95

提前致谢。

最佳答案

我相信这里您可能需要一个扁平化的值列表的优势,例如值数组。数组和嵌套对象之间的主要区别在于,后者“知道”嵌套属性的哪个值对应于同一嵌套对象中另一个属性的另一个值。另一方面,值数组将使某个属性的值变平,并且您失去了client_idname之间的“关联”。意思是,对于数组,您有props.client_id = [null, 2]props.name = ["petlover", "premiumshopper"]

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

换句话说,对于像"query": "props.name:(carlover NOT petlover)"这样的查询,您基本上需要像数组一样针对扁平化的值列表运行它。您需要针对[“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,
    ...
  • 应该(并且确实)返回零结果

  • 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" } } ]
    }
    }
    }
    ]
    }
    }
    }
    }
  • 应该(并且确实)仅返回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" } } ]
    }
    }
    }
    ]
    }
    }
    }
    }
  • 应该(并且确实)仅返回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" } }
    ]
    }
    }
    }
    ]
    }
    }
    }
    }

    关于elasticsearch - Elasticsearch嵌套过滤器包含与不包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26666037/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com