我创建了一个带有建议字段和完成类型的简单索引。我索引了一些城市名称。对于建议字段,我使用德国分析仪。
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
,是否还需要任何其他配置来获得结果?
谢谢!
按前缀搜索城市名称
“怎么样”应该找到“维也纳”或“威斯巴登”
对于用例,我建议使用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
如果它适用于城市名称,这只是巧合。