Elasticsearch RESTful API入门:全文搜索实战

Elasticsearch RESTful API入门:全文搜索实战

全文搜索是Elasticsearch的核心能力,本文通过10+个实战示例,手把手教你掌握match、multi_match等全文搜索技术,并实现高亮显示等高级功能。

一、全文搜索核心概念

1. 什么是全文搜索?

  • 在文本内容中搜索语义相关的结果(非精确匹配)
  • 示例:搜索"苹果手机"也能匹配"iPhone 13 Pro"
  • Elasticsearch通过分词+倒排索引实现高性能搜索

2. 全文搜索流程

原始文本 分词器处理 生成倒排索引 搜索关键词 分词处理 索引匹配 相关性排序

二、环境准备

1. 创建书籍索引

bash 复制代码
PUT /books
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "ik_max_word"  # 使用中文分词器
      },
      "author": {"type": "keyword"},
      "content": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "publish_date": {"type": "date"},
      "rating": {"type": "float"}
    }
  }
}

2. 添加测试数据

bash 复制代码
POST /books/_bulk
{"index":{}}
{"title":"深入理解Elasticsearch","author":"张明","content":"本书全面讲解ES核心原理与高级功能","publish_date":"2023-01-15","rating":4.5}
{"index":{}}
{"title":"大数据搜索技术实战","author":"李华","content":"基于ElasticSearch的搜索算法与性能优化","publish_date":"2022-11-20","rating":4.2}
{"index":{}}
{"title":"分布式系统设计","author":"王伟","content":"Elasticsearch作为分布式存储的典型应用","publish_date":"2023-03-08","rating":4.7}

三、基础全文搜索实战

1. match查询 - 基础全文搜索

bash 复制代码
GET /books/_search
{
  "query": {
    "match": {
      "content": "搜索技术"
    }
  }
}
  • 分词效果: "搜索技术" → ["搜索", "技术"]

  • 匹配包含任意分词的文档(OR逻辑)

2. 设置匹配逻辑

bash 复制代码
{
  "query": {
    "match": {
      "content": {
        "query": "分布式存储",
        "operator": "and"  // 必须包含所有分词
      }
    }
  }
}

3. 多字段搜索 - multi_match

bash 复制代码
{
  "query": {
    "multi_match": {
      "query": "性能优化",
      "fields": ["title", "content"]  // 同时搜索两个字段
    }
  }
}

四、高级全文搜索技巧

1. 短语搜索 - match_phrase

bash 复制代码
{
  "query": {
    "match_phrase": {
      "content": {
        "query": "典型应用",
        "slop": 2  // 允许中间间隔2个词
      }
    }
  }
}

2. 模糊搜索 - fuzziness

bash 复制代码
{
  "query": {
    "match": {
      "title": {
        "query": "Elasticsarch",  // 拼写错误
        "fuzziness": "AUTO"       // 自动容错
      }
    }
  }
}

3. 同义词扩展

bash 复制代码
PUT /books/_settings
{
  "analysis": {
    "filter": {
      "my_synonyms": {
        "type": "synonym",
        "synonyms": [
          "es, elasticsearch",
          "大数据 => big data"
        ]
      }
    },
    "analyzer": {
      "my_analyzer": {
        "tokenizer": "ik_max_word",
        "filter": ["my_synonyms"]
      }
    }
  }
}

搜索"es"可匹配"elasticsearch"

五、搜索结果优化

1. 高亮显示

bash 复制代码
{
  "query": {
    "match": {"content": "分布式"}
  },
  "highlight": {
    "fields": {
      "content": {
        "pre_tags": ["<strong>"],
        "post_tags": ["</strong>"]
      }
    }
  }
}

返回结果片段:

bash 复制代码
"highlight": {
  "content": [
    "Elasticsearch作为<strong>分布式</strong>存储的典型应用"
  ]
}

2. 结果排序

bash 复制代码
{
  "query": {...},
  "sort": [
    {
      "_score": {"order": "desc"},  // 按相关性降序
      "rating": {"order": "desc"}   // 再按评分降序
    }
  ]
}

3. 字段权重设置

bash 复制代码
{
  "query": {
    "multi_match": {
      "query": "搜索算法",
      "fields": [
        "title^3",  // title权重为3
        "content"   // content权重默认为1
      ] 
    }
  }
}

六、复杂场景实战

1. 组合搜索 - bool + fulltext

bash 复制代码
{
  "query": {
    "bool": {
      "must": [
        {"match": {"content": "技术"}}
      ],
      "should": [
        {"match_phrase": {"title": "实战"}}
      ],
      "filter": [
        {"range": {"rating": {"gte": 4.0}}}
      ]
    }
  }
}

2. 跨索引搜索

bash 复制代码
GET /books,articles/_search
{
  "query": {
    "multi_match": {
      "query": "分布式系统",
      "fields": ["title", "content"]
    }
  }
}

3. 搜索建议 - suggest

bash 复制代码
{
  "suggest": {
    "title_suggest": {
      "text": "elastc",
      "term": {
        "field": "title",
        "suggest_mode": "always"
      }
    }
  }
}

七、性能优化指南

1. 避免全字段搜索

bash 复制代码
// 不推荐
{"match": {"_all": "搜索技术"}}

// 推荐:明确指定字段
{"match": {"content": "搜索技术"}}

2. 合理使用分页

bash 复制代码
// 深度分页性能差
{"from": 10000, "size": 10}

// 替代方案:search_after
{
  "size": 10,
  "sort": [{"_score": "desc"}, {"title.keyword": "asc"}],
  "search_after": [0.8, "深入理解Elasticsearch"]
}

3. 索引优化建议

bash 复制代码
PUT /books/_settings
{
  "index": {
    "refresh_interval": "30s",  // 降低刷新频率
    "number_of_replicas": 1
  }
}

八、调试技巧

1. 分析查询语句

bash 复制代码
GET /books/_validate/query?explain
{
  "query": {
    "match": {"title": "搜素引型"}
  }
}

2. 分词测试

bash 复制代码
GET /books/_analyze
{
  "field": "content",
  "text": "Elasticsearch搜索性能优化"
}

九、常见问题排查

问题现象 可能原因 解决方案
搜索无结果 分词器不匹配 检查mapping和analyzer设置
搜索结果不相关 未设置合理权重 使用^提升关键字段权重
高亮显示失效 字段未存储原始内容 确保字段store=true
搜索响应慢 分页过深或索引过大 使用search_after替代from/size

下集预告《Elasticsearch RESTful API入门:全文搜索实战(Java版)》

相关推荐
陈平安安24 分钟前
Maven学习
java·maven
-$_$-31 分钟前
【笔试真题】2024秋招京东后端开发岗位-第一批笔试
java·开发语言
R cddddd36 分钟前
Spring Boot Admin 监控模块笔记-实现全链路追踪
java·笔记·spring cloud
一只鹿鹿鹿1 小时前
【制造】erp和mes系统建设方案(word)
大数据·人工智能·web安全·信息化·软件系统
数琨创享TQMS质量数智化1 小时前
数琨创享:德国高端制造企业QMS质量管理平台案例
大数据·人工智能·制造
唐叔在学习2 小时前
Maven - 并行安全无重复打包构建原理揭秘
java·maven·maven并行构建·maven反应堆原理
山间小僧2 小时前
「查漏补缺」ZGC相关内容整理
java·jvm·后端
bluebonnet272 小时前
【python】转移本地安装的python包
java·python·eureka
lifallen2 小时前
AbstractExecutorService:Java并发核心模板解析
java·开发语言·数据结构·算法
livemetee2 小时前
Flink2.0学习笔记:Stream API 窗口
大数据·数据分析