我在弹性集群中索引的文档具有以下映射。基本上我有一个名为模型的字段,其中包含“Silverado 2500HD”,“Silverado 1500HD”,“LX 350”等车型名称等。
POST /location-test-no-boost {
"settings":{
"analysis":{
"analyzer":{
"mysynonym":{
"tokenizer":"standard",
"filter":[
"standard","lowercase","stop","mysynonym"
],
"ignore_case":true
}
},
"filter":{
"mysynonym":{
"type":"synonym",
"synonyms": [
"2500 HD=>2500HD",
"chevy silverado=>Silverado"
]
}
}
}
},
"mappings":{
"vehicles":{
"properties":{
"id":{
"type":"long",
"ignore_malformed":true
},
"model":{
"type":"String",
"index_analyzer": "standard",
"search_analyzer":"mysynonym"
}
}
}
}
}
示例文档内容为
POST /location-test-no-boost/vehicles/10
{
"model" : "Silverado 2500HD"
}
当我尝试使用查询字符串“Chevy sivlerado”进行搜索时,同义词完全匹配Silverado并返回结果,相反,当我尝试通过查询字符串“2500 HD”搜索时,它返回0结果。我尝试了同义词涉及数字的不同组合,发现弹性搜索同义词映射器不支持数字是否正确?
有什么办法可以在用户搜索“2500 HD”时进行一些映射,我可以将查询映射到“2500HD”
答案 0 :(得分:0)
好的,这是你的问题:
但分析仪的工作原理如下:
standard
,因此“2500 HD”将分为两个术语2500
,HD
2500
,hd
。您的过滤器synonyms
将被忽略,因为它们都不匹配传递的过滤器。因此,当您查询“2500 HD”时,实际上是在搜索2500
和hd
。由于索引条款为2500hd
,所以没有任何文档匹配。
我希望您将synonyms
替换为word_delimiter过滤器,如下所示:
"filter":{
"my_delimiter":{
"type":"word_delimiter",
"preserve_original": true
}
}
它会将您的文档2500HD
转换为2500hd
,2500
,hd
。因此它将匹配查询“2500 HD”,它将转换为2500
,hd
。请参阅文档链接以了解更多选项。
您不需要像这样定义同义词过滤器。如果您确实希望像当前定义一样进行转换,请定义另一个标记生成器,而不是使用standard
标记生成器。
P / S:你可以安装inquisitor插件来查看如何分析术语:https://github.com/polyfractal/elasticsearch-inquisitor