Elasticsearch查询字符串末尾带有点/点,即+ foo。*

时间:2015-03-16 17:35:58

标签: elasticsearch spring-data-elasticsearch

我有一个包含很多街道的索引。索引如下所示:

Mainstreet 42
Some other street 15
Foostr. 9

默认搜索查询如下所示:

+QUERY_STRING*

因此,查询foo(发送为+foo*)或foostr(发送为+foostr*)会产生Foostr. 9,这是正确的。 但是查询foostr.(将+foostr.*发送给Elasticsearch)没有结果,但为什么?

我使用标准分析器和查询字符串,没有特殊选项。 (使用http://127.0.0.1:9200/test/streets?q=+foostr.*时,这也会返回0结果。)

顺便说一下。这个:http://127.0.0.1:9200/test/streets?q=+foostr.(与上面没有星号相同)找到正确的结果

问题:

  1. 为什么会这样?

  2. 如何避免这种行为?

2 个答案:

答案 0 :(得分:1)

我没想到的一件事是:

默认情况下,Elasticsearch 分析通配符查询!

这意味着。通过默认,它的行为如下:

input query | the query that ES will use
----------------------------------------
foo         | foo
foo.        | foo
foo*        | foo*
foo.*       | foo.*

如您所见,如果输入查询包含通配符,则ES不会删除任何字符。当不使用通配符时,ES将接受查询并运行分析器(即使用默认分析器时)将删除所有点。

要“修复”此问题,您可以

答案 1 :(得分:0)

1)这是因为标准分析器不会索引特殊字符。例如,如果索引字符串Yoo! My name is Karthik.,elasticsearch会将其分解为(yoo, my, name, is, karthik)而没有特殊字符(在许多简单情况下实际上很有意义)和小写字母。因此,当您搜索foostr.时,没有结果..因为它被编入索引foostr(没有"。")。

2)您可以在索引时根据您的要求为不同的字段使用不同类型的分析器(或者您也可以使用no_analyser)。

实施例: -

$ curl -XPUT 'http://localhost:9200/bookstore/book/_mapping' -d '
{
    "book" : {
        "properties" : {
            "title" : {"type" : "string", "analyzer" : "simple"},
            "description" : {"type" : "string", "index" : "not_analyzed"}
        }
    }
}
' 

您可以参考thisthis了解详情。

HTH!