阅读以下的内容!
我在此查询中要获取具有完全等于“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
分为456
和999
。
如果这些在您查询的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"
}
}
]
}