Elasticsearch如何实现仅字段与查询全文完全一致时才匹配
解决方案核心逻辑
要实现字段内容与查询串完全一致才匹配,核心是使用Elasticsearch的keyword类型存储目标字段:keyword类型不会对内容做分词处理,会将整个字段值作为单个索引项存储,仅当查询内容与存储的完整索引项完全一致时才会命中。
步骤1:配置索引Mapping
首先给需要精确匹配的字段设置为keyword类型,示例Mapping如下:
PUT /your_target_index { "mappings": { "properties": { // 替换为你需要做精确匹配的字段名 "target_field": { "type": "keyword" // 如果同时需要支持普通全文检索,可以保留text子字段 // "fields": { // "text": { "type": "text" } // } } } } }
如果需要忽略大小写的精确匹配(比如查询hello也能命中值为Hello的文档),可以额外配置normalizer:
PUT /your_target_index { "settings": { "analysis": { "normalizer": { "case_insensitive": { "type": "custom", "filter": ["lowercase"] } } } }, "mappings": { "properties": { "target_field": { "type": "keyword", "normalizer": "case_insensitive" } } } }
步骤2:执行精确匹配查询
使用term查询即可实现完全匹配,示例查询如下:
GET /your_target_index/_search { "query": { "term": { "target_field": "Hello" } } }
该查询只会命中target_field值为**完整的Hello**的文档,值为Hello world的文档不会被匹配,完全符合需求。
特殊场景:无法修改Mapping的临时方案
如果是存量索引无法修改Mapping,可使用脚本查询做精确匹配,注意该方案性能极低,仅适合临时测试,不建议生产环境使用:
GET /your_target_index/_search { "query": { "bool": { "filter": [ { "script": { "script": "doc['target_field.keyword'].value == params.query_str", "params": { "query_str": "Hello" } } } ] } } }
(注:上述脚本中用到的target_field.keyword是Elasticsearch默认给text类型字段加的keyword子字段,如果你手动关闭了默认子字段需要替换为对应字段名)
内容的提问来源于stack exchange,提问作者ayoubben
相关产品推荐
相关产品推荐

