Elasticsearch(高性能分布式搜索引擎)
搜索引擎技术排名:
- Elasticsearch: 开源的分布式搜索引擎
- Splunk: 商业项目
- Solr: Apache的开源搜索引擎
Elasticsearch结合Kibana、Logstash、Beats,是一整套技术栈,被叫做ELK。被广泛应用在日志数据分析、安全监控等领域。
倒排索引
elasticsearch采用倒排索引:
- 文档(document):每条数据就是一个文档
- 词条(term):文档按照语义分成的词语
业务流程
文档、词条、正向索引与倒排索引说明
- 每一条数据就是一个文档。
- 对文档中的内容分词,得到的词语就是词条。
基于文档id创建索引的方式称为正向索引,其特点是根据id查询快,但是查询词条时必须先找到文档,而后判断是否包含词条。
对文档内容分词,对词条创建索引,并记录词条所在文档的id,这种方式称为倒排索引,查询时会先根据词条查询到文档id,而后根据文档id查询文档。
IK分词器
中文分词往往需要根据语义分析,比较复杂,这就需要用到中文分词器,例如IK分词器。IK分词器是林良益在2006年开源发布的,其采用的正向迭代最细粒度切分算法一直沿用至今。
其安装的方式也比较简单,只要将资料提供好的分词器放入elasticsearch的插件目录即可。
在Kibana的DevTools中可以使用下面的语法来测试IK分词器:
POST /_analyze { "analyzer": "standard", "text": "黑马程序员学习java太棒了" }语法说明:
- POST:请求方式
- /_analyze:请求路径,这里省略了http://192.168.150.101:9200,由kibana帮我们补充
- 请求参数,json风格:
- analyzer:分词器类型,这里是默认的standard分词器
- text:要分词的内容
IK分词器允许我们配置拓展词典来增加自定义的词语。
分词器的作用是什么?
- 创建倒排索引时,对文档分词
- 用户搜索时,对输入的内容分词
IK分词器有几种模式?
- ik_smart:智能切分,粗粒度
- ik_max_word:最细切分,细粒度IK分词器
如何拓展分词器词库中的词条?
- 利用config目录的IkAnalyzer.cfg.xml文件添加拓展词典
- 在词典中添加拓展词条
ES基础概念
索引(index):相同类型的文档的集合
对比传统mysql数据库
索引库操作- Mapping 映射属性
Mapping映射属性
mapping是对索引库中文档的约束,常见的mapping属性包括:
- type:字段数据类型,常见的简单类型有:
- 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
- 数值:long、integer、short、byte、double、float、
- 布尔:boolean
- 日期:date
- 对象:object
- index:是否创建索引,默认为true
- analyzer:使用哪种分词器
- properties:该字段的子字段
索引库操作-索引库的CRUD
PUT(新增)(不支持修改)
索引库和mapping一旦创建无法修改,但是可以添加新的字段,语法如下:
PUT /索引库名/_mapping { "properties": { "新字段名":{ "type": "integer" } } }示例:
PUT /heima/_mapping { "properties": { "age":{ "type": "integer" } } }文档操作-文档CRUD
文档操作-批量处理
Elasticsearch中允许通过一次请求中携带多次文档操作,也就是批量处理,语法格式如下:
POST /_bulk { "index" : { "_index" : "索引库名", "_id" : "1" } } { "字段1" : "值1", "字段2" : "值2" } { "index" : { "_index" : "索引库名", "_id" : "1" } } { "字段1" : "值1", "字段2" : "值2" } { "index" : { "_index" : "索引库名", "_id" : "1" } } { "字段1" : "值1", "字段2" : "值2" } { "delete" : { "_index" : "test", "_id" : "2" } } { "update" : {"_id" : "1", "_index" : "test"} } { "doc" : {"field2" : "value2"} }