一、简介
Elasticsearch的REST API提供了一种使用HTTP协议进行与Elasticsearch交互的方式。通过发送HTTP请求并解析响应,可以执行各种操作,包括索引管理、文档操作、搜索和聚合、集群管理等。
这里先学习API接口,实现各种功能,对此有初步了解。后续章节介绍Java项目中,集成Elasticsearch,基于客户端(client)实现各种功能搜索及数据管理(基于Java语言对上述接口的实现)。
二、使用工具
Kibana 是一个开源的分析与可视化平台,设计出来用于和 Elasticsearch 一起使用的。可以用 Kibana 搜索、查看存放在 Elasticsearch 中的数据。
这里操作使用Kibana,Kibana的安装详情见之前章节,这里不再赘述。
打开Kibana,选择“Dev Tools”,即控制台插件,提供一个用户界面来和 Elasticsearch 的 REST API 交互。控制台有两个主要部分: editor ,用来编写提交给 Elasticsearch 的请求; response 面板,用来展示请求结果的响应。
三、API基础操作
3.1 命令概要
method | url地址 | 描述 |
---|---|---|
PUT(创建,修改) | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
POST(创建) | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST(修改) | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE(删除) | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET(查询) | localhost:9200/索引名称/类型名称/文档id | 查询文档通过文档ID |
POST(查询) | localhost:9200/索引名称/类型名称/文档id/_search | 查询所有数据 |
3.2 新增索引
新增索引有两种方式,一种是预先建立索引,另外创建文档时也可以新建索引
3.2.1预先建立索引(指定字段的类型)
类似于建库(建立索引和字段对应类型),也可看做规则的建立
PUT /test2
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age":{
"type": "long"
},
"birthday":{
"type": "date"
}
}
}
}
备注:PUT /test2下面不要空行
3.2.2创建文档时新建索引
如果自己的文档字段没有被指定,那么ElasticSearch就会给我们默认配置字段类型
备注:类型未来可以不使用
具体:【创建索引:test1】+【创建类型:type1】+【创建文档:id为1】
PUT /test1/type1/1
{
"name" : "zhangsan",
"age" : 18,
"sex":"男"
}
3.3 删除操作
3.3.1删除索引
3.3.2删除文档
DELETE pre_cook_company/_doc/39
3.3.3删除索引下全部文档
POST /pre_cook_company/_delete_by_query
{
"query": {
"match_all": {}
}
}
3.4 修改文档
3.4.1post方式
新的修改方式(使用post的update)
- version不会改变
- 需要注意doc
- 不会丢失字段
3.4.2put方式
①旧的(使用put覆盖原来的值)
- 版本+1(_version)
- 但是如果漏掉某个字段没有写,那么更新是没有写的字段 ,会消失
PUT /test3/_doc/1
{
"name" : "流柚是我的大哥",
"age" : 18,
"birth" : "1999-10-10"
}
GET /test3/_doc/1
// 修改会有字段丢失
PUT /test3/_doc/1
{
"name" : "流柚"
}
GET /test3/_doc/1
3.5 查找(search)
q是query,查询条件
GET /test3/_doc/_search?q=name:流柚
3.5.1查看所有文档
GET /pre_cook_sku/_search
备注:这样默认查10条
指定条数查询
GET pre_cook_company/_search
{
"query": {
"match_all": {}},
"size":10000
}
3.6 精确匹配检索
3.6.1 term
term
直接通过 倒排索引 指定词条查询- 适合查询 number、date、keyword ,不适合text
// 精确查询(必须全部都有,而且不可分,即按一个完整的词查询)
// term 直接通过 倒排索引 指定的词条 进行精确查找的
GET /blog/user/_search
{
"query":{
"term":{
"desc":"年 "
}
}
}
3.6.2range
按时间查询
GET /select_demand/_search
{
"query": {
"range": {
"createTime": {
"gte": "2024-01-21 00:00:00",
"lte": "2024-01-21 23:59:59"
}
}
}
}
3.7 模糊匹配检索
3.7.1wildcard
Elasticsearch的通配符查询是一种用于模糊搜索的强大工具。它允许你使用通配符字符来匹配文档中的特定字符串模式。
通配符查询支持两种通配符字符:
*
:匹配零个或多个字符。?
:匹配一个字符。
GET /products/_search
{
"query": {
"wildcard": {
"product_name": "elast*"
}
}
}
假设我们有一个名为"products"的索引,其中包含一个字段"product_name"用于存储产品名称。
要查询所有以"elast"开头的产品名称,可以使用通配符查询,这将返回所有产品名称以"elast"开头的文档。
3.8 分词全文检索
3.8.1match
match
:匹配(搜索query进行分词,会使用分词器解析(先分析文档,然后进行查询))_source
:过滤字段sort
:排序from
、size
分页(从第几个数据开始,返回多少条数据)
匹配数组查询
// 匹配数组 貌似不能与其它字段一起使用
// 可以多关键字查(空格隔开)
// match 会使用分词器解析(先分析文档,然后进行查询)
GET /blog/user/_search
{
"query":{
"match":{
"desc":"年龄 牛 大"
}
}
}
3.8.2match_phrase
match_phrase
查询用于匹配包含特定短语的文档。这个查询会确保文档中的某个字段按照给定的顺序包含指定的短语。
要查询包含短语"high-quality products"的文档,可以使用match_phrase
查询:
GET /products/_search
{
"query": {
"match_phrase": {
"product_description": "high-quality products"
}
}
}
这将返回所有包含短语"high-quality products"的文档,而不仅仅是包含这些单词的文档。
match_phrase
查询是一种精确匹配短语的查询类型,它通常用于需要确保特定单词按照指定顺序连续出现的场景。与简单的match
查询相比,match_phrase
更加严格,适合对短语进行精确匹配的需求。
3.9 多条件bool查询
must
相当于and
should
相当于or
must_not
相当于not (... and ...)
filter
过滤
/// bool 多条件查询
must <==> and
should <==> or
must_not <==> not (... and ...)
filter数据过滤
boost
minimum_should_match
GET /blog/user/_search
{
"query":{
"bool": {
"must": [
{
"match":{
"age":3
}
},
{
"match": {
"name": "流"
}
}
],
"filter": {
"range": {
"age": {
"gte": 1,
"lte": 3
}
}
}
}
}
}
多个值匹配查询
3.10 高亮查询
/// 高亮查询
GET blog/user/_search
{
"query": {
"match": {
"name":"流"
}
}
,
"highlight": {
"fields": {
"name": {}
}
}
}
// 自定义前缀和后缀
GET blog/user/_search
{
"query": {
"match": {
"name":"流"
}
}
,
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}
3.11 分页查询
Elasticsearch 分页查询的原理是基于 from
和 size
两个参数来实现的。from
参数表示从搜索结果的第几条开始返回数据,size
参数表示返回的数据量。通过调整这两个参数的值,可以实现分页效果。
下面是一个示例,假设我们有一个名为 books
的索引,包含了很多书籍的数据。我们想要进行分页查询,每页显示 10 条数据,并获取第 3 页的数据。
GET /books/_search
{
"from": 20, // 从第 20 条数据开始返回
"size": 10 // 返回 10 条数据
}
上述示例中,我们将 from
参数设置为 20,表示从第 20 条数据开始返回。size
参数设置为 10,表示返回 10 条数据。这样就实现了获取第 3 页的数据。
3.12 其它命令及扩展
3.12.1获取建立的规则
GET test2
3.12.2get _cat/
命令
通过get _cat/
可以获取ElasticSearch的当前的很多信息!
(1)GET /_cat/nodes:查看所有节点
(2)GET /_cat/health:查看es健康状况
(3)GET /_cat/master:查看主节点
(4)GET /_cat/indices:查看所有索引 ,等价于mysql数据库的show databases;
GET _cat/indices
GET _cat/aliases
GET _cat/allocation
GET _cat/count
GET _cat/fielddata
GET _cat/health
GET _cat/indices
GET _cat/master
GET _cat/nodeattrs
GET _cat/nodes
GET _cat/pending_tasks
GET _cat/plugins
GET _cat/recovery
GET _cat/repositories
GET _cat/segments
GET _cat/shards
GET _cat/snapshots
GET _cat/tasks
GET _cat/templates
GET _cat/thread_pool
查看目录结构
GET /_cat
查看ES中所有索引
GET _cat/indices
查看es版本
GET /
number : 是 es 的版本。
lucene_version : 是 lucene 的版本。
3.12.3ES查询结果中各个字段意思
{
"hits" : {
"total" : 14,
"hits" : [
{
"_index": "us",
"_type": "tweet",
"_id": "7",
"_score": 1,
"_source": {
"date": "2014-09-17",
"name": "John Smith",
"tweet": "The Query DSL is really powerful and flexible",
"user_id": 2
}
},
... 9 RESULTS REMOVED ...
],
"max_score" : 1
},
"took" : 4,
"_shards" : {
"failed" : 0,
"successful" : 10,
"total" : 10
},
"timed_out" : false
}
hits
返回结果中最重要的部分是 hits ,它包含 total 字段来表示匹配到的文档总数,并且一个 hits 数组包含所查询结果的前十个文档。
在 hits 数组中每个结果包含文档的 _index 、 _type 、 _id ,加上 _source 字段。这意味着我们可以直接从返回的搜索结果中使用整个文档。这不像其他的搜索引擎,仅仅返回文档的ID,需要你单独去获取文档。
每个结果还有一个 _score ,它衡量了文档与查询的匹配程度。默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照 _score 降序排列的。在这个例子中,我们没有指定任何查询,故所有的文档具有相同的相关性,因此对所有的结果而言 1 是中性的 _score 。
max_score 值是与查询所匹配文档的 _score 的最大值。
took
took 值告诉我们执行整个搜索请求耗费了多少毫秒。
shard
_shards 部分告诉我们在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。正常情况下我们不希望分片失败,但是分片失败是可能发生的。如果我们遭遇到一种灾难级别的故障,在这个故障中丢失了相同分片的原始数据和副本,那么对这个分片将没有可用副本来对搜索请求作出响应。假若这样,Elasticsearch 将报告这个分片是失败的,但是会继续返回剩余分片的结果。
timeout
timed_out 值告诉我们查询是否超时。默认情况下,搜索请求不会超时。如果低响应时间比完成结果更重要,你可以指定 timeout 为 10 或者 10ms(10毫秒),或者 1s(1秒):
GET /_search?timeout=10ms
在请求超时之前,Elasticsearch 将会返回已经成功从每个分片获取的结果。
应当注意的是 timeout 不是停止执行查询,它仅仅是告知正在协调的节点返回到目前为止收集的结果并且关闭连接。在后台,其他的分片可能仍在执行查询即使是结果已经被发送了。
使用超时是因为 SLA(服务等级协议)对你是很重要的,而不是因为想去中止长时间运行的查询