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"
            }
        }
    ]
}
相关推荐
Dusk_橙子2 小时前
在elasticsearch中,document数据的写入流程如何?
大数据·elasticsearch·搜索引擎
喝醉酒的小白4 小时前
Elasticsearch 中,分片(Shards)数量上限?副本的数量?
大数据·elasticsearch·jenkins
熟透的蜗牛7 小时前
Elasticsearch 8.17.1 JAVA工具类
elasticsearch
九圣残炎11 小时前
【ElasticSearch】 Java API Client 7.17文档
java·elasticsearch·搜索引擎
risc12345613 小时前
【Elasticsearch】HNSW
elasticsearch
我的棉裤丢了14 小时前
windows安装ES
大数据·elasticsearch·搜索引擎
乙卯年QAQ16 小时前
【Elasticsearch】RestClient操作文档
java·大数据·elasticsearch·jenkins
超级阿飞20 小时前
利用Kubespray安装生产环境的k8s集群-实施篇
elasticsearch·容器·kubernetes
小诺大人1 天前
Docker 安装 elk(elasticsearch、logstash、kibana)、ES安装ik分词器
elk·elasticsearch·docker
forestsea1 天前
【Elasticsearch 】 聚合分析:桶聚合
大数据·elasticsearch·搜索引擎