我的ElasticSearch语言分析器有问题。我正在研究立陶宛语,所以我使用立陶宛语语言分析器。分析器工作正常,我得到了我需要的所有单词案例。例如,我索引立陶宛城市“Klaipėda”:
show()
问题是我还需要得到一个结果,当我在拉丁字母(“克莱佩达”)和所有立陶宛案例中搜索“Klaipėda”时:
“Klaipėda”,“Klaipėdos”,“Klaipėdoje” - 作品,但“Klaipeda”,“Klaipedos”,“Klaipedoje” - 不是。
我的索引:
PUT /cities/city/1
{
"name": "Klaipėda"
}
和搜索查询:
PUT /cities
{
"mappings": {
"city": {
"properties": {
"name": {
"type": "string",
"analyzer": "lithuanian",
"fields": {
"folded": {
"type": "string",
"analyzer": "md_folded_analyzer"
}
}
}
}
}
},
"settings": {
"analysis": {
"analyzer": {
"md_folded_analyzer": {
"type": "lithuanian",
"tokenizer": "standard",
"filter": [
"lowercase",
"asciifolding",
"lithuanian_stop",
"lithuanian_keywords",
"lithuanian_stemmer"
]
}
}
}
}
}
我做错了什么?谢谢你的帮助。
答案 0 :(得分:1)
您在这里使用的技术是所谓的multi-fields。基础name.folded
字段的限制是您无法对其执行搜索 - 您只能按name.folded
和聚合执行排序。
为了解决这个问题,我想出了以下设置:
单独设置字段(以消除重复项 - 只需指定copy_to
):
curl -XPUT http://localhost:9200/cities -d '
{
"mappings": {
"city": {
"properties": {
"name": {
"type": "string",
"analyzer": "lithuanian",
"copy_to": "folded",
},
"folded": {
"type": "string",
"analyzer": "md_folded_analyzer"
}
}
}
}
}'
如同here所述,将分析器的类型更改为custom
,否则asciifolding
不会进入配置。更重要的是 - asciifolding
应该用立陶宛语中的所有词干/停止词语,因为折叠后的词语可能会错过理想的感觉。
curl -XPUT http://localhost:9200/my_cities -d '
{
"settings": {
"analysis": {
"filter": {
"lithuanian_stop": {
"type": "stop",
"stopwords": "_lithuanian_"
},
"lithuanian_stemmer": {
"type": "stemmer",
"language": "lithuanian"
}
},
"analyzer": {
"md_folded_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"lithuanian_stop",
"lithuanian_stemmer",
"asciifolding"
]
}
}
}
}
}
抱歉,我已经取消lithuanian_keywords
- 它需要额外的设置,我在这里错过了。但我希望你有这个想法。