Skip to content

进阶查询与高亮

短语匹配(Match Phrase)

match_phrase 要求查询词在字段中按顺序、相邻出现,适合“完整短语”的检索。

http
GET /my_index/_search
{
  "query": {
    "match_phrase": {
      "title": "Elasticsearch 入门"
    }
  }
}

只有标题中按顺序出现 “Elasticsearch” 和 “入门” 且相邻(或间隔不大)的文档才会命中。

slop:允许间隔

slop 表示允许词与词之间最多“隔几个词”仍算匹配:

http
GET /my_index/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query": "入门 Elasticsearch",
        "slop": 2
      }
    }
  }
}

slop 越大,越宽松,可能召回更多结果。


前缀、通配符与正则

  • prefix:前缀匹配,不分词,适合 keyword。注意:前缀过长或基数大时可能较慢。
http
{ "query": { "prefix": { "author": "张" } } }
  • wildcard:通配符,* 表示任意字符,? 表示单个字符。同样建议用于 keyword,且避免前缀通配(如 *keyword)。
http
{ "query": { "wildcard": { "code": "A*1" } } }
  • regexp:正则匹配,灵活但性能成本高,慎用在大字段或大索引上。

模糊查询(Fuzzy)

fuzzy 可容忍一定拼写错误,通过编辑距离(Levenshtein)匹配:

http
GET /my_index/_search
{
  "query": {
    "fuzzy": {
      "title": {
        "value": "Elasticserch",
        "fuzziness": "AUTO"
      }
    }
  }
}

fuzziness 可为 012AUTO(根据词长自动选 0/1/2)。适合短词纠错,长词或中文需结合分词与场景评估。


高亮(Highlight)

在返回结果中把匹配到的词用标签包起来,便于前端展示“高亮片段”。

基本用法

在请求中加 highlight,指定要对哪些字段做高亮,以及可选标签:

http
GET /my_index/_search
{
  "query": {
    "match": { "title": "Elasticsearch" }
  },
  "highlight": {
    "fields": {
      "title": {},
      "content": { "fragment_size": 150, "number_of_fragments": 3 }
    },
    "pre_tags": ["<em>"],
    "post_tags": ["</em>"]
  }
}
  • fields:键为字段名,值为配置对象。空对象 {} 表示用默认设置。
  • fragment_size:每个高亮片段的大致字符数。
  • number_of_fragments:最多返回几个片段;为 0 表示返回整段。
  • pre_tags / post_tags:高亮前后标签,默认是 <em></em>

返回里每条 hit 会多一个 highlight 对象,键为字段名,值为带标签的片段数组。

高亮依赖该字段的分词结果,因此对 text 字段才有意义;对 keyword 通常要匹配整段才会高亮。


搜索建议(Suggesters)简介

Suggesters 用于补全、纠错、联想等,常见三种:

类型用途
Term Suggest基于编辑距离做词级纠错建议
Phrase Suggest整句纠错,考虑上下文
Completion Suggest前缀补全,常用于搜索框联想,需使用 completion 类型字段

使用方式都是在请求里加 suggest 节点,指定文本和 suggestion 类型。Completion 需要事先用 completion 类型建索引并写入建议词。详细语法见 官方文档