如果说精确查询(Term Query)是数据库的基础能力,那么**全文搜索(Full Text Search)**才是 INFINI Easysearch 作为搜索引擎的灵魂所在。
与 SQL 中的 LIKE %keyword% 不同,Easysearch 的全文搜索不仅性能更优,还能理解语言的结构。它不只是简单的字符匹配,而是基于倒排索引和分词分析的智能检索。本文将带你掌握最核心的两个查询:match 和 multi_match,并揭开“分词”对查询结果影响的奥秘。
1. 核心概念:分词(Analysis) #
在学习查询之前,必须先理解 Easysearch 是如何处理文本的。
当你把一句话“Easysearch 是高性能引擎”写入索引时,系统并不会原封不动地存储它。而是通过**分析器(Analyzer)**将其拆解为一个个独立的词项(Tokens),例如:["easysearch", "是", "高", "性能", "引擎"](假设使用标准中文分词)。
全文搜索的本质,就是拿你输入的查询词,去匹配这些拆解后的词项。
2. 单字段搜索:match 查询 #
match 是 Easysearch 中最标准的全文搜索查询。它不仅会对你搜索的字段进行检索,还会对你的查询输入进行分词。
2.1 基本用法 #
假设我们搜索“Easysearch 性能优化”:
GET /blogs/_search
{
"query": {
"match": {
"title": "Easysearch 性能优化"
}
}
}
执行流程解析:
- 查询分析:Easysearch 首先分析查询字符串
"Easysearch 性能优化",将其拆解为["easysearch", "性能", "优化"]。 - 倒排查找:然后在
title字段的倒排索引中查找包含任意一个词项的文档。 - 评分排序:包含的词项越多、词项越罕见,文档的相关性评分(
_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"
]
}
}
}
这相当于对 title、content 和 summary 三个字段分别执行 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
假设字段 status 是 keyword 类型,值为 "Active Now"。
- 查询
match: { "status": "Active" }-> 搜不到。 - 原因:因为
keyword存储的是完整的"Active Now",而查询试图匹配"Active",两者不相等。
场景二:在 text 字段上使用标准分词
假设字段 product_name 是 text 类型(默认 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"
}
}
}
}
总结 #
- match 是全文搜索的瑞士军刀,它会分析你的查询意图。
- multi_match 解决了“搜索框”场景下的多字段检索需求,配合权重(
^)使用效果更佳。 - 分词是关键:理解字段是
text还是keyword,以及使用了什么分词器,是解决“搜不到”或“搜不准”问题的核心钥匙。
掌握了这两个查询,你就已经能够应对 80% 的常规搜索业务需求了。





