意外情况敏感

时间:2015-06-10 04:37:38

标签: elasticsearch

我是一个运行弹性搜索的菜鸟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字段上进行混合大小写搜索?

1 个答案:

答案 0 :(得分:1)

术语查询不会分析您的搜索文本。 这意味着您需要分析并以令牌格式提供查询,以便术语查询实际工作。 使用match query代替,事情会像魔术一样发挥作用。

因此,当下面的字符串转到Elasticsearch时,它会被标记化(或者更确切地说是分析)并存储

"Green Apple" -> ( "green" , "apple")

这是分析的默认行为。 现在,当您使用术语查询进行搜索时,分析不会发生。 对于Apple这个词来说,它会搜索保留案例的令牌Apple。因此失败了。

对于匹配查询,它会进行分析。这意味着如果您使用Apple进行搜索,它会将其转换为Apple,然后进行搜索。这给了很好的比赛。

您可以详细了解分析here

相关问题