1.1.1elasticsearch是什么?
elasticsearch是一款非常强大的开源搜索引擎(全文检索),可以帮助我们从海量数据中快速找到需要的内容
1.1.2.elasticsearch和lucene
elasticsearch底层是基于lucene来实现的。
lucene只是一个基础的框架,没有具体实现内容
优点:易扩展,高性能(基于倒排索引)
缺点:仅限于java开发,不支持水平扩展
elasticsearch :支持分布式,可水平扩展,可被任何语言调用
1.2.1.正排索引 (根据文档找词条的过程)
先全表扫描,然后根据内容找词条是否符合
逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就是一场灾难。
1.2.2.倒排索引 (根据词条找文档)无需全表扫描
倒排索引中有两个非常重要的概念:
- 文档(Document):每一条数据就是一个文档。例如一个网页、一个商品信息
- 词条(Term):例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条
1.3.es的一些概念
elasticsearch中有很多独有的概念,与mysql中略有差别,但也有相似之处。
1.3.1.文档和字段
elasticsearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中,而Json文档中往往包含很多的字段(Field),类似于数据库中的列。
1.3.2.索引和映射
索引(Index),就是相同类型的文档的集合。
例如:
- 所有用户文档,就可以组织在一起,称为用户的索引;
- 所有商品的文档,可以组织在一起,称为商品的索引;
- 所有订单的文档,可以组织在一起,称为订单的索引;
- 因此,我们可以把索引当做是数据库中的表。
数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射(mapping),是索引中文档的字段约束信息,类似表的结构约束
1.3.3.mysql与elasticsearch
往往是两者结合使用:
- 对安全性要求较高的写操作,使用mysql实现
- 对查询性能要求较高的搜索需求,使用elasticsearch实现
- 两者再基于某种方式(ELK中的logstash),实现数据的同步,保证一致性
1.4.1分词器
ElasticSearch 内置分词器
- Standard Analyzer - 默认分词器,按词切分,小写处理
- Simple Analyzer - 按照非字母切分(符号被过滤), 小写处理
- Stop Analyzer - 小写处理,停用词过滤(the,a,is)
- Whitespace Analyzer - 按照空格切分,不转小写
- Keyword Analyzer - 不分词,直接将输入当作输出
- Patter Analyzer - 正则表达式,默认\W+(非字符分割)
- Language - 提供了30多种常见语言的分词器
1.4.2IK分词器
标准分词器并不能很好处理中文,一般我们会用第三方的分词器,例如:IK分词器。
KAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包,是一个基于Maven构建的项目,具有60万字/秒的高速处理能力,支持用户词典扩展定义。(面试)
ik_max_word(细粒度的分析)和ik_smart(粗粒度的分词)两种方式,分词粒度不同。
创建目录时,越细越好,用户搜索时,越粗越好,提高用户效率(细分的目录包含粗分目录)
1.4.3.总结
分词器的作用是什么?
-
创建倒排索引时对文档分词
-
用户搜索时,对输入的内容分词
IK分词器有几种模式?
-
ik_smart:智能切分,粗粒度
-
ik_max_word:最细切分,细粒度
IK分词器如何拓展词条?如何停用词条?
-
利用config目录的IkAnalyzer.cfg.xml文件添加拓展词典和停用词典
-
在词典中添加拓展词条或者停用词条
索引库操作:
-
创建索引库:
PUT /库名称
-
查询索引库:
GET /索引库名称
-
删除索引库:
DELETE /索引库名称
文档操作有哪些?
-
创建文档:POST /{索引库名}/_doc/文档id { json文档 }
-
查询文档:GET /{索引库名}/_doc/文档id
-
删除文档:DELETE /{索引库名}/_doc/文档id
-
修改文档:
-
全量修改:PUT /{索引库名}/_doc/文档id { json文档 }
-
增量修改:POST /{索引库名}/_update/文档id { "doc": {字段}}
-
JavaRestClient操作elasticsearch的流程基本类似。核心是client.indices()方法来获取索引库的操作对象。
索引库操作的基本步骤:
-
初始化RestHighLevelClient
-
创建XxxIndexRequest。XXX是Create、Get、Delete
-
准备DSL( Create时需要,其它是无参)
-
发送请求。调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete
RestClient操作文档基本步骤
-
初始化RestHighLevelClient
-
创建XxxRequest。XXX是Index、Get、Update、Delete、Bulk
-
准备参数(Index、Update、Bulk时需要)
-
发送请求。调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete、bulk
-
解析结果(Get时需要)