目录
1 引言
对某个字段进行全文检索,这时候就要使用到es,也就是elasticsearch,配合kibana进行数据可视化。
也可以用作elk日志分析系统。
2 搭建es环境(docker 单机)
2.1 安装es和kibana
安装最新版本的es
version: '3'
services:
elasticsearch:
restart: always
image: elasticsearch:7.14.0
container_name: elasticsearch
ports:
- 8060:9200
volumes:
- ./elasticsearch/plugins/elasticsearch-analysis-ik:/usr/share/elasticsearch/plugins/elasticsearch-analysis-ik # 分词器
- ./elasticsearch/data:/usr/share/elasticsearch/data
environment:
- discovery.type=single-node # 单节点
#- xpack.security.enabled=ture# 启动安全(需要配置密码),不启动能用但是日志一直抛错
kibana:
restart: always
image: kibana:7.14.0
container_name: kibana
ports:
- 8061:5601
environment:
# docker-compose提供的功能 使其可以访问其他容器内部 elasticsearch_url=http://elasticsearch:9200
- elasticsearch_url=http://127.0.0.1:8060 # 需要连接es的设置
depends_on: # 取决于
- elasticsearch # 监听es
安装指定版本的es
version: '3'
services:
elasticsearch:
restart: always
image: daocloud.io/library/elasticsearch:6.5.4
container_name: elasticsearch
ports:
- 8060:9200
volumes:
- ./elasticsearch/plugins/elasticsearch-analysis-ik:/usr/share/elasticsearch/plugins/elasticsearch-analysis-ik
- ./elasticsearch/data:/usr/share/elasticsearch/data
kibana:
restart: always
image: daocloud.io/library/kibana:6.5.4
container_name: kibana
ports:
- 8061:5601
environment:
# docker-compose提供的功能 使其可以访问其他容器内部 elasticsearch_url=http://elasticsearch:9200
- elasticsearch_url=http://127.0.0.1:8060
depends_on:
- elasticsearch
2.2 注意事项
- 需要安装ik中文分析器,下载完解压到elasticsearch-analysis-ik目录下即可
- es7.x已经没有类型选择,统一为_doc
- 在kibana.yml配置文件中添加一行配置(高版本适用)
i18n.locale: “zh-CN” - keyword类型的字段长度是32766,而text类型是没有长度限制一说。
keyword类型的最大支持的长度为——32766个UTF-8类型的字符。也就是说term精确匹配的最大支持的长度为32766个UTF-8个字符。
设置ignore_above后,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。也就是说ignore_above的参数的上线是32766
一般text和keyword类型共存共用。
2.3 es常见报错
docker-compose logs elasticsearch查看日志:
报错:java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes/0
原因:其实并不是es容器里的/usr/share/elasticsearch/data/nodes文件夹目录没有读写权限,实际是挂载的目录没有读写权限。
给予宿主机目录权限:[sudo] chmod 777 data
ElasticSearch启动报错,bootstrap checks failed
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
最大虚拟内存面积vm.max\u映射\u计数[65530]太低,至少增加到[262144]
编辑 /etc/sysctl.conf,追加以下内容:
vm.max_map_count=655360
保存后,执行:
sysctl -p
重新启动,成功。
2.4 Elasticsearch分片达到文档数量上限
es的shard对应lucene的index,一个index只能存储20亿个文档,5个分片大概100亿文档,达到了单个索引的文档数上限。
问题原因:
ES 的每个分片(shard)都是lucene的一个index,而lucene的一个index只能存储20亿个文档,所以一个分片也只能最多存储20亿个文档。
解决办法:
直接删除日志索引,Fluentd会自动创建新的日志索引,新的日志数据就成功写入了。
3 es的Restful Api
# 删除索引
DELETE /localdeployment-server
# 新建doc索引 类型news 指定数据结构
# 默认5 1 单机下不生效 集群才生效
# "settings": {
# "number_of_shards": 5,
# "number_of_replicas": 1
# },
PUT /doc
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"news":{
"properties":{
"name":{
"type":"keyword"
},
"desc":{
"type":"text",
"analyzer":"ik_max_word"
},
"text":{
"type":"text",
"analyzer":"ik_max_word",
"index":true,
"store":false
},
"create_time":{
"type":"date",
"format":"yyyy-MM-dd HH:mm:ss"
}
}
}
}
}
POST /doc/news
{
"name":"早间新闻",
"desc":"这是早间新闻摘要",
"text":"这是早间新闻内容",
"create_time":"2021-8-6 11:28:00"
}
# term查询
POST /doc/news/_search
{
"from":0,
"size":5,
"query":{
"match": {
"desc": "早间新闻"
}
}
}
POST /doc/news/_search
{
"query":{
"match_all": {}
}
}
POST /localdeployment-server/doc/_search
{
"query":{
"term": {
"content":"数据库"
}
},
"highlight": {
"fields": {
"content": {}
},
"pre_tags": "<font color='red'>",
"post_tags": "</font>",
"fragment_size": 50
}
}
POST /localdeployment-server/doc
{"fileName":"初心砥柱天地间.txt","transFilePath":"F:\\uploadFile\\documentTransFiles\\2021\\08\\03\\1627974320361_中文-英语_1627974320389_translation.txt","contrastTransFilePath":"F:\\uploadFile\\documentTransFiles\\2021\\08\\03\\1627974320361_中文-英语_1627974320389_contrast.txt","userId":2,"content":"40多","createTime":1627974320000,"id":2474,"fileType":"txt"}
POST /localdeployment-server/doc/_search
{
"query": {
"match": {
"content": "博客",
"fileName": "新建文本文档 (2).txt"
}
}
}
# 先找到符合的数量
POST /localdeployment-server/doc/_search
{
"aggs": {
"agg": {
"date_range": {
"field": "createTime",
"format": "yyyy",
"ranges": [
{
"from": "2020",
"to": "2022"
}
]
}
}
}
}
# must []存放不同的查询 ps:size在java中设定
POST /localdeployment-server/doc/_search
{
"from": 0,
"size": 1000,
"query": {
"bool": {
"must": [
{
"match": {
"fileType": "文件类型15"
}
},
{
"match": {
"content": "MySQL"
}
},
{
"match": {
"userId": "15"
}
},
{
"range": {
"createTime": {
"gte": "2020 10",
"lte": "2021 10",
"format": "yyyy MM"
}
}
}
]
}
},
"highlight": {
"fields": {
"content": {}
},
"pre_tags": "<font color='red'>",
"post_tags": "</font>",
"fragment_size": 100
}
}
# 根据文件id去删除
POST /localdeployment-server/doc/_delete_by_query
{
"query":{
"match":{
"userId":15
}
}
}
4 Elasticsearch中如何进行日期(数值)范围查询
参考这个文章,写的很详细:https://www.cnblogs.com/shoufeng/p/11266136.html