elasticsearch学习笔记-倒排索引以及中文分词

我们使用数据库的时候,如果查询条件太复杂,则会涉及到很多问题

1、无法维护,各种嵌套查询,各种复杂的查询,想要优化都无从下手

2、效率低下,一般语句复杂了之后,比如使用or,like %,,%查询之后数据库的索引就没有办法利用到了,这个时候的搜索就会全表扫描,数据量少的时候可能性能还能接受,但是数据量大了之后性能会直线下降,速度慢的一塌胡萝卜。。

但是呢,数据库的聚集索引查询还是极快的,

所以我们可以利用这一点尝试建立一下这样的索引结构--就是把数据库里面的每一条记录作为一个键,相同记录的Id的集合作为值,这样我们查询记录的时候就可以通过记录快速定位到数据表的id,从而就可以快速查询到这条数据了如图所示

如果要搜索咪咪虾条的话,就可以带出这些value值,我们都知道key-value的查询是非常快的,所以这个耗时会很短,然后通过id来查询就会使得效率高出很多,这个思路可以用在所有字段上,但是对空间的使用会多一些,不过存储这东东还是蛮便宜的,毕竟体验才是最重要的对吧,这种就叫基本的倒排索引。

但是如果用户只搜索咪咪呢,如何能够定位到这条咪咪虾条的记录呢?

这里就涉及到了另一项比较重要的技术--中文分词

这里简要说明下中文分词:

中文分词里面有个东西必不可少,就是词库

假设我们的词库很简单,就这么几条词:1、咪咪,2、虾,3、虾条

这个时候,我们存入一条咪咪虾条,id是10000的记录的时候呢

分词就会这么干,先读第一个字,咪,然后发现没有单个的这个词,但是有一个咪咪,然后就会读取第二个字,第二个字还是咪,这个时候咪咪是一个词,然后读取第三个字,虾,发现虾是单个的一个字,词典里也有这个字,咪虾不存在,咪咪虾更加不存在,那么咪咪这个词就确定了,继续往下读,发现条,然后发现虾是一个词语,虾条也是一个词语,而现在已经读完了,所以现在分词有两种组合,虾和条,虾条,显然第一条有点扯淡,条不能作为一个词,所以就取后者,这样虾条这个词就出来了。

接着我们存入一条咪咪id 为10002的数据的时候,方法同上

然后存到搜索引擎的数据的就是这样

这个时候就有两条记录,咪咪对应的有两条记录,虾条对应一条

如果我们搜索虾条的话,10000就会被搜索出来,如果搜索咪咪的话,那10002和10000就会被搜索出来

如果我们搜索咪咪虾条的话,就会按照上面的分词逻辑将我们的搜索条件进行分词,然后分出来咪咪和虾条两个词,然后查询,再merge最终得到两个id:10000,10002

分词这块就我所理解也就这样了。

说了这么多,具体怎么做呢?其实很简单,一个插件就搞定,我用的是IK分词插件,安装简单,地址在这里,里面也有安装说明,安装完之后重启下就ok了

https://github.com/medcl/elasticsearch-analysis-ik
中文分词插件

目前就这么多,本人也是刚学这个,写的有什么问题欢迎指出,谢谢~

时间: 2024-11-11 17:56:32

elasticsearch学习笔记-倒排索引以及中文分词的相关文章

elasticsearch学习笔记——相关插件

logstash-input-jdbc学习 ES(elasticsearch缩写)的一大优点就是开源,插件众多.所以扩展起来非常的方便,这也造成了它的生态系统越来越强大.这种开源分享的思想真是与天朝格格不入啊.国内的开源社区做了也很长时间,可是也没出现什么拿的出手的东西,可能只还有阿里比较注重分享一些. ES的查询速度非常快,搜索非常快.但是呢,我们的数据还是主要存在传统的关系型数据库中的.有没有什么办法可以将数据库中的数据实时同步到ES中呢.logstash就是这么一个东西. Logstash

ElasticSearch简介(三)——中文分词

很多时候,我们需要在ElasticSearch中启用中文分词,本文这里简单的介绍一下方法.首先安装中文分词插件.这里使用的是 ik,也可以考虑其他插件(比如 smartcn). $ ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.2.0/elasti csearch-analysis-ik-7.2.0.zip 上面代码安装的是7.2

Elasticsearch 学习笔记1 入门

参考资料 官方学习文档:https://www.elastic.co/guide/index.html 入门中文权威指南: http://es.xiaoleilu.com/ 1 认识es elasticsearch功能: - 全文检索(可以解决DB检索问题(文本检索性能,全文检索等)) - 分布式的实时文件存储,每个字段都被索引并可被搜索(牛逼) - 分布式的实时分析搜索引擎(实时性能好) - 可以扩展到上百台服务器,处理PB级结构化或非结构化数据(容易扩展,支持大数据量) 基于apache l

Elasticsearch学习笔记(二)Search API 与 Query DSL

一. Search API eg: GET /mall/product/_search?q=name:productName&sort=price desc 特点:search的请求参数都是以HTTP请求的的query stirng 附带的 适用范围:适用于临时的在命令行使用一些工具,比如curl,快速的发出请求,来检索想要的信息: 适用于简单的查询条件 二.Query DSL 将Query DSL视为ASL查询则有两种类型的查询语句: 叶子查询语句(Leaf Query clause) : 叶

Elasticsearch学习笔记-03.1集群健康

本文系本人根据官方文档的翻译,能力有限.水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸. 原文出处:https://www.elastic.co/guide/en/elasticsearch/reference/current/_cluster_health.html 让我们以一个基础的健康检查开始,用这个检查我们可以得知我们的集群工作状态如何.咱们来使用curl做这个检查,不过你也可以使用任何能发起HTTP/REST请求的工具来做这个练习.假设我们仍旧在启动E

Elasticsearch学习笔记-03.3创建索引

来吧,咱们一起创建一个名为"customer"的索引,然后查看集群中的所有索引: PUT /customer?pretty GET /_cat/indices?v 第一个命令使用PUT创建了一个名为customer的索引.我们简单的在命令后追加了一个pretty参数,用于将JSON类型的返回值格式化后打印在控制台. 我们也可以使用POST MAN操作,我们会得到类似下图所示的返回结果: 第二个命令的结果告诉我们(为方便查看,我直接在浏览器中打开了链接:http://localhost:

Elasticsearch学习笔记-03.2查看索引列表

使用下面的命令可以查看所有的索引: GET /_cat/indices?v 或直接在浏览器中打开连接: http://localhost:9200/_cat/indices?v 返回结果: health status index uuid pri rep docs.count docs.deleted store.size pri.store.size 表示在咱们的集群中还没有创建任何索引 本文系本人根据官方文档的翻译,能力有限.水平一般,如果对想学习Elasticsearch的朋友有帮助,将是

Elasticsearch学习笔记-02安装

本文系本人根据官方文档的翻译,能力有限.水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸.原文出处:https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.html Elasticsearch要求Java最低版本为8. 截止本文撰写的时间,推荐您使用Oracle JDK 1.8.0_73版本.JAVA的安装会因为系统环境的不同而有很大差异,所以我们在这里不会涉及太多

Elasticsearch学习笔记-03探索集群

本文系本人根据官方文档的翻译,能力有限.水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸.原文出处:https://www.elastic.co/guide/en/elasticsearch/reference/current/_exploring_your_cluster.html REST API现在咱们已经成功让Elasticsearch的节点(和集群)运行良好了,下一步来了解一下如何与之通信.得之吾幸,Elasticsearch提供了非常广泛切强大的RES