我的 elasticsearch 文档有一个字段Name
,其中包含如下条目:
Samsung Galaxy S3
Samsung Galaxy Ace Duos 3
Samsung Galaxy Duos 3
Samsung Galaxy S2
Samsung Galaxy S (I9000)
使用以下查询查询此字段时(请注意"s"和"3"之间的空格):
{
"query": {
"match": {
"Name": {
"query": "galaxy s 3",
"fuzziness": 2,
"prefix_length": 1
}
}
}
}
它返回"Samsung Galaxy Duos 3"
作为相关结果,而不是"Samsung Galaxy S3"
。
我注意到此类任务的模式是忽略任何数字和任何单个字母字符之间的空格,并进行查询。例如,"I-phone 5s"
也应该由 "I-phone 5 s"
返回。
有没有很好的方法来实现这一点?
您需要更改分析器以在从文本更改为数字时分解字符串 - 使用正则表达式会有所帮助(这是基于驼峰分析器):
curl -XPUT 'localhost:9200/myindex/' -d '
{
"settings":{
"analysis": {
"analyzer": {
"mynewanalyser":{
"type": "pattern",
"pattern":"([^\p{L}\d]+)|(?<=\D)(?=\d)|(?<=\d)(?=\D)"
}
}
}
}
}'
使用您的字符串测试新分析仪:
-XGET 'localhost:9200/myindex/_analyze?analyzer=mynewanalyser&pretty' -d 'Samsung Galaxy S3'
{
"tokens" : [ {
"token" : "samsung",
"start_offset" : 0,
"end_offset" : 7,
"type" : "word",
"position" : 1
}, {
"token" : "galaxy",
"start_offset" : 8,
"end_offset" : 14,
"type" : "word",
"position" : 2
}, {
"token" : "s",
"start_offset" : 15,
"end_offset" : 16,
"type" : "word",
"position" : 3
}, {
"token" : "3",
"start_offset" : 16,
"end_offset" : 17,
"type" : "word",
"position" : 4
} ]
}