Elasticsearch索引如何实现同一字段同时支持精确匹配与全文检索
问题解答
双字段方案正确性判断
你提出的方案是完全正确的,这也是Elasticsearch生产环境中适配多查询场景的常用标准方案:
keyword类型字段不会经过分词处理,存储的是字段的原始完整值,使用term查询时只会返回完全匹配的结果,可以精准筛选出title值完全等于One two的文档,不会返回更长的匹配结果text类型字段会经过分词器处理生成倒排索引,支持match等全文检索查询,满足模糊检索需求
单字段实现方案
可以仅用一个逻辑字段同时满足两项需求,不需要定义两个独立的顶层字段,使用Elasticsearch的**多字段(fields)**特性即可实现:你可以在定义title字段时设置主类型为text,同时添加一个keyword类型的子字段,写入数据时无需额外处理,Elasticsearch会自动为该字段生成两份不同类型的索引,分别适配不同的查询场景。
索引配置示例
PUT /your_index_name { "mappings": { "properties": { "title": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } }
查询使用示例
- 全文检索场景,直接查询主字段即可:
GET /your_index_name/_search { "query": { "match": { "title": "one two" } } }
- 精确匹配场景,查询子字段即可仅返回
title完全等于One two的文档:
GET /your_index_name/_search { "query": { "term": { "title.keyword": "One two" } } }
如果需要精确匹配时忽略大小写,你可以为keyword子字段配置自定义normalizer,将存储和查询的内容统一转为小写即可实现大小写不敏感的精确匹配。
内容的提问来源于stack exchange,提问作者Roman Kamorin
相关产品推荐
相关产品推荐

