ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用es对查询的优化

2021-11-12 15:59:00  阅读:288  来源: 互联网

标签:term 查询 索引 李四 Elasticsearch 优化 分词 es


使用es对查询的优化

使用背景

在项目的一些关键字模糊查询、全局查询的背景下,使用直接操作数据库的模糊查询 ‘%xx%’ 这样的语句,不会使用索引查,而是效率低的全表扫描。如果再加一个条件,一个关键字查询多张表的全局查询,在数据量大的情况下,造成的时间复杂度会更高。
这个情况在常用的软件中会经常遇到,look一下CSDN的一个搜索功能,输入几个关键字,它会将标题、内容、广告…中带有关键字的全部找到,还有关键词高亮的功能。速度也是那么快。让我们来一探究竟。
在这里插入图片描述

ElasticSearch简介

  • 一个分布式的、Restful风格的搜索引擎。
  • 支持对各种类型的数据的检索。
  • 搜索速度快,可以提供实时的搜索服务。
  • 便于水平扩展,每秒可以处理PB级海量数据。
    优点如上这么明显,拙劣的解释一下它的实现:它不同于数据库的索引查询原理,采用的是倒叙索引的算法(通俗来说正序索引是通过key来找到value,而倒叙索引是通过value找key)。可以看下面的一张表:
idnameage
1张三18
2李四19
3李三四18

如果一个查询条件是name,那么就是以name为倒叙索引,可以形成下面的格式:

termdocument
张三[1]
李四[2,3]
李三[3]
三四[3]

我们是将内容进行了分词(这里是最细粒划分)。然后指向了我们document的一个唯一的标识,能够找到位置的地址。
这样,当我们在程序发出一个查询请求后,比如“李四张三”。首先会把这个查询内容分词:“李四”、“张三”。然后就找到对应的数据[1,2,3]。这三条数据了,比我们在mysql中模糊查询快的多。这是其中的一个原因。
我们将“张三”、“李四”、“三四…这样的叫做term。如果有很多个term,那么我们如何找到对应的term呢。

我们以term是英文为例:具体的做法是
term index。term index有点像一本字典的大的章节表。如果所有的term都是英文字符的话,可能这个term index就真的是26个英文字符表构成的了。但是实际的情况是,term未必都是英文字符,term可以是任意的byte数组。而且26个英文字符也未必是每一个字符都有均等的term,比如x字符开头的term可能一个都没有,而s开头的term又特别多。实际的term index是一棵trie 树:
在这里插入图片描述
可以总结处理就是一个字典树了,后来在加入一些压缩技术,(Luncene?),这种方式就很快就能够查找到对应的分词,然后在对应的分词就找到了对应的主键,就可以直接找到对应的数据了。关于字典树后期准备发一篇(记一下)。

Elasticsearch术语

  • 索引、类型、文档、字段。
  • 集群、节点、分片、副本。

解释一下:

  1. 索引:相当于数据库中的database 改版后作为table

  2. 类型:相当于数据库中的table 不再使用

  3. 文档:相当于数据库中的一行数据,数据结构为JSON

  4. 字段:相当于数据库中的一列
    Elasticsearch6.0以后开始逐步废除类型的概念,索引的含义中也包括了类型。

  5. 集群:分布式部署,提高性能

  6. 节点:集群中的每一台服务器

  7. 分片:对一个索引的进一步划分存储,提高并发处理能力

  8. 副本:对分片的备份,提高可用性

相关连接:Elasticsearch官网

安装配置Elasticsearch

配置一下:在安装后的config/elasticsearch.yml下:

在这里插入图片描述
环境变量也需要配置:
在这里插入图片描述
因为经常搜索是中文,还需要搭配一下中文的分词插件ik,在github下:
在这里插入图片描述
解压到指定目录下:
在这里插入图片描述

IKAnalyzer.cfg 可以自己配置新词,例如一些网络用语或者所属项目常用词:
在这里插入图片描述
在这里插入图片描述

对Elasticsearch的操作

因为Elasticsearch服务是基于Restful风格的,可以用postman直接操作url进行增删改查。

  • 建索引:
    在这里插入图片描述
  • 提交数据:

test:索引
_doc:固定格式
1:id号 然后在请求body中写数据
PUT localhost:9200/test/_doc/1

在这里插入图片描述

  • 查数据

GET localhost:9200/test/_doc/1

在这里插入图片描述

  • 搜索数据
    在这里插入图片描述

Spring整合Elasticsearch

  • pom引入依赖
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-elasticsearch</artifactId>
		</dependency>
  • 配置properties
#elasticsearchProperties
spring.data.elasticsearch.cluster-name=nowcoder
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
  • 解决Netty冲突问题

问题原因:Redis底层使用了Netty,Elasticsearch也用了Netty,当被注册两次就会报错

在启动类中解决
在这里插入图片描述
整合完毕,就是对其的使用了。

使用Elasticsearch

标签:term,查询,索引,李四,Elasticsearch,优化,分词,es
来源: https://blog.csdn.net/qq_40454136/article/details/121278449

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有