Elasticsearch的正向索引和倒排索引
正向索引和倒排索引
正向索引
适合通过索引来检索数据,且检索速度快,但是如果是模糊检索会很慢,需要全国表扫描
比如有一张商品表
如果进行索引检索也就是id查询的话速度很快,但是大部分情况比如购物网站的搜索栏都是模糊检索,比如
select * from product where product_name like ‘%手机%’
检索流程
如果数据量很大的话检索速度将很慢,完全无法满足现在大数据量的时代
倒排索引
倒排索引中有两个非常重要的概念:
文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息
词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条
创建倒排索引是对正向索引的一种特殊处理,流程如下:
将每一个文档的数据利用算法分词,得到一个个词条
创建表,每行数据包括词条、词条所在文档id、位置等信息
因为词条唯一性,可以给词条创建索引,例如hash表结构索引
假如有一个文档集,一条数据就是一个文档,文档保存的时候会生成对应的词条
词条它是唯一的可以创建索引,当我们模糊匹配‘手机’时,会根据词条手机查询文档id列表,提供文档id列表查询文档,两次查询是索引查询,不需要全表扫描,速度很快.
正向和倒排对比
概念区别:
正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程。
而倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程。
优缺点:
正向索引:
优点:
可以给多个字段创建索引
根据索引字段搜索、排序速度非常快
缺点:
根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。
倒排索引:
优点:
根据词条搜索、模糊搜索时,速度非常快
缺点:
只能给词条创建索引,而不是字段
无法根据字段做排序
Elasticsearch的核心概念
索引
es索引是es组织文档的方式,是文档的集合,网上很多人都说es索引就类似于Mysql的数据库,但我认为它更像是一张数据表。这个索引下面可以存储文档集合,就行一张表里面可以存储很多行数据。
文档
文档是es中可搜索的最小单位,es的文档由一个或多个字段组成,类似于关系型数据库中的一行记录,但es的文档是以JSON进行序列化并保存的,每个JSON对象由一个或多个字段组成,字段类型可以是布尔,数值,字符串、二进制、日期等数据类型。
每一个文档,除了保存我们写入进行的文档原始数据外,也有文档自己的元数据,这些元数据,用于标识文档的相关信息。
es每个文档都有唯一的id,这个id可以由我们自己指定,也可以由es自动生成。
总而言之
索引可被认作一种文档的优化集合,且每个文档都是字段的集合,字段是包含你数据的键值对。默认情况下,Elasticsearch 索引每个字段中的所有数据,且每个被索引的字段有一个专用的优化数据结构。例如,文本字段被存储在倒排索引中,数字和地理字段存储在 BKD 树 中。使用每个字段的数据结构来聚集和返回搜索结果是让 Elasticsearch 如此快的原因。
Elasticsearch简单操作
Elasticsearch 提供一种简单、一致的 REST API,用于管理你的集群以及索引和搜索数据。用于测试目的,你可以轻松地从命令行或者在 Kibana 中通过开发者控制台提交请求。Elasticsearch REST API 支持结构化查询、全文查询以及结合二者的复杂查询。
Elasticsearch 聚合可以让你你能实时分析和可视化数据
注意:本文示例都是在kinbana里面测试的,你也可以通过PostMan和ApiPost进行测试给elasticsearch发送请求完成测试
索引操作API
创建索引
索引别名
索引别名是用于引用一个或多个现有索引的辅助名称。大多数 Elasticsearch API 接受索引别名代替索引。
添加或修改别名:
POST /_aliases
{
“actions” : [
{ “add” : { “index” : “索引名称”, “alias” : “别名” } },//添加别名
{ “remove” : { “index” : “索引名称”, “alias” : “别名” } },//移除别名
{ “remove_index”: { “index”: “test” } } //移除索引
]
}
文档操作API
查询体query的组成
参考文章:Elasticsearch 基本使用(五)查询条件匹配方式(query & query_string)_es条件查询-CSDN博客
query 查询主要分为以下几大类:
全文查询(Full Text Queries)
词项级查询(Term-level Queries)
复合查询(Compound Queries)
地理位置查询(Geo Queries)
特殊查询(Specialized Queries)
嵌套和父子文档查询
1. 全文查询(Full Text Queries)
match:最基本的全文查询类型,会对查询文本进行分词处理。
{
“query”: {
“match”: {
“字段名称”: {
“query”: “”,//查询文本
“operator”: “and”, // 表示必须包含所有词项 默认为 or
“minimum_should_match”: “”, // 至少匹配词项的百分比
“fuzziness”: “AUTO”, // 模糊匹配级别 AUTO或0-2
“analyzer”: “standard”//指定分析器
}
}
}
}
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
66源码网 » Elasticsearch的正向索引和倒排索引