我有一个包含很多街道的索引。索引如下所示:
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.
(与上面没有星号相同)找到正确的结果
为什么会这样?
如何避免这种行为?
答案 0 :(得分:1)
我没想到的一件事是:
默认情况下,Elasticsearch 不分析通配符查询!
这意味着。通过默认,它的行为如下:
input query | the query that ES will use
----------------------------------------
foo | foo
foo. | foo
foo* | foo*
foo.* | foo.*
如您所见,如果输入查询包含通配符,则ES不会删除任何字符。当不使用通配符时,ES将接受查询并运行分析器(即使用默认分析器时)将删除所有点。
要“修复”此问题,您可以
从查询字符串中手动删除所有点。或
使用analyze_wildcard=true
(即http://127.0.0.1:9200/test/streets?q=+foostr.*&analyze_wildcard=true
)。以下是对所发生情况的解释:https://github.com/elastic/elasticsearch/issues/787
答案 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"}
}
}
}
'
HTH!