Elasticsearch 介绍
Elasticsearch
是一个开源的分布式全文本搜索和分析引擎。它支持RESTful操作,并允许您实时存储,搜索和分析大量数据。
官方文档
官方 Python 库
下载 安装 Elasticsearch
# 安装
dpkg -i elasticsearch-7.10.0-amd64.deb
启动 停止 重启
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
sudo systemctl stop elasticsearch.service
sudo systemctl restart elasticsearch
启用401验证
# 修改配置文件中 network.host 的值为 0.0.0.0 或指定IP
sudo vim /etc/elasticsearch/elasticsearch.yml
# 配置文件最后加上一下三行配置,开启401验证机制
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.license.self_generated.type: basic
设置用户密码
# 通过命令交互设置密码
elasticsearch-setup-passwords interactive
ES 字段类型
元数据字段
- _index 文档所属的索引
- _type 文档映射类型
- _id 文档唯一ID
- _source 文档正文的原始Json
- _size 源字段的字节大小,由映射大小插件提供
- _field_names 文档中所有非空值字段名
- _ignored 忽略不正常文档
- _routing 自定义路由,用于将文档路由到特定的分片
- _meta 程序特定的元数据
数据字段
- 常规类型
- binary Base64编码的二进制数据
- boolean 布尔值(true, false)
- Keywords 关键字族
- keyword 用于结构化内容,例如ID,电子邮件地址,主机名,状态代码,邮政编码或标签
- constant_keyword 常量关键字
- wildcard 模糊查询关键字
- Numbers 数字类型
- long 有符号长整型 64位
- integer 有符号整型 32位
- short 有符号短整型 16位
- byte 字节类型 8位
- double 双精度浮点型 64位
- float 单精度浮点型 32位
- half_float 半精度浮点型 16位
- scaled_float 缩放浮点数(其实是个整型)
- unsigned_long 无符号长整型 64位
- Dates 日期类型
- alias 别名,为已经存在的字段定义别名
- 对象关系类型
- object Json对象
- flattened 单个字段值的Json对象
- nested Json对象,保留了子字段之间的关系
- join 为同一索引中的文档定义父/子关系
- 结构数据类型
- Range 范围类型
- integer_range 整型范围类型
- float_range 浮点数范围类型
- long_range 长整型范围类型
- double_range 双精度浮点数范围类型
- date_range 日期范围类型
- ip_range IP范围类型
- 文档
- ip IPv4和IPv6
- version 版本类型
- murmur3 Hash的计算和存储
- Range 范围类型
- 聚合类型(Aggregate data types)
- histogram 数值聚合
- 全文检索类型(Text search types)
- text 非结构化文本
- annotated-text 包含特殊标记的文本
- completion 搜索自动补全
- search_as_you_type 自定义自动完成类型?
- token_count 标记计数?
- 文档排名类型(Document ranking types)
- dense_vector 记录浮点值的密集向量
- sparse_vector 记录浮点值的稀疏向量
- rank_feature 记录一个数字特性以提高查询时的命中率
- rank_features 记录数字特性以提高查询时的命中率
- 空间数据类型(Spatial data types)
- geo_point 纬度和经度
- geo_shape 复杂的形状,如多边形
- point 任意笛卡尔点 什么是笛卡尔点
- shape 任意的笛卡尔几何图形
- 其他类型
- percolator DSL编写的索引查询
新建MAPPINGS
# MAPPING 结构
{"mappings": {"properties": {}}}
# 举个栗子
{
"mappings": {
"properties": {
"age": { "type": "integer" },
"email": { "type": "keyword" },
"name": { "type": "text" }
}
}
}
查询
叶子查询
- match 分词查询
- term 精确匹配
- range 范围匹配
# 简单查询,举个栗子
{
"query": {
"match": {
"message": "this is a test"
}
}
}
复合查询
- must 必须匹配,计分
- must_not 必须不匹配,计分
- filter 必须匹配,不计分
- should 应该匹配(对应OR)
# 举个栗子
{
"query": {
"bool" : {
"must" : {
"term" : { "user.id" : "kimchy" }
},
"filter": {
"term" : { "tags" : "production" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
},
"should" : [
{ "term" : { "tags" : "env1" } },
{ "term" : { "tags" : "deployed" } }
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}
}
脚本查询
遇到的坑
- 查询时不指定
size
ES默认返回10条数据 - ES默认最多返回
10000
条数据 should
和must
并列使用,should
看起来不起作用,实际上是和must
并列使用时should
沦为了打分选项- ES的批量插入真蛋疼,循环单条插入巨慢
报错处理
# 错误内容
the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
# 解决方案
vim /etc/sysctl.conf
# 在最后添加
vm.max_map_count=655360
# 保存后执行
sysctl -p
# 修改配置文件 elasticsearch.yml
# 取消注释保留一个节点
cluster.initial_master_nodes: ["node-1"]