Elasticsearch使用记录
- 简介
- 常用API
-
- PUT新增文档记录
- POST更新
- POST新增
- GET根据id获取
- DELETE根据id删除
- POST文档的批量增删改
- [GET _mget:批量读取文档数据](#GET _mget:批量读取文档数据)
- 文档的搜索
-
- 对集群中所有的索引进行搜索
- 搜索指定索引
- 模糊搜索指定索引
- [URL Search相关示例](#URL Search相关示例)
- [Request Body Search示例](#Request Body Search示例)
- 聚合分析
- 其它API
- Elasticsearch-head
- ELK
- 文档内容识别
简介
Elasticsearch是一个非常欠打的搜索和分析引擎。适用于所有类型的数字=,包括文字、数字、地理空间、结构化和非结构化数据。
在Elasticsearch中,文档(document)是所有可搜索数据的最小单位。它被序列化成JSON存储在Elasticsearch中。每个文档都会有一个唯一的ID,这个ID可以自己指定或者交给Elasticsearch自动生成。
常用API
PUT新增文档记录
PUT {index_name}/_create/{id}:新增一条文档记录,必须保证对应ID的文档不存在;
POST更新
POST {index_name}/_update/{id}:不会删除原先文档,实现真正的数据更新,可以增加字段或者修改某些字段
例如:对索引users中ID=1的文档进行更新操作
POST users/_update/1
{
"doc":{
"user":"admin",
"message":"学习ES",
"class":"one",
"age":30
}
}
PUT {index_name}/_doc/{id}:新增一条文档记录,如果记录已经存在,则删除原先文档,版本信息会加1;
POST新增
POST {index_name}/_doc/:新增一条文档记录,ID会自动生成;
GET根据id获取
GET {index_name}/_doc/{id}:根据id获取某一文档记录;
DELETE根据id删除
DELETE {index_name}/_doc/{id}:根据ID删除一条文档
POST文档的批量增删改
POST _bulk:文档的批量增删改
例如:
POST _bulk
{"index": {"_index": "users", "_id": "1"}}
{"user": "sysadmin"}
{"delete":{"_index": "users", "_id": "2"}}
{"create":{"_index": "users", "_id": "3"}}
{"user": "zhangsan","message": "学习ES","age": 30}
{"update":{"_index":"users","_id": "1"}}
{"doc":{"user": "helloworld"}}
首先使用POST _bulk来指定进行批量操作。接下来按顺序进行操作,每个操作都用JSON对象来表示。
第一个操作是`index`,将一个记录插入到名为"users"的索引中,记录的ID为"1"。 对象内部的`user`字段为`sysadmin`;
第二个操作是`delete`,从名为"users"的索引中删除ID为"2"的记录;
第三个操作是`create`,在名为"users"的索引中创建一个新记录,记录的ID为"3"。对象内部的`user`字段为`zhangsan`,`message`字段为`学习ES`,`age`字段为30;
第四个操作是`update`,更新名为"users"的索引中ID为"1"的记录。对象内部的`doc`字段为一个子对象,包含要更新的字段,这里将`user`字段更改为`helloworld`;
每一条操作都会返回相应的执行结果。执行上述四个操作时,如果其中某些操作失败,不会影响其它操作的执行。
注意,以上示例中每一条操作都以换行符结尾,实际使用时可根据需要进行调整。
GET _mget:批量读取文档数据
例如:
GET _mget
{
"docs": [{
"_index": "users",
"_id": 1
},{
"_index": "users",
"_id": 3
},{
"_index": "users",
"_id": 2
}]
}
这是一个批量读取文档数据的Elasticsearch查询示例。使用_mget API批量获取多个文档。
相关参数和曹祖解释如下:
_index:要读取文档的索引名称;
_id:要读取文档的文档ID
上述查询将从名为"users"的索引中获取ID为1,3,2的文档数据
文档的搜索
文档的搜索分为URL Search和Request Body Search两种方式。
URL Search主要在URL中通过query string的方式传参进行查询,方便简单。
Request Body Search是通过POST的请求题Body的方式传参进行搜索,支持丰富的搜索格式,下面是相关的API。
对集群中所有的索引进行搜索
POST|GET /_search
搜索指定索引
POST|GET /index1,index2/_search
搜索索引index1和index2
模糊搜索指定索引
POST|GET /index*/_search
搜索以index开头命名的索引
以上搜索结果的是否合理,主要取决于搜索的相关性,搜索相关性由下面三个属性决定:
1、查准率:尽可能返回较少的无关文档;
2、查全率:尽量返回较多的相关文档;
3、排名:是否可以按照相关度进行排序
URL Search相关示例
搜索users索引下,user字段包含admin的内容,并对搜索结果按照year降序排序,获取前10个搜索结果,搜索超时时间为1秒
GET users/_search?q=user:admin&sort=year:desc&from=0&size=10&timeout=1s
{
"profile": true
}
q:执行查询语句
df:指定查询的默认字段
sort:按照什么字段进行排序
from/size:用于分页
profile:可以查看查询时如何被执行的
timeout:查询超时时间
对于上面查询语句q字段,Elasticsearh支持丰富的搜索格式:
普通查询:
q=status:active:表示搜索status字段中包含active的文档;
布尔查询:
1、q=title:(quick OR brown): 表示搜索 title 字段中包含 quick 或者 brown 的文档,等同于 q=title:(quick brown) 或者 q=title:(quick || brown)
2、q=title:(quick AND brown): 表示搜索 title 字段中包含 quick 并且包含 brown 的文档,等同于 q=title:(quick && brown) 或者 q=title:(quick +brown)
3、q=author:"John Smith": 表示搜索 author 字段中包含 John Smith 的文档
4、q=_exists_:title:表示搜索 title 字段为非 null 的文档
5、q=title:(quick NOT brown): 表示搜索 title 字段中包含 quick 并且不包含 brown 的文档,q=title:(quick ! brown) 或者 q=title:(quick -brown)
范围查询:
1、q=date:[2012-01-01 TO 2012-12-31]:查询 date 字段在 2012-01-01 和 2012-12-31 之间的文档
2、q=count:[10 TO *]:count 字段大于 10 的范围查询
3、q=age:(>=10 AND <20):查询 age 字段大于等于 10 且小于 20 的文档
通配符查询:
q=status:act?ve*a:"?"表示匹配一个任意字符,"*"表示匹配0个或者多个任意字符
正则查询:
q=name:/joh?n(ath[oa]n)/
模糊查询和近似查询:
1、 q=title:befutifl~1 : 表示增加,删除,替换,或者字符位置转换不超过1的模糊匹配
2、q=title:"lord rings"~2:表示lord 和 rings 中间不超过2个字符的模糊匹配情况
Request Body Search示例
POST users/_search
{
"profile": "true",
"query": {
"match": { //user字段匹配 chenmangmanga 或者 zhuweil
"user": {
"query": "chenmangmanga, zhuweil",
"operator": "OR"
}
}
},
"_source": ["user", "age"], //只返回部分字段
"from": 0, //分页
"size": 2,
"sort": [{"age": "desc"}], //排序,支持多个字段排序
"script_fields": {
"newField": { //通过脚本生成新的字段
"script": {
"lang": "painless",
"source": "doc['age'].value + '_hello'"
}
}
}
}
聚合分析
类似关系型数据库,Elasticsearch同样支持丰富的聚合运算,可以根据某个维度对数据进行求和、平均值、最大值等运算,并可以进行二次聚合运算
GET kibana_sample_data_flights/_search
{
"size": 0,
"aggs":{
"flight_dest":{
"terms":{
"field":"DestCountry" //根据字段 DestCountry 进行聚合
},
"aggs":{
"avg_price":{ // 求 AvgTicketPrice 的平均值
"avg":{
"field":"AvgTicketPrice"
}
},
"wather":{
"terms": {
"field": "DestWeather", // 二次聚合,求每个 DestCountry 下每个 DestWeather 的情况
"size": 5
}
}
}
}
}
}
Elasticsearch中聚合主要有以下几类
Bucket Aggregation:
对满足特定条件的文档的聚合,分成不同的桶,类似关系型数据库中的 Group By
Metric Aggregation:
一些数学运算,可以对文档字段进行统计分析,比如最大值,最小值,平均值的计算等
Pipeline Aggregation:
对其它的聚合结果进行二次聚合
Matrix Aggregation:
支持对多个字段的操作并提供一个结果矩阵
其它API
GET _cluster/health: 查看集群的健康状态
GET {index_name}: 查看对应索引的状态
GET {index_name}/_count:查看索引的文档总数
POST /_analyze: 使用某个分词器对文本进行分词
GET {index_name}/_mapping:查看 mapping 定义
DELETE {index_name}:删除索引
PUT {index_name}:修改 mapping 定义
PUT /_template/template_test:定义 Index Template
Elasticsearch-head
Elasticsearch-head是Elasticsearch的可视化界面,Elasticsearch是基于Rest风格的API来操作的,有了可视化界面,就不用每次都使用Get操作来查询了,能提升开发效率。
安装
首先从github下载Elasticsearch-head的安装包
下载地址: elasticsearch-head下载地址
Windows使用zip包,下载后解压
需要注意的是Elasticsearch-head是使用node.js开发的,解压后需要使用node下载所需依赖
在解压的目录,打开cmd,运行命令npm install
下载依赖后,使用命令npm run start启动
启动成功后,在浏览器访问localhost:9100
ELK
ELK是Elasticsearch + Logstash + Kibana,它是一套开源的日志管理方案,可以使用它来搭建可视化日志分析平台。
Elasticsearch是开源分布式搜索引擎;
Logstash是一个用于管理日志的工具,可以用它收集日志、转换日志、解析日志。并将他们做为数据提供给其它模块调用,例如将数据提供给Elasticsearch使用;
Kibana是一个开源和免费的数据可视化工具,可以未Elasticsearch提供有好的日志分析web界面,可以帮助汇总、分析和搜索重要数据日志。
版本选择
在使用Elasticsearch的时候,要注意版本的选择,在后续SpringBoot中使用Elasticsearch的时候,SpringBoot版本和Elasticsearce版本之间是影响的。Spring官网对ES使用和Spring相关依赖版本之间也做了说明,下面链接时对应关系
Elasticsearch下载安装和配置
除了使用上面url进行下载外,可以自行到官网下载。
下载ES的时候同时下载对应版本的Kibana。
下载解压后目录如下:
主要说明config和bin目录,bin目录存放启动文件,config中存放配置文件.config下的文件如下:
jvm.options文件中可以配置jvm运行参数,如果服务器过小,对应的需要下调参数。版本不同,默认的jvm参数有所不同。
Elasticsearch.yml配置文件中可进行端口、是否允许外部访问、端口等的设置。其中:
path.data:指定数据存储位置
path.logs:指定日志存储位置
http.port:指定运行端口
需要注意的是,在elasticserach8版本开始,项目首次启动后,配置文件会自动出现关于ssl相关的配置,如果是本地开发使用,没有ssl相关配置的情况下,需要将配置xpack.security.enabled的值修改为false,否则服务启动后,无法访问。
配置完成后,双击bin目录下的elasticsearch.bat即可启动。
重置密码
IK分词器
下载时注意要与Elasticsearch保持一致.
ES默认分词器不包括IK分词器。分词器作用是把一段内容划分成一个个关键字或者单词,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,比如"我爱中国"会被分为"我""爱""中""国",这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。
ik分词器提供了两种分词算法:ik_smart和ik_max_work,其中ik_smart是最少切分,ik_max_work是最细粒度划分。
下载后解压到ElasticSearch解压目录下的plugins文件夹下,需要注意的是,注意目录结构,ik分词器解压包解压后如果没有父级目录,则需要在plugins下先创建一个服务目录,用于存放ik分词器的解压文件.
在plugins文件夹下创建一个新的文件夹,用于存放ik分词器解压文件
重新启动ES,查看ik分词器是否安装成功
Kibana安装配置
Kibana用于Elasticsearch数据的可视化展示和分析。通过Kibana你不需要每次通过命令去执行,而且可以直接在界面操作。
解压下载好的Kibana安装包,注意版本号和ElasticSearch保持一致。解压后的config目录下的kibana.yml为配置文件。
解压目录下bin目录下的kibana.bat为启动文件,双击即可启动
启动后访问kibana默认访问地址即可:http://localhost:5601/
启动后选择Dev Tolls
在控制台编写分词请求,即可进行测试
生成令牌
配置Elasticsearch用户名和密码
如果在上面的Elasticsearch中重置了用户名和密码,那么此处就需要配置,反之不需要。
词典扩展(自定义词库)
IK分词器主要配置说明
IK配置文件地址:ik/config目录,下面是以下主要配置文件含义
IKAnalyzer.cfg.xml:用来配置自定义词库
main.dic:ik 原生内置的中文词库,总共有 27 万多条,只要是这些单词,都会被分在一起
quantifier.dic:放了一些单位相关的词
suffix.dic:放了一些后缀
surname.dic:中国的姓氏
stopword.dic:英文停用词
我们在使用ik分词器对内容分词后,如果没有得到自己想要的分词结果,则可以配置自己的扩展字典。就是在IK分词器中加入我们自定义的字典,在词典中加入想要的词
在ik分词器文件的config目录中新建自定义的字典文件,以.dic为后缀,并在文件中加入自定义的词。
然后打开IKAnalyzer.cfg.xml文件,把自定义字典添加到IK的字典中
配置多个自定义词库
可以在IKAnalyzer.cfg.xml配置文件中进行多个自定义词库的配置
需要注意配置文件中custom目录实在ik分词器插件的config目录下创建的。
重新启动ES和Kibana,在用分词器对内容进行分词,此时自定义的词语就会出现
文档内容识别
要用ES实现文本附件内容的识别,需要先给ES安装一个插件:Ingest Attachment Processor Plugin
Ingest Attachment Processor Plugin是一个文本抽取插件,本质上是利用了Elasticsearch的ingest node功能,提供了关键的预处理器attachment。在ES安装目录的bin目录下运行以下命令即可安装:
bash
elasticsearch-plugin install ingest-attachment
创建文本抽取管道
主要用于将上传的附件转换成文本内容,支持word、PDF、txt等
bash
PUT /_ingest/pipeline/attachment
{
"description": "Extract attachment information",
"processors": [
{
"attachment": {
"field": "content",
"ignore_missing": true
}
},
{
"remove": {
"field": "content"
}
}
]
}