当前位置: 首页 > 知识库问答 >
问题:

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

堵茂勋
2023-03-14

我在嵌套文档上合并term,must_not查询时遇到了困难。

Sense示例可以在这里找到: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"
            }
          }
        }
      }
    }
  }
}
{
  "query": {
    "nested": {
      "path": "tags",
      "query": {
        "bool": {
          "must_not": {
            "term": {
              "tags.type": "delete"
            }
          }
        }
      }
    }
  }
}

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

谢谢。

共有1个答案

解博明
2023-03-14

最初的查询将搜索每个嵌套对象,并消除不匹配的对象,但如果还剩下一些嵌套对象,它们确实与查询匹配,因此您将获得结果。这是因为嵌套对象作为一个隐藏的独立文档进行索引

原代码:

{
  "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的新手,对如何进行过滤器、查询和聚合有一些想法,但不确定如何解决下面的问题。我希望能够从下面显示的文档中只查询公司的最新交付(日期和crate_quantity)。我不确定如何去做。有没有办法使用最大聚合从每个文档中只提取最近的交付?

  • 另外,类型中的所有文档都存储了上面提到的community的值。感谢帮助。

  • 问题内容: 我想使用ES进行图书搜索。因此,我决定将作者姓名和标题(作为嵌套文档)放入索引,如下所示: 我不明白的是:如何构造搜索查询,以便在搜索“一二”时仅找到第二本书,而在搜索“二三”时什么也找不到,而在搜索“一”时所有图书呢? 问题答案: 也许是这样的? 该查询基本上说一个文件必须有and 。您可以轻松地重新配置该查询。例如,如果您只想搜索作者,请删除嵌套部分。如果您想要另一本书,请更改嵌套

  • 我是Elasticsearch的新手,如果我问的问题非常简单直接,我会道歉。 我使用以下学生教育细节的映射, 我的数据集中有近15000名学生。文件示例: 我的问题是,我正在尝试做一个简单的查询,以显示那些拥有“BE”学位的学生。但我希望目前拥有BE(工程学士)学位的学生的排名高于同样拥有硕士和博士学位的学生。 从我的例子中,如果我查询“BE”,学生3应该比学生2排名更高。我应该能够根据"endD

  • 如果我有文件: 我想用“红棕色黄”查询,得到文档1。 我怎么能这么做?反过来很容易...

  • 问题内容: 我在获取与Elasticsearch一起使用的嵌套查询时遇到问题(如果我删除了查询字符串之一,则可以使用)。我要解决的问题是我有一个包含关闭列表的文档(关闭)。我想在条件满足另一个值的闭包列表中搜索一个值。那只是从argan = 1的闭包中获得价值 我正在得到这个错误响应; 我的映射如下所示。 有人知道我在做什么错吗? 问题答案: 您的查询不是有效的查询。您需要使用适当的复合查询将其他