全文检索
简介
Docker安装ElasticSearch
1.获取镜像
docker pull elasticsearch:7.14.0
2.运行es
docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.14.0
9300端口: ES节点之间通讯使用
9200端口: ES节点 和 外部 通讯使用
discovery.type=single-node:以单机模式启动
3.限制内存使用
进入容器内目录/usr/share/elasticsearch/config,编辑jvm.options文件
建议设置最大内存为服务器内存的一半,这里设置为1g
4.重启后,访问ES
http://127.0.0.1:9200
Kibana
elasticsearch作为全文检索服务器,提供了restful风格的接口,可以使用postman等工具访问,但最好的选择是官方提供的Kibana客户端,提供了可视化统计分析等功能
简介
Docker安装Kibana
1.获取镜像
docker pull kinbana:7.14.0
2.运行kibana
创建挂载目录,并设置文件权限为777
chmod 777 kibana.yml
启动容器
docker run -d --name my_kibana -p 5601:5601 -v /home/vagrant/volum/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.14.0
3.进入容器
docker exec -it wdwdww bash
4.进入/usr/share/kibana/config文件夹,编辑kibana.yml文件
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
server.host: "0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://192.168.56.10:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
将elasticsearch.hosts改为真实的elasticsearch地址
5.退出并重启容器
kibana访问地址:127.0.0.1:5601
6.使用图形界面中的dev-tool测试,出现以下结果代表kibana已成功链接elasticsearch
三个核心概念
索引
映射
文档
基本操作
索引的基本操作
索引的操作只有增加、删除和查询,没有修改
# 查看es索引 ?v代表显示列名
GET /_cat/indices?v
# 创建索引
PUT /products
# 创建索引时添加主数据块和副本数据块数量
PUT /products01
{
"settings": {
"number_of_shards": 1
, "number_of_replicas": 0
}
}
# 删除索引
DELETE /products
映射的基本操作
# 创建商品索引 指定mapping{id,title,price,create_time,description}
PUT /products
{
"settings": {
"number_of_shards": 1
, "number_of_replicas": 0
},
"mappings": {
"properties": {
"id":{
"type": "integer"
},
"title":{
"type": "keyword"
},
"price":{
"type": "double"
},
"create_time":{
"type": "date"
},
"description":{
"type": "text"
}
}
}
}
# 查看指定索引的映射信息
GET /products/_mapping
文档的基本操作
# 添加文档 手动指定id
POST /products/_doc/1
{
"title":"iphone13",
"price":9999.9,
"create_time":"2011-12-11",
"description":"iphone13跳楼大甩卖"
}
# 添加文档 自动生成id
POST /products/_doc/
{
"title":"iphone13",
"price":9999.9,
"create_time":"2011-12-11",
"description":"iphone13跳楼大甩卖"
}
# 查询文档 根据id
GET /products/_doc/1
# 删除文档 根据id
DELETE /products/_doc/2xc-4n4BrYqvbzk1umjf
# 更新文档(这种方式是先删除原有文档,再将更新文档插入)
PUT /products/_doc/1
{
"title":"iphone13",
"price":9999.9,
"create_time":"2011-12-11",
"description":"iphone13跳楼大甩卖"
}
# 更新文档(只更新指定字段)
POST /products/_doc/1/_update
{
"doc":{
"title":"华为手机"
}
}
文档的批量操作
# 文档的批量新增操作
POST /products/_doc/_bulk
{"index":{"_id":2}}
{"title" : "华为手机","price" : 9999.9,"create_time" : "2011-12-11","description" : "iphone13跳楼大甩卖"}
{"index":{"_id":3}}
{"title" : "小米手机","price" : 9999.9,"create_time" : "2011-12-11","description" : "iphone13跳楼大甩卖"}
{"index":{"_id":4}}
{"title" : "苹果手机","price" : 9999.9,"create_time" : "2011-12-11","description" : "iphone13跳楼大甩卖"}
# 文档的批量新增、修改、删除操作
POST /products/_doc/_bulk
{"update":{"_id":2}}
{"doc":{"title":"你是王八蛋"}}
{"index":{"_id":5}}
{"title" : "黑米手机","price" : 9999.9,"create_time" : "2011-12-11","description" : "iphone13跳楼大甩卖"}
{"delete":{"_id":4}}
ps:文档的批量操作不具有原子性,批量操作时文档不支持换行
高级查询Quert DSL
match_all——查询所有
# match_all关键字:查询所有
GET /products/_search
{
"query":{
"match_all":{}
}
}
term——关键词查询
# term关键字:使用关键词查询
# keyword、interger、double、date类型不分词,搜索使用全部搜索
# text类型搜索使用ES默认分词器,中文单字分词,英文单词分词
GET /products/_search
{
"query": {
"term": {
"description": {
"value": "卖"
}
}
}
}
range——范围查询
# range关键字:范围查询
GET /products/_search
{
"query": {
"range": {
"price": {
"gt": 0,
"lte": 10000
}
}
}
}
prefix——前缀查询
# prefix关键字:前缀查询
GET /products/_search
{
"query": {
"prefix": {
"title": {
"value": "苹果"
}
}
}
}
wildcard——通配符查询
# wildcard关键字:通配符查询 ?匹配一个任意字符,*匹配多个任意字符
GET /products/_search
{
"query": {
"wildcard": {
"title": {
"value": "?果*"
}
}
}
}
ids——多id查询
# ids关键字:多id查询
GET /products/_search
{
"query": {
"ids": {
"values": ["1","2","3"]
}
}
}
fuzzy——模糊查询
# fuzzy关键字:模糊查询
# fuzziness:允许出现偏差的个数
GET /products/_search
{
"query": {
"fuzzy": {
"description": {
"value": "跳楼了"
, "fuzziness": 2
}
}
}
}
bool——布尔查询
# bool关键字:模糊查询
# must:相当于&&同时成立
# should:相当于||成立一个即可
# must_not:相当于!不能满足
GET /products/_search
{
"query": {
"bool": {
"should": [
{
"ids": {
"values": [1]
}
},
{
"range": {
"price": {
"gte": 10,
"lte": 20
}
}
}
]
}
}
}
multi_match——多字段查询
# multi_match关键字:多字段查询
GET /products/_search
{
"query": {
"multi_match": {
"query": "跳楼",
"fields": ["title","description"]
}
}
}
query_string——默认字段分词查询
# query_string关键字:默认字段分词查询
# 查询字段分词就将查询条件分词,查询字段不分词那么查询条件也不分词
GET /products/_search
{
"query": {
"query_string": {
"default_field": "description",
"query": "熊大熊二来卖蜂蜜"
}
}
}
highlight——高亮查询
# highlight关键字:高亮查询
GET /products/_search
{
"query": {
"query_string": {
"default_field": "description",
"query": "熊大熊二来卖蜂蜜"
}
},
"highlight": {
"pre_tags": ["<span style = 'color:red;'>"],
"post_tags": ["</span>"],
"require_field_match": "false",
"fields": {
"*":{}
}
}
}
效果:
IK分词器
安装IK分词器
下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.14.0
解压后将解压文件丢进:/usr/share/elasticsearch/plugins 目录,重启容器即可
Ik分词器的使用
# IK分词器测试(粗略)
POST /_analyze
{
"analyzer": "ik_smart",
"text": "中华人民共和国国歌"
}
# IK分词器测试(精细)
POST /_analyze
{
"analyzer": "ik_max_word",
"text": "中华人民共和国国歌"
}
扩展词与停用词配置
IK支持自定义扩展词与停用词配置
配置扩展词
进入:/home/vagrant/volum/plugins/elasticsearch-analysis-ik-7.14.0/config 目录,编辑【IKAnalyzer.cfg.xml】文件
创建对应的ext.dic和stop.dic文件,每一个关键字独占一行
测试:
# IK分词器测试(粗略)
POST /_analyze
{
"analyzer": "ik_smart",
"text": "马保国使用闪电鞭"
}
分词结果
停用词配置同理
Filter Query过滤查询
常见的过滤类型有:term、terms、range、exits、ids等filter
GET /products/_search
{
"query": {
"bool": {
"must": [
{"range": {
"price": {
"gte": 10,
"lte": 99999
}
}}
],
"filter": [
{"term": {
"title": "米"
}}
]
}
}
}
PS:
在指定filter和query时,先执行filter再执行query
ES会自动缓存经常使用的过滤器,以加快性能
SpringBoot集成ElasticSearch
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
创建配置类
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("192.168.56.10:9200")
.build();
return RestClients.create(clientConfiguration).rest();
}
}
两种客户端对象
ElasticsearchOperations(对象形式)
RestHighLevelClient(restful风格,类似于kibana)推荐
SpringBoot整合Elasticsearch7基于RestHighLevelClient工具类:https://www.jianshu.com/p/55fb1d5992b2
聚合查询
ElasticSearch常用查询及聚合分析:https://zhuanlan.zhihu.com/p/183816335
asticsearchClient() {
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(“192.168.56.10:9200”)
.build();
return RestClients.create(clientConfiguration).rest();
}
}
两种客户端对象
ElasticsearchOperations(对象形式)
RestHighLevelClient(restful风格,类似于kibana)推荐
SpringBoot整合Elasticsearch7基于RestHighLevelClient工具类:https://www.jianshu.com/p/55fb1d5992b2
# 聚合查询
[外链图片转存中...(img-Mq2euQSh-1644892049774)]
ElasticSearch常用查询及聚合分析:https://zhuanlan.zhihu.com/p/183816335
本科计算机bi-ye-she-ji辅导,远程安装运行+部署,欢迎各位小伙伴打扰~企鹅号:298-150-5753