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