如何让Elasticsearch按标题至少2词或75%词匹配返回重复结果
Elasticsearch 艺术品标题多词匹配实现方案
前置说明
你提出的匹配规则(标题有效词数大于2时,需满足至少2个词匹配,或匹配词占比不低于75%,可以通过Elasticsearch原生能力实现,无需额外二次开发。
第一步:配置索引分词规则
首先确保你的索引配置了带停用词过滤的自定义分词器,提前移除the/of/a等无意义停用词,避免干扰有效词数统计错误,配置示例如下:
{ "settings": { "analysis": { "analyzer": { "art_title_analyzer": { "tokenizer": "standard", "filter": ["lowercase", "art_stop_filter"] } }, "filter": { "art_stop_filter": { "type": "stop", "stopwords": ["the", "of", "a", "an"] } } } }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "art_title_analyzer" } } } }
第二步:使用minimum_should_match参数控制匹配阈值
Elasticsearch的minimum_should_match参数可以直接满足你的规则要求,你只需要在查询时设置该参数为2<75%即可,该值的含义是:
- 当查询解析出的有效词数量≤2时,要求所有词都匹配
- 当有效词数量>2时,至少匹配75%的有效词,自动覆盖「至少2个词匹配」的要求
查询示例(同时保留你需要的模糊匹配能力):
{ "query": { "match": { "title": { "query": "The Portrait of Dorian Gray", "fuzziness": "AUTO", "minimum_should_match": "2<75%" } } } }
效果验证
原标题The Portrait of Dorian Gray过滤停用词后有效词为portrait、dorian、gray共3个:
- 匹配
The Portrait of a Lady:仅匹配1个有效词,未达阈值,不会被召回 - 匹配
The Portrait of Dorian G.:匹配2个有效词,满足阈值,正常召回 - 匹配
The Portrait of Dorian Gray made in 1890:匹配3个有效词,满足阈值,正常召回
可选优化
如果需要进一步降低模糊匹配的误召回概率,可以调整fuzziness参数,比如设置为1,限制最多允许1个字符的拼写错误,避免短词模糊匹配带来的无关结果。
内容的提问来源于stack exchange,提问作者Robin Groenevelt
相关产品推荐
相关产品推荐

