ElasticSearch笔记

举报
Try 发表于 2021/07/31 09:59:19 2021/07/31
【摘要】 ElasticSearch简介ElasticSearch(简称ES)Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。 能够达到实时搜索,稳定,可靠,快速,安装使用方便。 客户端支持Java、.NET(C#)、PHP、Python、Ruby等多种语言。官方网站:https://www.elastic.co/下载地址:https://www.elastic.co...

ElasticSearch简介

ElasticSearch(简称ES)

Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。 能够达到实时搜索,稳定,可靠,快速,安装使用方便。 客户端支持Java、.NET(C#)、PHP、Python、Ruby等多种语言。

官方网站:https://www.elastic.co/
下载地址:https://www.elastic.co/cn/start

ElasticSearch与Lucene的关系

Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库(框 架) 但是想要使用Lucene,必须使用Java来作为开发语言并将其直接集成到你的应用 中,并且Lucene的配置及使用非常复杂,你需要深入了解检索的相关知识来理解 它是如何工作的。

Lucene缺点:

  1. 只能在Java项目中使用,并且要以jar包的方式直接集成项目中。
  2. 使用非常复杂-创建索引和搜索索引代码繁杂。
  3. 不支持集群环境-索引数据不同步(不支持大型项目)。
  4. 索引数据如果太多就不行,索引库和应用所在同一个服务器,共同占用 硬盘.共用空间少。

上述Lucene框架中的缺点,ES全部都能解决。

ES vs Solr比较

ES vs Solr 检索速度

当单纯的对已有数据进行搜索时,Solr更快。
1.png

当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明 显的优势。
2.png

大型互联网公司,实际生产环境测试,将搜索引擎从Solr转到 Elasticsearch以 后的平均查询速度有了50倍的提升。
3.png

总结:

二者安装都很简单。

  1. Solr 利用 Zookeeper 进行分布式管理,而Elasticsearch 自身带有分布式 协调管理功能。
  2. Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支 持json文件格式。
  3. Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用 时效率明显低于Elasticsearch。
  4. Solr 是传统搜索应用的有力解决方案,但 Elasticsearch更适用于新兴的实 时搜索应用。

ES vs 关系型数据库

4.png

Lucene全文检索框架

什么是全文检索

全文检索是指:
通过一个程序扫描文本中的每一个单词,针对单词建立索引,并保存 该单词在文本中的位置、以及出现的次数.
用户查询时,通过之前建立好的索引来查询,将索引中单词对应的文 本位置、出现的次数返回给用户,因为有了具体文本的位置,所以就可以 将具体内容读取出来了

分词原理之倒排索引

5.png
6.png
7.png


指定IK分词器作为默认分词器

ES的默认分词设置是standard,这个在中文分词时就比较尴尬了,会单字拆分,比如我搜 索关键词“清华大学”,这时候会按“清”,“华”,“大”,“学”去分词,然后搜出来 的都是些“清清的河水”,“中华儿女”,“地大物博”,“学而不思则罔”之类的莫名其 妙的结果,这里我们就想把这个分词方式修改一下,于是呢,就想到了ik分词器,有两种 ik_smart和ik_max_word。 ik_smart会将“清华大学”整个分为一个词,而ik_max_word会将“清华大学”分为“清 华大学”,“清华”和“大学”,按需选其中之一就可以了。 修改默认分词方法(这里修改school_index索引的默认分词为:ik_max_word):
8.png

测试分词效果:

9.png
10.png
11.png



ES数据管理

ES数据管理概述

ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档 (document)。
然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。 在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。 ES使用JSON作为文档序列化格式。 JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。
ES存储的一个员工文档的格式示例:
12.png

基本操作

创建索引

格式: PUT /索引名称
举例: PUT /es_db

查询索引

格式: GET /索引名称
举例: GET /es_db

删除索引

格式: DELETE /索引名称
举例: DELETE /es_db

添加文档

格式: PUT /索引名称/类型/id
举例:
13.png

修改文档

格式: PUT /索引名称/类型/id
举例:
14.png

查询文档

格式: GET /索引名称/类型/id
举例: GET /es_db/_doc/1

删除文档

格式: DELETE /索引名称/类型/id
举例: DELETE /es_db/_doc/1

查询操作

查询当前类型中的所有文档 _search

格式: GET /索引名称/类型/_search
举例: GET /es_db/_doc/_search

SQL: select * from student
条件查询, 如要查询age等于28岁的 _search?q=:**

格式: GET /索引名称/类型/_search?q=:**
举例: GET /es_db/_doc/_search?q=age:28

SQL: select * from student where age = 28
范围查询, 如要查询age在25至26岁之间的 _search?q=[ TO *] 注 意: TO 必须为大写

格式: GET /索引名称/类型/_search?q=*[25 TO 26]
格式: GET /索引名称/类型/_search?q=*[25 TO 26]

SQL: select * from student where age between 25 and 26
根据多个ID进行批量查询 _mget

格式: GET /索引名称/类型/_mget
举例: GET /es_db/_doc/_mget

{ 
"ids":["1","2"]
}
查询年龄小于等于28岁的 :<=

格式: GET /索引名称/类型/_search?q=age:<=**
举例: GET /es_db/_doc/_search?q=age:<=28

SQL: select * from student where age <= 28
查询年龄大于28岁的 :>

格式: GET /索引名称/类型/_search?q=age:>**
举例: GET /es_db/_doc/_search?q=age:>28

SQL: select * from student where age > 28
分页查询 from=&size=

格式: GET /索引名称/类型/_search?q=age[25 TO 26]&from=0&size=1
举例: GET /es_db/_doc/_search?q=age[25 TO 26]&from=0&size=1

SQL: select * from student where age between 25 and 26 limit 0, 1
对查询结果只输出某些字段 _source=字段,字段

格式: GET /索引名称/类型/_search?_source=字段,字段
举例: GET /es_db/_doc/_search?_source=name,age

SQL: select name,age from student
对查询结果排序 sort=字段:desc/asc

格式: GET /索引名称/类型/_search?sort=字段 desc
举例: GET /es_db/_doc/_search?sort=age:desc

SQL: select * from student order by age desc
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。