Elasticsearch中命名为id的字段是否存在特殊规则?
Elasticsearch字段查询问题解答
1. 自定义id字段的特殊属性说明
首先明确两个概念:
- Elasticsearch默认自带系统级元字段
_id,用于唯一标识索引内的文档,该字段由ES内核维护,默认不参与普通检索的分词逻辑。 - 如果你自行在mapping中定义了名为
id的业务字段,该字段本身没有默认的特殊属性,所有行为完全遵循你为它设置的mapping配置。
2. name字段查询无返回的根因
你使用的elastic4s中search("索引").query(字段名, 值)的语法,默认生成的是Term精确查询,该查询逻辑是直接匹配倒排索引中存储的分词后词条,不会对查询值做任何分词处理:
- 你的
id字段存储的是纯数字值101,哪怕配置为text类型,默认的标准分词器处理后倒排索引存储的词条仍为101,和你传入的查询值完全一致,因此可以正常命中。 - 你的
name字段为text类型,默认标准分词器会对写入的文本做小写转换等处理,比如你写入的Chair分词后存储的词条是chair,你用Term查询传入大写开头的Chair时,精确匹配无法命中对应词条,因此无返回结果。
解决方案
- 如果你需要对text类型字段做模糊匹配,改用Match查询即可,elastic4s写法如下:
search("items").query(matchQuery("name", "Chair"))
- 如果你需要对name做精确匹配,建议在mapping中为name增加keyword类型的子字段,查询时直接命中该子字段:
// 对应mapping中name字段配置为text + keyword子字段的场景 search("items").query("name.keyword", "Chair")
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

