使用完整的建议器和德语分析器进行搜索
Search with complete suggester and german analyzer
我创建了一个带有建议字段和完成类型的简单索引。我索引了一些城市名称。对于建议字段,我使用德国分析仪。
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
,是否需要任何其他配置才能获得结果?
谢谢!
问题
正在按前缀搜索城市名称
"wie" 应该找到 "Wien" 或 "Wiesbaden"
可能的解决方法
对于用例,我建议使用 edge n-gram
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html and ASCII folding
the terms 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
如果它适用于城市名称,这纯属巧合。
我创建了一个带有建议字段和完成类型的简单索引。我索引了一些城市名称。对于建议字段,我使用德国分析仪。
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
,是否需要任何其他配置才能获得结果?
谢谢!
问题
正在按前缀搜索城市名称
"wie" 应该找到 "Wien" 或 "Wiesbaden"
可能的解决方法
对于用例,我建议使用 edge n-gram
https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html and ASCII folding
the terms 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
如果它适用于城市名称,这纯属巧合。