我正在开发基于ElasticSearch的自动完成搜索微服务。目的是防止重复输入。因此,服务应该抵制拼写错误和拼写错误,这是我想用edge-nGram过滤器实现的。到目前为止它的工作效果非常好而且效率很高 现在,下一个任务是识别同义词。我配置了同义词过滤器,这也很好。
但我想把这两者结合起来。该服务应首先找到拼写错误,然后找到更正形式的同义词。 示例:用户输入德语单词“Prufung”(正确拼写为“Prüfung”,表示英语考试)。现在我的服务将所有文件与“Prüfung”匹配,但它也应该匹配所有文件与“Prüfung”的同义词,更正(在文件中找到的单词)形式,例如“test”或“Klassenarbeit”以及dict中所有其他已定义的同义词。
是否可以按上述方式连接两个分析仪?目前,两者都在使用multi_match和字段,但不是“一起工作”。
感谢您的帮助。
编辑: 这是我的(测试)索引:
PUT /my_index
{
"settings": {
"analysis": {
"filter": {
"my_synonym_filter": {
"type": "synonym",
"synonyms_path": "synonyms/german_synonyms.txt"
},
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 15
}
},
"analyzer": {
"my_synonyms": {
"tokenizer": "standard",
"filter": [
"lowercase",
"my_synonym_filter"
]
},
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
}
}
使用这些映射:
PUT /my_index/_mapping/test
{
"test": {
"properties": {
"name": {
"type": "text",
"analyzer": "standard",
"fields": {
"ngram": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard",
"boost": 1
},
"synonym": {
"type": "text",
"analyzer": "standard",
"search_analyzer": "my_synonyms",
"boost": 0.5
}
}
}
}
}
}
现在我输入一些数据:
POST /my_index/test
{
"name": "Prüfung"
}
1)用拼写错误搜索:
GET /my_index/test/_search
{
"query": {
"multi_match": {
"query": "Prufung",
"fields": [
"name.ngram",
"name.synonym"],
"fuzziness": "AUTO"
}
}
}
(u而不是ü)结果:
{
"took": 26,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.67509395,
"hits": [
{
"_index": "my_index",
"_type": "test",
"_id": "AVxFrd_M_ZFx6PmfIobY",
"_score": 0.67509395,
"_source": {
"name": "prüfung"
}
}
]
}
}
2)搜索“test”而不是prüfung(同义词)会得到与上面相同的结果。
我想要的是:
搜索tesd(用拼写错误搜索)但它应该与Prüfung(正确的拼写测试的同义词)相匹配。