本次ES基于:7.12.1 版本
学习资源为:https://www.bilibili.com/video/BV1Gh411j7d6
什么是ES(Elasticsearch)
elasticsearch 结合 kibana、Loastash、Beats,也就是elastic stack (ELK)。被广泛应用在日志数据分析、实时监控等领域。
elasticsearch 是 elastic stack 的核心,负责存储、搜索、分析数据。
ES的发展
ES底层基于 Lucene
Lucene 是一个 Java 语言的搜索引擎类库,是 Apache 公司的顶级项目,由 DougCutting 于1999年研发官网地址: https://lucene.apache.org/。
Lucene的优势:
Lucene的缺点:
2004年shay Banon基于Lucene开发了Compass
2010年shay Banon 重写了 Compass,取名为Elasticsearch。官网地址: https://www.elastic.co/cn/。相比与lucene,elasticsearch具备下列优势:
为什么学习elasticsearch?
搜索引擎技术排名:
Elasticsearch:开源的分布式搜索引擎
Splunk:商业项目
Solr:Apache的开源搜索引擎
传统数据库(如MySQL
)采用正向索引,例如给下表 (tb goods)
中的id创建索引
elasticsearch
采用倒排索引:
文档(document)
:每条数据就是一个文档
词条(term)
:文档按照语义分成的词语
倒排索引是根据词条查找文档。
索引(index)
:相同类型的文档的集合。不同的JSON
结构就代表一个不同的索引。
映射 (mapping)
:索引中文档的字段约束信息,类似表的结构约束
Mysql
: 擅长事务类型操作,可以确保数据的安全和一致性。
Elasticsearch
:擅长海量数据的搜索、分析、计算。
使用docker创建网络,拉取镜像。
docker network create es-net
docker pull elasticsearch:7.12.1
docker pull kibana:7.12.1
运行命令
docker run -d \
--name es \
-e"ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e"discovery.type=single-node" \
-v es-data:/usr/share/eTasticsearch/data \
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network es-net \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.12.1
discovery.type=single-node
:单点模式es-data
:数据目录es-plugins
:插件目录访问
http://ip:9200/
{
"name": "a340f52223b0",
"cluster_name": "docker-cluster",
"cluster_uuid": "ppw1gfsiQbqDdsNfmivM0A",
"version": {
"number": "7.12.1",
"build_flavor": "default",
"build_type": "docker",
"build_hash": "3186837139b9c6b6d23c3200870651f10d3343b7",
"build_date": "2021-04-20T20:56:39.040728659Z",
"build_snapshot": false,
"lucene_version": "8.8.0",
"minimum_wire_compatibility_version": "6.8.0",
"minimum_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "You Know, for Search"
}
运行Kibana
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601 \
kibana:7.12.1
--name es \
时设置的名字。es
在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。
我们在kibana
的DevTools
中测试:
POST /_analyze
{
"analyzer": "standard",
"text": "南京市长江大桥。"
}
安装分词器
下载:https://github.com/medcl/elasticsearch-analysis-ik/releases?page=6
解压后上传到 es-plugins 中,可通过如下目录查看。
docker volume inspect es-plugins
{
"Mountpoint": "/var/lib/docker/volumes/es-plugins/_data",
}
docker restart es
测试ik分词
ik_smart:粗粒度
请求:
POST /_analyze
{
"analyzer": "ik_smart",
"text": "南京市长江大桥。"
}
响应:
{
"tokens" : [
{
"token" : "南京市",
"start_offset" : 0,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "长江大桥",
"start_offset" : 3,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 1
}
]
}
请求:ik-max-word:细粒度
请求:
POST /_analyze
{
"analyzer": "ik_max_word",
"text": "南京市长江大桥。"
}
-----------------------------
{
"tokens" : [
{
"token" : "南京市",
"start_offset" : 0,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "南京",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 1
},
....
]
}
添加字典
要拓展ik
分词器的词库,只需要修改一个ik
分词器目录中的config
目录中的IkAnalyzer.cfg.xml
文件。
DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置comment>
<entry key="ext_dict">ext_dict.dicentry>
<entry key="ext_stopwords">stopword.dicentry>
properties>
去除停用词
<entry key="ext_stopwords">stopword.dicentry>