天天看点

ElasticSearch笔记

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更快。

ElasticSearch笔记

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

ElasticSearch笔记

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

ElasticSearch笔记

总结:

二者安装都很简单。

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

ES vs 关系型数据库

ElasticSearch笔记

Lucene全文检索框架

什么是全文检索

全文检索是指:

通过一个程序扫描文本中的每一个单词,针对单词建立索引,并保存 该单词在文本中的位置、以及出现的次数.

用户查询时,通过之前建立好的索引来查询,将索引中单词对应的文 本位置、出现的次数返回给用户,因为有了具体文本的位置,所以就可以 将具体内容读取出来了

分词原理之倒排索引

ElasticSearch笔记
ElasticSearch笔记
ElasticSearch笔记

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

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

ElasticSearch笔记

测试分词效果:

ElasticSearch笔记
ElasticSearch笔记
ElasticSearch笔记

ES数据管理

ES数据管理概述

ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档 (document)。

然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。 在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。 ES使用JSON作为文档序列化格式。 JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。

ES存储的一个员工文档的格式示例:

ElasticSearch笔记

基本操作

创建索引

格式: PUT /索引名称

举例: PUT /es_db

查询索引

格式: GET /索引名称

举例: GET /es_db

删除索引

格式: DELETE /索引名称

举例: DELETE /es_db

添加文档

格式: PUT /索引名称/类型/id

举例:

ElasticSearch笔记
修改文档
ElasticSearch笔记

查询文档

格式: 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]

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