我正在努力解决这个问题,我觉得应该这样做,但也许我做了一些愚蠢的事情。这次搜索:
{
"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"存在并且可用,因为第一次搜索工作正常 - 所有输入都感激不尽。
答案 0 :(得分:2)
有些内容在match
次查询中的处理方式与terms
次查询中的处理方式不同。
首先,绕道分析员:
假设您使用的是弹性搜索的standard analyzer,其中包含标准的标记符和一些标记过滤器。标准标记器将在空格,标点符号和一些其他特殊字符上标记化(将文本拆分为术语)。详细信息可以在Elasticsearch文档中找到,所以现在让我们说'每个单词都是一个术语'。
分析仪的第二个非常重要的部分是小写过滤器。它会将术语转换为小写。这意味着,稍后,搜索Source1
和source1
会产生相同的结果。
这是一个简短的例子:
输入:“这是我的英文输入文字。”将进行分析并最终得到以下术语:“this”,“is”,“my”,“input”,“text”,“in”,“english”。
例如,当您将文档索引到text
字段时,会发生所有这些情况。我假设Element.sourceSystem.name
是这种类型之一,因为您的普通匹配查询似乎有效。
现在,当您使用"Source1 Source2"
发出匹配查询时,分析也会发生并将其转换为令牌source1
和source2
。在内部,它将在布尔OR中创建2个术语查询。因此,source1
或source2
必须匹配才能成为您查询的结果。
顺便说一句,匹配查询支持
minimum_should_match
属性。您可以指定匹配查询的匹配项数。
现在是条款查询的线索。它不分析您提供的文本。它通常应该用于keyword
类型的字段。关键字字段也未分析(有关详细信息,请阅读mapping types的文档 - 这实际上非常重要)。那是什么意思呢?
"this", "is", "my", "input", "text", "in", "english"
。English
匹配的匹配查询将匹配,因为它将被分析为english
English
的字词/查询永远不会匹配,因为我的索引中没有字词English
。它区分大小写。我非常积极,如果你在你的条款查询中使用source1
,它会匹配一些东西。但是,我非常怀疑您的查询是您的用例的方法。在查询文本字段时尝试使用常规匹配查询,并且(通常并非总是适用)仅对关键字字段使用术语查询。