搜索引擎技术排名:
1.Elasticsearch:开源的分布式搜索引擎
2. Splunk:商业项目
3. Solr: Apache的开源搜索引擎
认识和安装
Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。官网地址: https://lucene.apache.org/.
Lucene的优势:
- 易扩展
- 高性能(基于倒排索引) 心
2004年Shay Banon基于Lucene开发了Compass
2010年Shay Banon重写了Compass,取名为Elasticsearch。
官网地址: https://www.elastic.co/cn/
目前最新的版本是:8.x.x
elasticsearch具备下列优势:
- 支持分布式,可水平扩展
- 提供Restful接口,可被任何语言调用
elasticsearch结合kibana、Logstash、Beats,是一整套技术栈,被叫做ELK。被广泛应用在日志数据分析、实时监控等领域。
docker安装命令
单机版本的elasticsearch:
docker run -d \
--name es \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v es-data:/usr/share/elasticsearch/data \
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network hm-net \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.12.1
通过下面的Docker命令,即可部署Kibana:
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=hm-net \
-p 5601:5601 \
kibana:7.12.1
倒排索引
elasticsearch采用倒排索引:
文档(document) :每条数据就是一个文档
词条(term) :文档按照语义分成的词语
正向索引
基于文档id创建索引。根据id查询快,但是查询词条时必须先找到文档,而后判断是否包含词条
倒排索引
对文档内容分词,对词条创建索引,并记录词条所在文档的id。
查询时先根据词条查询到文档id,而后根据文档id查询文档
IK分词器
(i坤之我不是小黑子)
中文分词往往需要根据语义分析,比较复杂,这就需要用到中文分词器,例如IK分词器。IK分词器是林良益在2006年开源发布的,其采用的正向迭代最细粒度切分算法一直沿用至今。
只需将下载好的分词器放入elasticsearch的插件入目即可
在Kibana的DevTools中可以使用下面的语法来测试Ik分词:
语法说明:
POST:请求方式
/_analyze:请求路径,这里省略了http://虚拟机地址,有kibana帮我们补充
请求参数,json风格:
- analyzer:分词器类型,这里是默认的standard分词器
- text:要分词的内容
现在用ik分词器测试:
ik分词有两种模式:
- ik_smart:智能切分,粗粒度
- ik_max_word:最细切分,细粒度Ik分词器
ik的另一种分词模式(分的更细)
IK分词器允许我们配置拓展词典来增加自定义的词库:
基础概念
elasticsearch中的文档数据会被序列化为json格式后存储在elasticsearch中。
索引(index):相同类型的文档集合(索引库)
映射(mapping) ∶索引中文档的字段约束信息,类似表的结构约束
索引库操作
Mapping映射属性
mapping是对索引库中文档的约束,常见的mapping属性包括:
type:字段数据类型,常见的简单类型有:
- 字符串: text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
- 数值:long、integer、short、byte、double、float.
- 布尔: boolean
- 日期: date
- 对象:object
index:是否创建索引,默认为true
analyzer:使用哪种分词器
properties:该字段的子字段
索引库操作
创建索引库和mapping的请求语法如下:
查询和删除
# 查询
GET /heima
# 删除
DELETE /heima
索引库和mapping一旦创建无法修改,但是可以添加新的字段,语法如下: