阅读以下的内容!
我在此查询中要获取具有完全等于“AgentFoo”的或完全等于“CustomerBar”的 eventType的文档。我也有一些must_not条件和日期范围过滤器:

GET _search
{"size": 100,
 "query": {
   "bool" : {
     minimum_should_match": 1,
     "should": [{ "term": { "eventType.keyword":"AgentFoo" }},
                { "term": { "eventType.keyword":"CustomerBar" }}

     ],
     "must_not" : [{"match": {"correlationId": {"query": "-456-999"}}},
                   {"match": {"correlationId": {"query": "teste"}}},
                   {"match": {"correlationId": {"query": "monitoracao"}}},
                   {"match": {"correlationId": {"query": "abc"}}},
                   {"match": {"correlationId": {"query": "def"}}},
                   {"match": {"correlationId": {"query": "ghi"}}}
                   ],
"filter": {
 "range": { "when": { "gte":"2019-07-02T00:00:00.000Z",
           "lt"  :"2019-12-31T23:59:27.879Z" }}}
   }
}
}
由于某种原因,它仅返回具有eventType“CustomerBar”的文档。怎么了elasticSearch版本为6.3.1,事件类型和correlationId结构为:
"eventType": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }

"correlationId": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
谢谢!
编辑1:
分析器可能是问题所在,因此我编辑了问题以显示确切的大小写。
编辑2:
错误...我只是对eventType字段进行了排序,注意到这两个事件都在显示。另外,添加minimum_should_match“:1也很重要。我会接受任何人就这些要点进行详细阐述的答案,因为添加我自己的答案将毫无意义。谢谢。

最佳答案

考虑到您的查询,我冒险您在结果中仅获得eventType.keyword“customer”的原因是,查询的must_not和filter部分仅返回那些内容。

您可以通过删除查询的“应该”部分并运行它来轻松确认这一点。

您还可以确认是否只希望检索具有eventType.keyword值“agent”或“customer”的条目吗?

因为据我所知,this is not what your query is doing
如果任何一个值都是必需的,则需要在其中添加“minimum_should_match”:1

最后,您还可以提供correlationId的映射吗?
我相信这也可能是您意外结果的原因

根据您对自己的问题的评论进行编辑

因此,您的问题是,您仅检索了前100个结果,并且该子集中的所有条目只有一个eventType,而总结果包括了所有这些。

正如您还指出的,并且正如我之前提到的,minimum_should_match很重要,否则您可能会获得除想要选择的事件类型以外的其他eventType。没有此参数,其行为应类似于“更好的匹配”,与查询的该部分匹配的条目的得分将比其他部分更好,但是与该部分的匹配不是强制性的。

还需要意识到的一点是,您的must_not:{"match": {"correlationId": {"query": "-456-999"}}}中的第一个条目很可能未达到您的期望:它正在过滤掉任何包含“word” 456或999的correlationId。

您应该阅读analysis上的可用信息。
为了快速总结,将分析一个文本字段(例如correlationId):默认情况下,它会根据空格,破折号,点,逗号,...分割成单词。
当您使用match时,对文本字段的查询也会发生同样的情况。

因此-456-999分为456999
如果这些在您查询的correlationIdId字段中显示为单词,则它们将全部匹配,因此将从您的选择中删除。

我还建议使用terms query重写您的查询,使其更具可读性。

应该将部分替换为:

"must": {
  "terms": {
    "eventType.keyword": [
      "agent",
      "customer"
    ]
  }
}

如果correlationId也完全匹配,则可以这样编写:
"must_not": {
  "terms": {
    "correlationId.keyword": [
        "-456-999",
        "teste",
        "monitoracao",
        "abc",
        "def",
        "ghi"
    ]
  }
}

如果完全不需要匹配项,则需要确保您清楚分析方面,以确认要匹配的类型。实际上,您似乎想要的另一种格式将类似于以下内容:
{
  "must_not": [
    {
      "match_phrase": {
        "correlationId": "-456-999"
      }
    },
    {
      "match": {
        "correlationId": "teste monitoracao abc def ghi"
      }
    }
  ]
}

10-04 20:25