gpt4 book ai didi

elasticsearch - 术语、嵌套文档和 must_not 查询在 ElasticSearch 中不兼容?

转载 作者:行者123 更新时间:2023-11-29 02:46:25 25 4
gpt4 key购买 nike

我在组合 term, must_not 嵌套文档查询时遇到问题。

意义示例可以在这里找到:http://sense.qbox.io/gist/be436a1ffa01e4630a964f48b2d5b3a1ef5fa176

这里是我的映射:

{
"mappings": {
"docs" : {
"properties": {
"tags" : {
"type": "nested",
"properties" : {
"type": {
"type": "string",
"index": "not_analyzed"
}
}
},
"label" : {
"type": "string"
}
}
}
}
}

在这个索引中有两个文档:

{
"tags" : [
{"type" : "POST"},
{"type" : "DELETE"}
],
"label" : "item 1"
},
{
"tags" : [
{"type" : "POST"}
],
"label" : "item 2"
}

当我这样查询这个索引时:

{
"query": {
"nested": {
"path": "tags",
"query": {
"bool": {
"must": {
"term": {
"tags.type": "DELETE"
}
}
}
}
}
}
}

我命中了一次(正确)

当我想获取不包含标签“DELETE”的文档时,使用此查询:

{
"query": {
"nested": {
"path": "tags",
"query": {
"bool": {
"must_not": {
"term": {
"tags.type": "delete"
}
}
}
}
}
}
}

我有 2 次匹配(这是不正确的)。这个问题似乎非常接近这个问题 ( Elasticsearch array must and must_not ) 但它不是......

你能给我一些线索来解决这个问题吗?

谢谢

最佳答案

您的原始查询会在每个单独的嵌套对象中搜索并消除不匹配的对象,但如果还剩下一些嵌套对象,它们会与您的查询匹配,因此您会得到结果。这是因为嵌套对象被索引为隐藏的单独文档

原代码:

{
"query": {
"nested": {
"path": "tags",
"query": {
"bool": {
"must_not": {
"term": {
"tags.type": "delete"
}
}
}
}
}
}
}

解决方案真的很简单,您应该将 bool 查询带到嵌套文档之外。现在,所有具有“DELETE”类型嵌套对象的文档都将被丢弃。正是您想要的!

解决方法:

{
"query": {
"bool": {
"must_not": {
"nested": {
"path": "tags",
"query": {
"term": {
"tags.type": "DELETE"
}
}
}
}
}
}
}

注意:您的字符串“未分析”,您搜索的是“删除”而不是“删除”。如果您想搜索不区分大小写,请分析您的字符串

关于elasticsearch - 术语、嵌套文档和 must_not 查询在 ElasticSearch 中不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22254153/

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