一、docker 安装启动 elasticsearch
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例
# 单节点启动
docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch -e "discovery.type=single-node" elasticsearch:7.17.0
二、安装 kibana
注意版本的一致
Kibana 是一个针对Elasticsearch的开源分析及可视化平台
,使用Kibana可以查询、查看并与存储在ES索引的数据进行交互操作,使用Kibana能执行高级的数据分析,并能以图表、表格和地图的形式查看数据。
docker run -d --name kibana -p 5601:5601 kibana:7.17.0
1、修改配置文件
推荐使用卷挂载技术(自行百度)
-
进入容器内部目录(/usr/share/kibana/config)
-
修改配置文件内容
2、访问测试
三、书写测试
3.1、索引的基本操作
# 查询索引
GET _cat/indices?v
# 创建索引
PUT product
# 创建索引(进行索引分片配置)
PUT order
{
"settings": {
"number_of_shards": 1, # 指定主分片的数量
"number_of_replicas": 0 # 指定副分片的数量
}
}
# 删除索引
DELETE product
3.2、映射的基本操作
# 创建索引指定映射
# product(id,title,price,created_at,description)
PUT product
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": "keyword"
},
"price": {
"type": "double"
},
"created_at": {
"type": "date"
},
"description": {
"type": "text"
}
}
}
}
# 查看索引的映射
GET product/_mapping
3.3、文档的基本操作
# 添加文档(指定_id,不指定则自动生成)
POST product/_doc/1
{
"id": 1,
"title": "花生米",
"price": 3.5,
"created_at": "2022-02-08",
"description": "花生米嘎嘣脆!!!"
}
# 添加文档(不指定_id,不指定则自动生成) 00Jv134B_6B7V4VLtPBo
POST product/_doc
{
"title": "火腿肠",
"price": 2,
"created_at": "2022-02-06",
"description": "火腿肠腿很长!!!"
}
# 查看文档(基于_id查看)
GET product/_doc/1
GET product/_doc/00Jv134B_6B7V4VLtPBo
# 删除文档(基于_id删除)
DELETE product/_doc/00Jv134B_6B7V4VLtPBo
# 修改文档(这种方式会删除原始文档,重新插入)
PUT product/_doc/1
{
"id": 1,
"title": "大大花生米",
"price": 3.5,
"created_at": "2022-02-08",
"description": "花生米嘎嘣脆!!!"
}
# 修改文档(直接修改操作)
POST product/_doc/1/_update
{
"doc": {
"title": "普通花生米"
}
}
3.4、批量操作
# 批量添加两条文档
POST /product/_doc/_bulk
{"index":{"_id":2}}
{"id":2,"title":"葵花","price":2.5,"created_at":"2022-02-08","description":"葵花笑哈哈!!!"}
{"index":{"_id":3}}
{"id":3,"title":"辣条","price":1.5,"created_at":"2022-02-08","description":"辣条美滋滋!!!"}
# 查看
GET product/_doc/2
GET product/_doc/3
# 更新文档同时删除文档
POST /product/_doc/_bulk
{"update":{"_id":2}}
{"doc":{"title":"超大葵花"}}
{"delete":{"_id":3}}
四、常见查询
4.1、关键字查询 [term]
term 关键字:用来使用关键字查询
# 查询所有
GET /product/_search
{
"query": {
"match_all": {}
}
}
# 关键字查询(term)
GET /product/_search
{
"query": {
"term": {
"title": {
"value": "普通花生米"
}
}
}
}
GET /product/_search
{
"query": {
"term": {
"description": {
"value": "嘎"
}
}
}
}
NOTE1: 通过使用 term 查询得知 ES 中默认使用分词器为
标准分词器(StandardAnalyzer)
,标准分词器对于英文单词分词,对于中文单字分词。
NOTE2: 通过使用 term 查询得知,在ES的Mapping Type 中 keyword , date, integer, long , double , boolean or ip 这些类型不分词,
只有text类型分词
4.2、范围查询 [range]
range 关键字:用来指定查询指定范围内的文档
GET /product/_search
{
"query": {
"range": {
"price": {
"gte": 1,
"lte": 2
}
}
}
}
4.3、前缀查询 [prefix]
prefix 关键字:用来检索含有指定前缀的关键词的相关文档
GET /product/_search
{
"query": {
"prefix": {
"title": {
"value": "普通"
}
}
}
}
4.4、通配符查询 [wildcard]
wildcard 关键字: 通配符查询
? 用来匹配一个任意字符
* 用来匹配多个字符
GET /product/_search
{
"query": {
"wildcard": {
"title": {
"value": "*花生*"
}
}
}
}
4.5、多id查询 [ids]
ids 关键字: 值为数组类型,用来根据一组id获取多个对应的文档
GET /product/_search
{
"query": {
"ids": {
"values": [1,2,4]
}
}
}
4.6、模糊查询 [fuzzy]
fuzzy 关键字:用来模糊查询含有指定关键字的文档
GET /product/_search
{
"query": {
"fuzzy": {
"title": "超大葵葵"
}
}
}
注意:
fuzzy
模糊查询最大模糊错误必须在0-2之间
- 搜索关键词长度为2不允许存在模糊
- 搜索关键词长度为3-5允许一次模糊
- 搜索关键词长度大于5允许最大2模糊
4.7、布尔查询 [bool]
bool 关键字:用来组合多个条件实现复杂查询
**must:**相当于&& 同时成立
**should:**相当于|| 成立一个就行
**must_not:**相当于! 不能满足任何一个
# must (同时成立)
GET /product/_search
{
"query": {
"bool": {
"must": [
{"term": {
"title": {
"value": "超大葵花"
}
}},
{
"ids": {"values": [2]}
}
]
}
}
}
# should (满足一个就成立)
GET /product/_search
{
"query": {
"bool": {
"should": [
{"term": {
"title": {
"value": "超大葵花"
}
}},
{
"ids": {"values": [1]}
}
]
}
}
}
# must_not (取反,不满足则成立)
GET /product/_search
{
"query": {
"bool": {
"must_not": [
{"term": {
"title": {
"value": "超大葵花"
}
}}
]
}
}
}
4.8、多字段查询 [multi_match]
GET product/_search
{
"query": {
"multi_match": {
"query": "花",
"fields": ["title","description"]
}
}
}
4.9、默认字段分词查询 [query_string]
GET product/_search
{
"query": {
"query_string": {
"default_field": "description",
"query": "花和腿"
}
}
}
五、其他查询
5.1、高亮查询 [highlight]
**highlight 高亮查询:**可以让符合条件的文档的关键词高亮
GET product/_search
{
"query": {
"query_string": {
"default_field": "description",
"query": "花和腿"
}
},
"highlight": {
"pre_tags": ["<span style='color:red;'>"],
"post_tags": ["<span>"],
"require_field_match": "false",
"fields": {
"*": {}
}
}
}
5.2、返回指定条数 [size]
**size关键字:**指定查询结果中返回指定条数。 默认返回10条
GET /product/_search
{
"query": {
"match_all": {}
},
"size": 2
}
5.3、分页查询 [form]
from关键字:用来指定起始的返回位置,和size关键字连用实现分页的效果
GET /product/_search
{
"query": {
"match_all": {}
},
"from": 1,
"size": 2
}
5.4、指定字段排序 [sort]
GET /product/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": {
"order": "desc"
}
}
]
}
5.6、返回指定字段 [_source]
**_source 关键字:**是一个数组,在数组中用来指定展示哪些字段
GET /product/_search
{
"query": {
"match_all": {}
},
"_source": ["title","price"]
}
六、分词器
内置分词器
- Standard Analyzer -默认分词器,英文按单词词切分,并小写处理
- Simple Analyzer -按照单词切分(符号被过滤),小写处理
- Stop Analyzer-小写处理,停用词过滤(the,a,is)
- Whitespace Analyzer-按照空格切分,不转小写
- Keyword Analyzer-不分词,直接将输入当作输出
中文分词器
在ES中支持中文分词器非常多如smartCN、IK等,推荐的就是 IK分词器
。
1、官网下载
https://github.com/medcl/elasticsearch-analysis-ik/releases
2、解压文件
3、移动
把文件夹移动到 es 容器的 plugins
文件夹目录下(推荐使用卷挂载技术)
sudo docker cp /mnt/e/develop/application/ik-7.17.0 95752ce86ff4:/usr/share/elasticsearch/plugins/
4、重启容器,进行测试
# 测试分词器(粗粒度)
POST /_analyze
{
"analyzer": "ik_smart",
"text": "中华人民共和国国歌"
}
# 测试分词器(细粒度)
POST /_analyze
{
"analyzer": "ik_max_word",
"text": "中华人民共和国国歌"
}
扩展词、停用词配置
lK支持自定义扩展词典
和停用词典
扩展词典
就是有些词并不是关键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入扩展词典。停用词典
就是有些词是关键词,但是出于业务场景不想使用这些关键词被检索到,可以将这些词放入停用词典。
定义扩展词典和停用词典可以修改IK分词器中 config
目录中 IKAnalyzer.cfg.xml
这个文件。
默认推荐使用的配置:
修改完成后,重启容器即可!
七、过滤查询
过滤适合在大范围筛选数据,而查询则适合精确匹配数据。一般应用时,应先使用过滤操作过滤数据,然后使用查询匹配数据。
必须和bool
配合使用
GET /product/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"description": {
"value": "花"
}
}
}
],
"filter": [
{
"term": {
"description": "哈"
}
}
]
}
}
}
八、整合应用
观看:https://www.bilibili.com/video/BV1SQ4y1m7Ds