Elasticsearch含连字符文档的match_phrase与wildcard查询失效问题
问题:禁用模糊搜索时含连字符字段的匹配异常
需求场景
用户在前端禁用模糊搜索后,后端需执行字面匹配逻辑,匹配name或description字段中包含查询词的文档。
初始实现(match_phrase)
后端执行的查询逻辑代码:
$query['query']['bool']['must'][] = [ 'bool' => [ 'should' => [ ['match_phrase' => ['name' => $param]], ['match_phrase' => ['description' => $param]], ], 'minimum_should_match' => 1, ], ];
针对name字段为Evo-Singularity的目标文档,测试结果如下:
evo:匹配成功evo-:匹配成功evo-sing:无匹配结果singularity:匹配成功
改用wildcard查询的问题
为解决上述部分查询无结果的问题,尝试改用wildcard查询:
$param = '*'.$param.'*'; // 无模糊搜索 - 执行字面匹配 $query['query']['bool']['must'][] = [ 'wildcard' => [ 'name' => $param ], 'wildcard' => [ 'description' => $param ], ];
测试结果仍存在异常:
evo:匹配成功evo-:无匹配结果evo-sing:无匹配结果singularity:无匹配结果
控制台测试验证
可正常匹配的查询
使用match查询能成功匹配目标文档:
{ "query": { "match": { "name": "evo-singularity" } } }
无结果的wildcard查询
以下两种wildcard查询均无法匹配目标文档:
{ "query": { "wildcard": { "name": { "value": "*evo\\-singularity*", "boost": 1.0, "rewrite": "constant_score" } } } }
{ "query": { "wildcard": { "name": { "value": "*evo*singularity*", "boost": 1.0, "rewrite": "constant_score" } } } }
仅能匹配的wildcard查询
仅当查询词为*singularity*时,wildcard查询可匹配目标文档:
{ "query": { "wildcard": { "name": { "value": "*singularity*", "boost": 1.0, "rewrite": "constant_score" } } } }
目标文档示例
"_source": { "type": "Trap Card", "description": "Target 1 \"Evoltile\" monster and 1 \"Evolsaur\" monster in your Graveyard; Special Summon 1 \"Evolzar\" Xyz Monster from your Extra Deck, and if you do, attach those monsters to it as Xyz Materials.", "name": "Evo-Singularity", },
异常规律总结
含「空格-空格」格式的文档(如vanquish soul - kaiser)搜索正常,但连字符无空格包围的文档(如Evo-Singularity)在禁用模糊搜索时匹配异常。当前索引的分析器及映射配置已明确,需解决连字符字段的字面匹配问题。
内容的提问来源于stack exchange,提问作者GenesisBits
相关产品推荐
相关产品推荐

