354 字
2 分钟
关于ES查询遇到的坑
2025-05-21

1. ES中关于text类型的字段的精确(term)匹配#

索引中的某个字段的类型为text,并且使用了分词,那么想要进行term 匹配查询的时候,要使用.keyword子字段(前提是开启了多字段映射)

如果你知道该字段在mapping中启用了fields.keyword

{
"term":{"name.keyword":"zhangsan"}
}

✅ 使用term前的Checklist:#

  • 你是否理解这个字段是text还是keyword
  • 如果是text,你是否想要的是“完整的字符串一致性”?
  • 你是否可以用.keyword字段替代?
  • 你是否需要token级别的精确查找(如某个词出现与否)?

2. ES组合查询的嵌套问题#

Elasticsearch组合查询基础:bool语义树#

在ES中,组合查询最核心的语义结构是 bool

json复制编辑{
"bool": {
"must": [...], // 类似 SQL 中的 AND
"should": [...], // 类似 SQL 中的 OR
"must_not": [...], // 类似 SQL 中的 NOT
"filter": [...] // 类似 must,但不影响打分
}
}

每个字段都可以嵌套任意的bool,从而构建出“语法树”般的复杂查询结构:

json复制编辑{
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" }},
{
"bool": {
"should": [
{ "match": { "author": "Peanut" }},
{ "match": { "author": "GPT" }}
],
"must_not": [
{ "term": { "status": "draft" }}
]
}
}
]
}
}

在这套系统中,查询的嵌套只是逻辑上的,不会自动处理文档结构的嵌套问题。

关于ES查询遇到的坑
https://fuwari.vercel.app/posts/关于es遇到的坑/
作者
Lorem Ipsum
发布于
2025-05-21
许可协议
CC BY-NC-SA 4.0