ElasticSearch 全文搜索怎么玩?

原创
2020/12/03 10:36
阅读数 4.6K

松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程


最近一两周,松哥会一直和大家分享 Es 中的搜索、聚合分析等查询相关的内容。前面我们简单说了下搜索入门,今天我们就来看看 Es 中的全文查询。

本文是ElasticSearch 系列第 19 篇,和大家聊一聊索引的基本操作,前 18 篇传送门:

  1. 打算出一个 ElasticSearch 教程,谁赞成,谁反对?
  2. ElasticSearch 从安装开始
  3. ElasticSearch 第三弹,核心概念介绍
  4. ElasticSearch 中的中文分词器该怎么玩?
  5. ElasticSearch 索引基本操作
  6. ElasticSearch 文档的添加、获取以及更新
  7. ElasticSearch 文档的删除和批量操作
  8. ElasticSearch 文档路由,你的数据到底存在哪一个分片上?
  9. ElasticSearch 并发的处理方式:锁和版本控制
  10. ElasticSearch 中的倒排索引到底是什么?
  11. ElasticSearch 动态映射与静态映射
  12. ElasticSearch 四种字段类型详解
  13. ElasticSearch 中的地理类型和特殊类型
  14. ElasticSearch 23 种映射参数详解
  15. ElasticSearch 如何配置某个字段的权重?
  16. ElasticSearch 23 种映射参数详解【3】
  17. ElasticSearch 映射模版
  18. ElasticSearch 搜索入门

全文查询:

如果大家觉得视频风格还能接受,也可以看看松哥的付费视频:Spring Boot+Vue+微人事视频教程

以下是视频笔记:

注意,笔记只是视频内容的一个简要记录,因此笔记内容比较简单,完整的内容可以查看视频。

15.ElasticSearch 全文查询

15.1 match query

match query 会对查询语句进行分词,分词后,如果查询语句中的任何一个词项被匹配,则文档就会被索引到。

GET books/_search
{
  "query": {
    "match": {
      "name""美术计算机"
    }
  }
}

这个查询首先会对 美术计算机 进行分词,分词之后,再去查询,只要文档中包含一个分词结果,就回返回文档。换句话说,默认词项之间是 OR 的关系,如果想要修改,也可以改为 AND。

GET books/_search
{
  "query": {
    "match": {
      "name": {
        "query""美术计算机",
        "operator""and"
      }
    }
  }
}

此时就回要求文档中必须同时包含 美术计算机 两个词。

15.2 match_phrase query

match_phrase query 也会对查询的关键字进行分词,但是它分词后有两个特点:

  • 分词后的词项顺序必须和文档中词项的顺序一致
  • 所有的词都必须出现在文档中

示例如下:

GET books/_search
{
  "query": {
    "match_phrase": {
        "name": {
          "query""十一五计算机",
          "slop": 7
        }
    }
  }
}

query 是查询的关键字,会被分词器进行分解,分解之后去倒排索引中进行匹配。

slop 是指关键字之间的最小距离,但是注意不是关键之间间隔的字数。文档中的字段被分词器解析之后,解析出来的词项都包含一个 position 字段表示词项的位置,查询短语分词之后 的 position 之间的间隔要满足 slop 的要求。

15.3 match_phrase_prefix query

这个类似于 match_phrase query,只不过这里多了一个通配符,match_phrase_prefix 支持最后一个词项的前缀匹配,但是由于这种匹配方式效率较低,因此大家作为了解即可。

GET books/_search
{
  "query": {
    "match_phrase_prefix": {
      "name""计"
    }
  }
}

这个查询过程,会自动进行单词匹配,会自动查找以开始的单词,默认是 50 个,可以自己控制:

GET books/_search
{
  "query": {
    "match_phrase_prefix": {
      "name": {
        "query""计",
        "max_expansions": 3
      }
    }
  }
}

match_phrase_prefix 是针对分片级别的查询,假设 max_expansions 为 1,可能返回多个文档,但是只有一个词,这是我们预期的结果。有的时候实际返回结果和我们预期结果并不一致,原因在于这个查询是分片级别的,不同的分片确实只返回了一个词,但是结果可能来自不同的分片,所以最终会看到多个词。

15.4 multi_match query

match 查询的升级版,可以指定多个查询域:

GET books/_search
{
  "query": {
    "multi_match": {
      "query""java",
      "fields": ["name","info"]
    }
  }
}

这种查询方式还可以指定字段的权重:

GET books/_search
{
  "query": {
    "multi_match": {
      "query""阳光",
      "fields": ["name^4","info"]
    }
  }
}

这个表示关键字出现在 name 中的权重是出现在 info 中权重的 4 倍。

15.5 query_string query

query_string 是一种紧密结合 Lucene 的查询方式,在一个查询语句中可以用到 Lucene 的一些查询语法:

GET books/_search
{
  "query": {
    "query_string": {
      "default_field""name",
      "query""(十一五) AND (计算机)"
    }
  }
}

15.6 simple_query_string

这个是 query_string 的升级,可以直接使用 +、|、- 代替 AND、OR、NOT 等。

GET books/_search
{
  "query": {
    "simple_query_string": {
      "fields": ["name"],
      "query""(十一五) + (计算机)"
    }
  }
}

查询结果和 query_string。




往期推荐
0 1

50+ 需求文档免费下载!

0 2

Spring Security 教程合集

0 3

接了两个私活,都是血汗钱


本文分享自微信公众号 - 江南一点雨(a_javaboy)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
7 收藏
1
分享
返回顶部
顶部