我正在努力解决这个问题,我觉得这应该有效,但也许我正在做一些愚蠢的事情。本次搜索:
{
"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,它由一个标准分词器和一些分词过滤器组成。标准分词器将对空格、标点符号和其他一些特殊字符进行分词(将文本拆分为术语)。详细信息可以在 Elasticsearch 文档中找到,所以现在我们只说“每个单词都是一个术语”。
分析器的第二个非常重要的部分是小写过滤器。它将把术语转换为小写。这意味着,稍后,寻找Source1
and source1
应该产生相同的结果。
一个简短的例子:
输入:“这是我的英文输入文本。”将被分析并最终得到以下术语:“this”、“is”、“my”、“input”、“text”、“in”、“english”。
当您将文档索引到text
例如字段。我假设Element.sourceSystem.name
是这种类型之一,因为您的正常匹配查询似乎有效。
现在,当您发出匹配查询时"Source1 Source2"
,分析也会发生并将其转化为代币source1
and source2
。然后,它会在内部以布尔 OR 形式创建 2 个术语查询。所以要么source1
or source2
必须匹配才能成为您的查询结果。
顺便说一句,匹配查询支持minimum_should_match
财产。您可以指定匹配查询需要匹配多少个术语。
现在这是术语查询的线索。确实如此not分析您提供的文本。它通常应该用在类型字段上keyword
。关键字字段也不被分析(更多信息,请阅读文档映射类型- 这实际上非常重要)。那么这是什么意思?
- 如果我以上面的例子为例,我的索引将包含
"this", "is", "my", "input", "text", "in", "english"
.
- 匹配查询
English
将匹配,因为它将被分析为english
- 术语查询
English
永远不会匹配,因为没有术语English
在我的索引中。它区分大小写。
我非常积极,如果你愿意的话source1
在您的术语查询中,它会匹配某些内容。但是,我非常怀疑您的查询是否适合您的用例。查询文本字段时尝试使用正常匹配查询,并且(通常 - 并不总是适用)仅在关键字字段上使用术语查询。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)