末尾带有 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) 这是因为标准分析器不索引特殊字符。例如,如果您索引一个字符串 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!
我没有想到的一件事是:
Elasticsearch 默认不会分析通配符查询!
这个意思。默认情况下 它将像这样:
input query | the query that ES will use
----------------------------------------
foo | foo
foo. | foo
foo* | foo*
foo.* | foo.*
如你所见,如果输入查询中包含通配符,ES 不会删除任何字符。当不使用通配符时,ES 将采用查询和 运行 分析器,这(即当使用默认分析器时)将删除所有点。
要"fix"这个,你可以
从查询字符串中手动删除所有点。或者
使用analyze_wildcard=true
(即http://127.0.0.1:9200/test/streets?q=+foostr.*&analyze_wildcard=true
)。以下是对所发生情况的解释:https://github.com/elastic/elasticsearch/issues/787
我有一个包含很多街道的索引。索引如下所示:
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) 这是因为标准分析器不索引特殊字符。例如,如果您索引一个字符串 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!
我没有想到的一件事是:
Elasticsearch 默认不会分析通配符查询!
这个意思。默认情况下 它将像这样:
input query | the query that ES will use
----------------------------------------
foo | foo
foo. | foo
foo* | foo*
foo.* | foo.*
如你所见,如果输入查询中包含通配符,ES 不会删除任何字符。当不使用通配符时,ES 将采用查询和 运行 分析器,这(即当使用默认分析器时)将删除所有点。
要"fix"这个,你可以
从查询字符串中手动删除所有点。或者
使用
analyze_wildcard=true
(即http://127.0.0.1:9200/test/streets?q=+foostr.*&analyze_wildcard=true
)。以下是对所发生情况的解释:https://github.com/elastic/elasticsearch/issues/787