我为此感到挣扎,我觉得应该可以,但是也许我在做一些愚蠢的事情。此搜索:
{
"query":
{
"bool":
{
"must":[
{"match":{"Element.sourceSystem.name":"Source1 Source2"}}
]
}
}
返回Source1和Source2的数据。在下面添加术语搜索,我希望返回仅包含Source1的第一个搜索的子集。使用第一个查询或单独运行时,不返回任何内容。
{
"query":
{
"bool":
{
"must":[
{"match":{"Element.sourceSystem.name":"Source1 Source2"}},
{"terms":{"Element.sourceSystem.name":["Source1"]}}
]
}
}
}
我知道很难看到这些文档,但是可以说“Element.sourceSystem.name”存在并且可以使用,因为第一次搜索可以正常工作-感激所有输入。
最佳答案
match
查询中的某些处理方式与terms
查询中的处理方式不同。
首先,绕道分析仪:
假设您使用的是elasticsearch的standard analyzer,它由标准标记器和一些标记过滤器组成。标准 token 生成器将在空格,标点符号和其他一些特殊字符上 token 化(将您的文本分成术语)。可以在Elasticsearch文档中找到详细信息,所以现在让我们只说“每个词都是一个术语”。
分析仪的第二个非常重要的部分是小写过滤器。它将把术语变成小写。这意味着以后搜索Source1
和source1
应该会产生相同的结果。
举个简短的例子:
例如,当您将文档编入text
字段时,所有这些都会发生。我假设Element.sourceSystem.name
是这种类型之一,因为您的常规匹配查询似乎可以正常工作。
现在,当您使用"Source1 Source2"
发出匹配查询时,也会进行分析并将其转换为 token source1
和source2
。然后,它将在内部在 bool(boolean) OR中创建2个术语查询。因此,source1
或source2
必须匹配才能成为查询的结果。
现在是有关字词查询的线索。它不会而不是分析您提供的文本。通常应该将其用于keyword
类型的字段。关键字字段也不进行分析(有关更多信息,请阅读mapping types的文档-它实际上非常重要)。那么这是什么意思?
"this", "is", "my", "input", "text", "in", "english"
。 English
的匹配查询将匹配,因为它将被分析为english
English
的术语查询将永远不会匹配,因为我的索引中没有术语English
。区分大小写。 我非常肯定,如果您在条件查询中使用
source1
,它将匹配某些内容。但是,我高度怀疑您的查询是否适合您的用例。在查询文本字段时尝试使用普通的匹配查询,并且(通常-并非始终适用)仅在关键字字段上使用字词查询。