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缺点:
- 只能在Java项目中使用,并且要以jar包的方式直接集成项目中。
- 使用非常复杂-创建索引和搜索索引代码繁杂。
- 不支持集群环境-索引数据不同步(不支持大型项目)。
- 索引数据如果太多就不行,索引库和应用所在同一个服务器,共同占用 硬盘.共用空间少。
上述Lucene框架中的缺点,ES全部都能解决。
ES vs Solr比较
ES vs Solr 检索速度
当单纯的对已有数据进行搜索时,Solr更快。
当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明 显的优势。
大型互联网公司,实际生产环境测试,将搜索引擎从Solr转到 Elasticsearch以 后的平均查询速度有了50倍的提升。
总结:
二者安装都很简单。
- Solr 利用 Zookeeper 进行分布式管理,而Elasticsearch 自身带有分布式 协调管理功能。
- Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支 持json文件格式。
- Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用 时效率明显低于Elasticsearch。
- Solr 是传统搜索应用的有力解决方案,但 Elasticsearch更适用于新兴的实 时搜索应用。
ES vs 关系型数据库
Lucene全文检索框架
什么是全文检索
全文检索是指:
通过一个程序扫描文本中的每一个单词,针对单词建立索引,并保存 该单词在文本中的位置、以及出现的次数.
用户查询时,通过之前建立好的索引来查询,将索引中单词对应的文 本位置、出现的次数返回给用户,因为有了具体文本的位置,所以就可以 将具体内容读取出来了
分词原理之倒排索引
指定IK分词器作为默认分词器
ES的默认分词设置是standard,这个在中文分词时就比较尴尬了,会单字拆分,比如我搜 索关键词“清华大学”,这时候会按“清”,“华”,“大”,“学”去分词,然后搜出来 的都是些“清清的河水”,“中华儿女”,“地大物博”,“学而不思则罔”之类的莫名其 妙的结果,这里我们就想把这个分词方式修改一下,于是呢,就想到了ik分词器,有两种 ik_smart和ik_max_word。 ik_smart会将“清华大学”整个分为一个词,而ik_max_word会将“清华大学”分为“清 华大学”,“清华”和“大学”,按需选其中之一就可以了。 修改默认分词方法(这里修改school_index索引的默认分词为:ik_max_word):
测试分词效果:
ES数据管理
ES数据管理概述
ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档 (document)。
然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。 在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。 ES使用JSON作为文档序列化格式。 JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。
ES存储的一个员工文档的格式示例:
基本操作
创建索引
格式: PUT /索引名称
举例: PUT /es_db
查询索引
格式: GET /索引名称
举例: GET /es_db
删除索引
格式: DELETE /索引名称
举例: DELETE /es_db
添加文档
格式: PUT /索引名称/类型/id
举例:
修改文档
格式: PUT /索引名称/类型/id
举例:
查询文档
格式: 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
- 点赞
- 收藏
- 关注作者
评论(0)