ElasticSearch学习笔记八(查询入门)

本学习笔记基于ElasticSearch 7.10版本,旧版本已经废弃的查询功能暂时不做笔记,以后有涉及到再做补充。

一、概述

查询是 ElasticSearch 核心功能,也是最为丰富有趣的功能,接下来我们开始学习全文查询、词项查询、复合查询、嵌套查询、位置查询、特殊查询等查询功能,从多个方面逐一剖析 ElasticSearch 中查询的玩法!今天我们就先来看一个简单的查询入门。

在开始学习查询之前,我们要先来了解一下 ElasticSearch 是如何通过倒排索引进行查询的。

1.1、“正排索引”

在关系型数据库中用到的索引,就是“正排索引”。

假如有一张博客表:

id作者标题内容
1张三博客标题1查询是 ElasticSearch 核心功能
2李四博客标题2也是最为丰富有趣的功能

针对这个表建立 id 和标题字段的索引(正排索引):

索引内容
1查询是 ElasticSearch 核心功能
2也是最为丰富有趣的功能
博客标题1查询是 ElasticSearch 核心功能
博客标题2也是最为丰富有趣的功能

当我们通过 id 或者标题去查询文章内容时,就可以快速找到。

但如果我们通过文章内容的关键字去查询,就只能去内容中做字符匹配了,查询效率相当慢!为了提高查询效率,就要考虑使用倒排索引。

1.2、倒排索引

倒排索引就是以文章内容的关键字建立索引,通过索引找到文档id,进而找到整个文档:

索引文档id=1文档id=2
查询
丰富有趣
功能

一般来说,倒排索引分为两个部分:

  1. 词项词典:记录所有的文档词项,以及词项与倒排列表的关联关系。
  2. 倒排列表:记录词项与文章内容的关联关系,由一系列倒排索引项组成,倒排索引项包括文档 id、词频(词项在文档中出现的次数,评分时使用)、位置(词项在文档中分词的位置)、偏移(记录词项开始和结束的位置)。

1.3、查询过程

ElasticSearch 的查询分为两个过程:

  1. 创建索引:当向索引中保存文档时,默认情况下,ElasticSearch 会保存两份内容,一份是 _source 中的数据,另一份则是通过分词、排序等一系列过程生成的倒排索引文件,倒排索引中保存了词项和文档之间的对应关系。
  2. 查询:当 es 接收到用户的查询请求之后,就会去倒排索引中查询,通过的倒排索引中维护的倒排记录表找到关键词对应的文档集合,然后对文档进行评分、排序、高亮等处理,处理完成后返回文档。

二、ElasticSearch 索引数据导入

开始学习之前,我们先来导入一些练习数据。
练习数据脚本下载地址:https://download.csdn.net/download/weixin_45067790/14503089
也可以关注原作者微信公众号:江南一点雨,后台回复 bookdata.json 下载脚本。

创建索引:

PUT books
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "publish":{
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "type":{
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "author":{
        "type": "keyword"
      },
      "info":{
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "price":{
        "type": "double"
      }
    }
  }
}

执行命令导入数据脚本:

curl -XPOST "http://localhost:9200/books/_bulk?pretty" -H "content-type:application/json" --data-binary @bookdata.json

三、查询入门

3.1、简单查询

查询文档:

GET books/_search
{
  "query": {
    "match_all": {}
  }
}

查询结果如下:在这里插入图片描述
hits 中是查询结果,total 是符合查询条件的文档数,简单查询默认查询 10 条记录。

简单查询可以简写为:

GET books/_search

3.2、词项查询

词项查询即 term 查询,根据分词u查询,查询指定字段中包含给定单词的文档,term 查询不被解析,只有查询的词和文档中的词精确匹配,才会返回文档。应用场景如:人名、地名等等。

查询 name 字段中包含“计算机”的文档:

GET books/_search
{
  "query": {
    "term": {
      "name": "计算机"
    }
  }
}

在这里插入图片描述

3.3、分页

查询默认返回前 10 条数据,ElasticSearch中也可以像关系型数据库一样,设置分页参数,size 设置查询多少条数据, from 设置查询开始的位置:

GET books/_search
{
  "query": {
    "term": {
      "name": "计算机"
    }
  },
  "size": 20,
  "from": 0
}

3.4、过滤返回字段

如果返回的字段比较多,又不需要这么多字段,可以通过 _source 指定返回的字段:

GET books/_search
{
  "query": {
    "term": {
      "name": "计算机"
    }
  },
  "size": 20,
  "from": 0,
  "_source": ["name", "author"]
}

3.5、过滤最低评分

有的文档得分特别低,说明这个文档和我们查询的关键字相关度很低。可以通过 min_score 设置一个最低分,只有得分超过最低分的文档才会被返回:

GET books/_search
{
  "query": {
    "term": {
      "name": "计算机"
    }
  },
  "size": 20,
  "from": 0,
  "_source": ["name", "author"],
  "min_score": "2.75"
}

3.6、高亮

通过 highlight 设置查询关键字高亮:

GET books/_search
{
  "query": {
    "term": {
      "name": "计算机"
    }
  },
  "size": 20,
  "from": 0,
  "_source": ["name", "author"],
  "min_score": "2.75",
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}

版权声明:

本文仅记录ElasticSearch学习心得,如有侵权请联系删除。
更多内容请访问原创作者:江南一点雨
微信公众号:江南一点雨

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值