弹性搜索同义词匹配涉及数字字符

时间:2015-05-28 03:19:32

标签: search elasticsearch lucene

我在弹性集群中索引的文档具有以下映射。基本上我有一个名为模型的字段,其中包含“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”

1 个答案:

答案 0 :(得分:0)

好的,这是你的问题:

  • 您尝试定义一个尝试将“2500 HD”合并为“2500HD”进行搜索的过滤器
  • 但分析仪的工作原理如下:

    • 首先执行char_filter(如果有的话)
    • 首先执行标记器,定义为standard,因此“2500 HD”将分为两个术语2500HD
    • 之后执行过滤器,将术语转换为2500hd。您的过滤器synonyms将被忽略,因为它们都不匹配传递的过滤器。

因此,当您查询“2500 HD”时,实际上是在搜索2500hd。由于索引条款为2500hd,所以没有任何文档匹配。

我希望您将synonyms替换为word_delimiter过滤器,如下所示:

"filter":{
        "my_delimiter":{
                "type":"word_delimiter",
                "preserve_original": true
        }
 }

它会将您的文档2500HD转换为2500hd2500hd。因此它将匹配查询“2500 HD”,它将转换为2500hd。请参阅文档链接以了解更多选项。

您不需要像这样定义同义词过滤器。如果您确实希望像当前​​定义一样进行转换,请定义另一个标记生成器,而不是使用standard标记生成器。

P / S:你可以安装inquisitor插件来查看如何分析术语:https://github.com/polyfractal/elasticsearch-inquisitor