我创建了一个带有建议字段和完成类型的简单索引。我索引了一些城市名称。对于建议字段,我使用德国分析仪。
PUT city_de
{
"mappings": {
"city" : {
"properties": {
"name" : {
"type": "text",
"analyzer": "german"
},
"suggest" : {
"type": "completion",
"analyzer": "german"
}
}
}
}
}
分析仪工作正常,使用变音符号搜索效果很好。自动完成也是完美的。但是我通过搜索wie
这个词来面对一个问题。
假设我有两个文档Wiesbaden
和Wien
,其名称与建议完成期限相同。
如果我搜索wie
,我认为城市Wien
和Wiesbaden
都在回复中。但不幸的是,我没有得到回应。我认为由于德国分析仪,wie
有限制。因为如果我搜索wi
或wies
,我会收到有效回复。
同样适用于术语was
,er
,sie
,und
,它们看起来像德语中的词汇。
如果我搜索wie
或was
,是否需要任何其他配置才能获得结果?
谢谢!
答案 0 :(得分:2)
按前缀
搜索城市名称"魏"应该找到" Wien"或"威斯巴登"
对于用例,我建议使用edge n-gram
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html和ASCII folding
条https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-asciifolding-tokenfilter.html。
实施例
wien
token position start offset end offset
w 0 0 1
wi 1 0 2
wie 2 0 3
wien 3 0 4
wiesbaden
token position start offset end offset
w 0 0 1
wi 1 0 2
wie 2 0 3
wies 3 0 4
...
wiesbaden 8 0 9
请记住,系统现在必须以非对称方式工作。不应该分析查询(使用关键字),但必须分析索引中的数据。
有两种方法可以实现这一目标: 1.)添加查询分析器以使用查询 2.)将查询分析器绑定到字段
"cities": {
"type": "text",
"fields": {
"autocomplete": {
"type": "text",
"analyzer": "autocomplete_analyzer", <-- index time analyzer
"search_analyzer": "autocomplete_search" <-- search time analyzer
}
}
}
该分析仪专为德语文本设计,使用简单的算法去除弯曲和形态。 https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html#german-analyzer 以下是此标记生成器生成的典型术语的示例
Hallo hier ist der Text über Wiesbaden und Wien. Es scheint angebracht über Wände und Wandern zu sprechen.
hallo 0 0 5
text 4 19 23
wiesbad 6 29 38
wien 8 43 47
scheint 10 52 59
angebracht 11 60 70
wand 13 76 81
wandern 15 86 93
sprech
如果它适用于城市名称,这只是巧合。