Elasticsearch使用记录

Elasticsearch使用记录

简介

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下载安装和配置

ES下载连接

除了使用上面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分词器

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"
            }
        }
    ]
}
相关推荐
cyt涛3 小时前
搜索功能技术方案
mysql·elasticsearch·全文检索·canal·索引·数据同步·搜索
Lill_bin17 小时前
ElasticSearch底层原理解析
大数据·分布式·elasticsearch·搜索引擎·zookeeper·云原生·jenkins
Flying_Fish_roe1 天前
Spring Boot- 配置中心问题
spring boot·后端·elasticsearch
SelectDB技术团队1 天前
查询性能提升 10 倍、存储空间节省 65%,Apache Doris 半结构化数据分析方案及典型场景
数据结构·数据仓库·elasticsearch·log4j·json
Chen_leilei1 天前
ES机制原理
大数据·elasticsearch·搜索引擎
西岭千秋雪_2 天前
谷粒商城のElasticsearch
java·大数据·服务器·spring boot·elasticsearch·搜索引擎
花晓木2 天前
python清除一个月以前的ES索引文档数据
开发语言·python·elasticsearch
好想有猫猫2 天前
【Git】常见命令(仅笔记)
linux·c++·笔记·git·elasticsearch
小魏冬琅2 天前
如何通过编程工具提升工作效率
大数据·elasticsearch·搜索引擎
檀越剑指大厂2 天前
【Elasticsearch系列七】索引 crud
大数据·elasticsearch·搜索引擎