倒排索引相关概念
- 文档(Document):用来检索的海量数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息。
- 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。词条最小不可再拆分。
Docker安装
安装ElasticSearch
1)安装
docker run -id --name elasticsearch \
-e "cluster.name=ly-elastic" \
-e "http.host=0.0.0.0" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-e http.cors.enabled=true \
-e http.cors.allow-origin="*" \
-e http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization \
-e http.cors.allow-credentials=true \
-v es-data:/usr/share/elasticsearch/data \
-v es-logs:/usr/share/elasticsearch/logs \
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--hostname elasticsearch \
-p 9200:9200 \
-p 9300:9300 \
-p 5601:5601 \
elasticsearch:7.4.2
# 9200:http协议端口
# 9300:TCP协议端口
# 5601:Kibana访问端口
2)设置自启动
docker update --restart=always elasticsearch
3)启动防火墙
systemctl start firewalld
4)开放端口
firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --zone=public --add-port=9300/tcp --permanent
5)重启防火墙
firewall-cmd --reload
6)查看防火墙放行端口
firewall-cmd --list-ports
7)学习阶段可关闭防火墙,工作时不要关闭防火墙
systemctl stop firewalld
备注:如启动有问题,重启docker服务,再启动elasticsearch容器
systemctl restart docker
docker start elasticsearch
安装Kibana
1)安装
docker run -di --name kibana -e ELASTICSEARCH_URL=http://127.0.0.1:9200 --network=container:elasticsearch kibana:7.4.2
安装IK分词器
1)进入/var/lib/docker/volumes/es-plugins/_data/
cd /var/lib/docker/volumes/es-plugins/_data/
2)新建文件目录 ik 并且进入
mkdir ik
cd ik
3)将elasticsearch-analysis-ik-7.4.2.zip添加进该目录
4)解压该压缩包
yum -y install unzip (可先压缩,没有该工具时再安装)
unzip elasticsearch-analysis-ik-7.4.2.zip
5)重启elasticsearch与kibana
docker restart elasticsearch
docker restart kibana
设置IK分词器的扩展词与屏蔽词词典
1)进入IK分词器config目录
cd config
2)编辑IKAnalyzer.cfg.xml,添加以下内容扩展词文件路径ext.dic、屏蔽词文件路径stopword.dic
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 *** 添加扩展词典-->
<entry key="ext_dict">ext.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopword.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
3)编辑stop.dic,添加屏蔽词
4)复制stop.dic命名为ext.dic,编辑ext.dic,添加扩展词
(不要自己新建文件,字符编码容易出错)
cp stopword.dic ext.dic
5)重启elasticsearch与kibana
docker restart elasticsearch
docker restart kibana
IK分词小结:
-
ik_smart
:最小切分,例如:程序员可分为程序员 -
ik_max_word
:最细切分,例如:程序员可分为程序员、程序
Elasticsearch对比MySQL
Elasticsearch虽然是一种NoSql库,但最终的目的是存储数据、检索数据。因此很多概念与MySQL类似的。
ES中的概念 | 数据库概念 | 说明 |
---|---|---|
索引库(indices) | 数据库(Database) | ES中可以有多个索引库,就像Mysql中有多个Database一样。 |
类型(Type) | 表(table) | mysql中database可以有多个table,table用来约束数据结构。而ES中的每个索引库中只有一个类型 ,类型 中用来约束字段属性的叫做映射(mapping ),7.X之后将会被取消,取默认值:_doc
|
映射(mappings) | 表的字段约束 | mysql表对字段有约束,ES中叫做映射,用来约束字段属性,包括:字段名称、数据类型等信息 |
文档(document) | 行(Row) | 存入索引库原始的数据,比如每一条商品信息,就是一个文档。对应mysql中的每行数据 |
字段(field) | 列(Column) | 文档中的属性,一个文档可以有多个属性。就像mysql中一行数据可以有多个列。 |
因此,我们对ES的操作,就是对索引库、类型映射、文档数据的操作:
- 索引库操作:主要包含创建索引库、查询索引库、删除索引库等
- 类型映射操作:主要是创建类型映射、查看类型映射
- 文档操作:文档的新增、修改、删除、查询
Elasticsearch的索引库操作
- 创建索引库
PUT /索引库名
{
"settings": {
"属性名": "属性值"
}
}
- 查询索引库
GET /索引库
- 删除索引库
DELETE /索引库名
mapping映射(三个是否)
-
数据是否参与搜索?
- 通过
index
属性来指定是否参与搜索,默认为true
- 通过
-
数据是否需要分词?
- 分词器类型很多,中文一般选择IK分词器
- 指定分词器类型可以通过
analyzer
属性指定
注意:在同一个域上 分词和搜索时 建议使用同一个分词器
-
数据是否存储到es库中?
- 是否存储取决于用户是否需要将当前字段展示给用户查看
数据类型
string
- text:默认是索引、存储、分词
- keyword:默认是索引、存储、不分词
- wildcard
NUmeric
- long
- integer
- short
- byte
- double
- float
- half_float
- scaled_float
Date
- date
Date nanoseconds
- date_nanos
Boolean
- boolean
Binary
- binary
Range
- integer_range
- float_range
- long_range
- double_range
- date_range
- ip_range
Object
- object for single JSON objects
Nested
- nested for arrays of JSON objects
创建类型映射
索引库已经存在
PUT /索引库名/_mapping
{
"properties": {
"字段名1": {
"type": "类型",
"index": true,
"analyzer": "分词器"
},
"字段名2": {
"type": "类型",
"index": true,
"analyzer": "分词器"
},
...
}
}
索引库不存在
PUT /索引库名
{
"mappings":{
"properties": {
"字段名1": {
"type": "类型",
"index": true,
"analyzer": "分词器"
},
"字段名2": {
"type": "类型",
"index": true,
"analyzer": "分词器"
},
...
}
}
}
查看映射关系
GET /索引库名/_mapping
Document文档的操作
新增文档
新增并随机生成id
POST /索引库名/_doc
{
"key":"value"
}
新增并指定id
POST /索引库名/_doc/id值
{
"key":"value"
}
或者使用PUT(id不存在则新增,存在则修改,必须指定id)
PUT /索引库名/_doc/id值
{
"key":"value"
}
查询文档
根据ID查询
GET /{索引库名称}/_doc/{id}
删除文档
DELETE /索引库名/类型名/id值
文档映射
默认映射
- 如遇String类型数据,ES无法确定该用text还是keyword,它就会存入两个字段。
例如:- subtitle:text类型
- subtitle.keyword:keyword类型
动态映射
# 动态模板
PUT heima3
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word"
}
},
"dynamic_templates": [
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
这个动态模板的意思是:凡是string类型的自动,统一按照 keyword来处理。