我正在使用elasticsearch短语前缀查询进行一些自动填充。 它通常效果很好,但有时候不再找到一个不完整的单词,尽管只有一个或多一个字母就能找到它。
例如:它确实找到包含“Anomalie”的查询“Anomal”和查询“Anomalie”,但找不到“Anomali”。这对于用户体验来说真的很奇怪!
我以前的谷歌搜索让我尝试禁用停用词,但它并没有解决我的问题。我尝试在分析仪中使用stopwords配置并作为过滤器。
重现:
索引创建,配置和添加文档:
curl -XPUT 'http://localhost:9200/elastictests/' -d '{
"settings" : {
"index" : {
"analysis" : {
"filter" : {
"french_stemmer" : {
"type" : "stemmer",
"name" : "light_french"
},
"no_stop" : {
"type" : "stop",
"stopwords" : "_none_"
}
},
"analyzer" : {
"default" : {
"type" : "custom",
"stopwords" : "_none_",
"filter" : [ "standard", "lowercase", "asciifolding", "word_delimiter", "french_stemmer", "no_stop" ],
"tokenizer" : "standard"
}
}
}
}
}
}'
curl -XPUT 'http://localhost:9200/elastictests/test/1' -d '{
"title": "Anomalie"
}'
这些查询找到文档:
curl -XGET 'http://localhost:9200/elastictests/_search?pretty=1' -d '
{
"query" : {
"match" : {
"title" : "Anomalie"
}
}
}
}
'
curl -XGET 'http://localhost:9200/elastictests/_search?pretty=1' -d '
{
"query" : {
"match" : {
"title" : {
"query": "Anomalie",
"type": "phrase_prefix"
}
}
}
}
'
curl -XGET 'http://localhost:9200/elastictests/_search?pretty=1' -d '
{
"query" : {
"match" : {
"title" : {
"query": "Anomal",
"type": "phrase_prefix"
}
}
}
}
'
但是这个没有找到任何文件且没有错误:
curl -XGET 'http://localhost:9200/elastictests/_search?pretty=1' -d '
{
"query" : {
"match" : {
"title" : {
"query": "Anomali",
"type": "phrase_prefix"
}
}
}
}
'
知道为什么吗?
答案 0 :(得分:0)
这是因为french_stemmer梗 Anomalie => anomal
但是 anomali 不会被 anomal 所阻止。
Anomalie的索引术语 => anomal
同样,当查询字词为 Anomalie 时,搜索字词会被分析为 anomal ,并且它与标题匹配。
然而,当查询是“Anomali”时,它会被分析为“anomali”,而不会出现词干。由于索引术语是“异常”,因此没有匹配前缀或其他。
如果从OP中描述的自定义分析器中删除干扰器,您应该获得此特定用例所需的结果
示例:
get elastictests/_analyze?field=title&text=Anomalie
{
"tokens": [
{
"token": "**anomal**",
"start_offset": 0,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 1
}
]
}
get elastictests/_analyze?field=title&text=Anomali
{
"tokens": [
{
"token": "**anomali**",
"start_offset": 0,
"end_offset": 7,
"type": "<ALPHANUM>",
"position": 1
}
]