📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

如果说精确查询(Term Query)是数据库的基础能力,那么**全文搜索(Full Text Search)**才是 INFINI Easysearch 作为搜索引擎的灵魂所在。

与 SQL 中的 LIKE %keyword% 不同,Easysearch 的全文搜索不仅性能更优,还能理解语言的结构。它不只是简单的字符匹配,而是基于倒排索引分词分析的智能检索。本文将带你掌握最核心的两个查询:matchmulti_match,并揭开“分词”对查询结果影响的奥秘。

1. 核心概念:分词(Analysis) #

在学习查询之前,必须先理解 Easysearch 是如何处理文本的。

当你把一句话“Easysearch 是高性能引擎”写入索引时,系统并不会原封不动地存储它。而是通过**分析器(Analyzer)**将其拆解为一个个独立的词项(Tokens),例如:
["easysearch", "是", "高", "性能", "引擎"](假设使用标准中文分词)。

全文搜索的本质,就是拿你输入的查询词,去匹配这些拆解后的词项。

2. 单字段搜索:match 查询 #

match 是 Easysearch 中最标准的全文搜索查询。它不仅会对你搜索的字段进行检索,还会对你的查询输入进行分词

2.1 基本用法 #

假设我们搜索“Easysearch 性能优化”:

GET /blogs/_search
{
  "query": {
    "match": {
      "title": "Easysearch 性能优化"
    }
  }
}

执行流程解析:

  1. 查询分析:Easysearch 首先分析查询字符串 "Easysearch 性能优化",将其拆解为 ["easysearch", "性能", "优化"]
  2. 倒排查找:然后在 title 字段的倒排索引中查找包含任意一个词项的文档。
  3. 评分排序:包含的词项越多、词项越罕见,文档的相关性评分(_score)就越高,排名越靠前。

2.2 控制逻辑:operator #

默认情况下,match 查询采用 OR 逻辑。即只要文档包含“Easysearch”、“性能”、“优化”中的任意一个,就会被搜出来。

如果你希望文档必须同时包含所有词项,需要修改 operator

GET /blogs/_search
{
  "query": {
    "match": {
      "title": {
        "query": "Easysearch 性能优化",
        "operator": "and"
      }
    }
  }
}

3. 多字段搜索:multi_match 查询 #

在实际的应用场景(如电商搜索框、知识库搜索)中,用户输入一个关键词,往往希望同时在“标题”、“内容”、“摘要”等多个字段中查找。这时就需要用到 multi_match

3.1 基本用法 #

GET /blogs/_search
{
  "query": {
    "multi_match": {
      "query": "分布式架构",
      "fields": [
        "title",
        "content",
        "summary"
      ]
    }
  }
}

这相当于对 titlecontentsummary 三个字段分别执行 match 查询,然后汇总结果。

3.2 权重提升(Boosting) #

在多字段搜索中,通常“标题”命中的权重应该高于“正文”。我们可以使用 ^ 符号来提升特定字段的权重:

GET /blogs/_search
{
  "query": {
    "multi_match": {
      "query": "分布式架构",
      "fields": [
        "title^3",
        "content"
      ]
    }
  }
}

在这个例子中,如果关键词出现在 title 中,其产生的评分将是出现在 content 中的 3倍。这将确保标题匹配的文档排在更前面。

4. 深度解析:分词对查询的影响 #

很多新手常遇到这样的问题:“明明文档里有这个词,为什么 match 搜不到?” 或者 “为什么搜出来的结果包含很多不相关的词?”

这通常是字段类型分词器不匹配导致的。

4.1 Text vs Keyword #

Easysearch 中字符串主要有两种类型:

  • Text:会被分词。用于全文检索(如文章正文)。
  • Keyword不分词,作为一个整体存储。用于精确匹配(如 ID、状态码、标签)。

场景一:在 keyword 字段上使用 match

假设字段 statuskeyword 类型,值为 "Active Now"

  • 查询 match: { "status": "Active" } -> 搜不到
  • 原因:因为 keyword 存储的是完整的 "Active Now",而查询试图匹配 "Active",两者不相等。

场景二:在 text 字段上使用标准分词

假设字段 product_nametext 类型(默认 analyzer),值为 "iPhone 15 Pro"

  • 查询 match: { "product_name": "iPhone" } -> 能搜到
  • 查询 match: { "product_name": "iphone" } -> 也能搜到(分词器通常会转小写)。

4.2 中文分词的重要性 #

对于中文内容,Easysearch 默认的分词器(Standard)是按字拆分的(例如“中国”拆成“中”、“国”)。这会导致搜索“南京”时,匹配到“方的京”。

最佳实践
在 Easysearch 中处理中文,务必在 Mapping 中指定中文分词器(如 IK Smart 或 IK Max Word)。

PUT /my_index
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "ik_max_word",
        "search_analyzer": "ik_smart"
      }
    }
  }
}

总结 #

  1. match 是全文搜索的瑞士军刀,它会分析你的查询意图。
  2. multi_match 解决了“搜索框”场景下的多字段检索需求,配合权重(^)使用效果更佳。
  3. 分词是关键:理解字段是 text 还是 keyword,以及使用了什么分词器,是解决“搜不到”或“搜不准”问题的核心钥匙。

掌握了这两个查询,你就已经能够应对 80% 的常规搜索业务需求了。