末尾带有 Dot/Point 的 Elasticsearch 查询字符串,即 +foo.*

Elasticsearch Query String with Dot/Point at the end, i.e. +foo.*

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

Mainstreet 42
Some other street 15
Foostr. 9

默认搜索查询如下所示:

+QUERY_STRING*

因此查询 foo(发送为 +foo*)或 foostr(发送为 +foostr*)结果为 Foostr. 9,这是正确的。 BUT 查询 foostr.(它作为 +foostr.* 发送到 Elasticsearch)没有给出结果,但是为什么?

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

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

问题:

  1. 为什么会这样?

  2. 如何避免这种行为?

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"}
        }
    }
}
' 

您可以参考this and this了解更多信息。

HTH!

我没有想到的一件事是:

Elasticsearch 默认不会分析通配符查询!

这个意思。默认情况下 它将像这样:

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

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

要"fix"这个,你可以