08、ES实战:查询入门

本学习笔记基于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学习心得,如有侵权请联系删除。
更多内容请访问原创作者:江南一点雨
*

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: