0

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

Mainstreet 42
Some other street 15
Foostr. 9

默认搜索查询如下所示:

+QUERY_STRING*

因此查询foo(sent as +foo*) 或foostr(sent as +foostr*) 会得到Foostr. 9,这是正确的。但是查询foostr.(发送到 Elasticsearch 作为+foostr.*)没有结果,但为什么呢?

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

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

问题:

  1. 为什么会这样?

  2. 如何避免这种行为?

4

2 回答 2

4

我没有想到的一件事是:

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

这表示。默认情况下,它将像这样运行:

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

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

要“解决”这个问题,您可以

于 2015-03-17T16:28:20.197 回答
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"}
        }
    }
}
' 

您可以参考以获取更多信息。

于 2015-03-16T17:54:38.703 回答