我是一个运行弹性搜索的菜鸟1.5.9。我想提取出所有具有该字段的文档" PERSON"设置为"约翰逊。" (注意混合肠衣)。如果我手动查看弹性搜索head,我可以看到具有这些属性的文档。
docs解释说我应该构建一个过滤查询来提取这个文档。但是当我这样做时,我会得到一些意想不到的行为。
这很有效。它只返回一个文件w / Person =" Johnson",正如预期的那样
query = {"filter": {"term" : { "PERSON" : "johnson" }}}
但这不起作用
query = {"filter": {"term" : { "PERSON" : "Johnson" }}}
如果你仔细观察,你会发现好的查询是小写的,但是坏的查询是大小写的 - 即使PERSON字段被设置为" Johnson"。
添加到奇怪的地方,我对full_text
字段中的所有内容进行了下限:"_source": { "full_text": "all lower case"
所以全文包含johnson
- 我认为这完全独立于{{1}} PERSON字段。
发生了什么?如何在PERSON字段上进行混合大小写搜索?
答案 0 :(得分:1)
术语查询不会分析您的搜索文本。 这意味着您需要分析并以令牌格式提供查询,以便术语查询实际工作。 使用match query代替,事情会像魔术一样发挥作用。
因此,当下面的字符串转到Elasticsearch时,它会被标记化(或者更确切地说是分析)并存储
"Green Apple" -> ( "green" , "apple")
这是分析的默认行为。 现在,当您使用术语查询进行搜索时,分析不会发生。 对于Apple这个词来说,它会搜索保留案例的令牌Apple。因此失败了。
对于匹配查询,它会进行分析。这意味着如果您使用Apple进行搜索,它会将其转换为Apple,然后进行搜索。这给了很好的比赛。
您可以详细了解分析here。