本学习笔记基于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学习心得,如有侵权请联系删除。
更多内容请访问原创作者:江南一点雨
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: