我有一个对象映射,它props以类似标签的方式使用嵌套对象(在我们的示例中)。每个标签可以属于一个客户/用户,并且当我们要允许我们的用户针对生成query_string样式搜索时props.name。
props
query_string
props.name
问题是,当我们运行查询时,如果一个对象有多个道具,并且当其他道具不返回时,如果多个道具之一与过滤器匹配,则当我们想要相反时- 如果一个道具返回false,则不返回vs。如果返回true,则返回true。
我在这里发布了一个完整的示例:https : //gist.github.com/d2kagw/1c9d4ef486b7a2450d95
提前致谢。
我相信在这里您可能需要一个扁平化的值列表的优势,例如值数组。数组和嵌套对象之间的主要区别在于,后者“知道”嵌套属性的哪个值对应于 同一 嵌套对象中另一个属性的另一个值。另一方面,值数组将使某个属性的值变平,并且您将失去a client_id和a 之间的“关联” name。含义是,您拥有props.client_id = [null, 2]和的数组props.name = ["petlover", "premiumshopper"]。
client_id
name
props.client_id = [null, 2]
props.name = ["petlover", "premiumshopper"]
使用nested过滤器,您希望将该字符串与所有值匹配,以props.name表示一个父文档的 所有 嵌套props.names都需要匹配。嗯,嵌套对象不会发生这种情况,因为嵌套文档是分开的,并且要分别查询。并且,如果至少一个嵌套文档匹配,则将其视为匹配。
nested
换句话说,对于像"query": "props.name:(carlover NOT petlover)"您这样的查询,基本上需要像数组一样针对扁平化的值列表运行它。您需要针对[“ carlover”,“ petlover”]运行查询。
"query": "props.name:(carlover NOT petlover)"
我对您的建议是制作嵌套文档"include_in_parent": true(即在父级中保留一个扁平的,类似数组的值列表)并稍微更改一下查询:
"include_in_parent": true
match
term
missing
null
query
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” } } ] } } } ] } } } }