概念介绍

search方式主要分为2类:URI Search和 body Search

在这里插入图片描述

1. URI Search

  • 操作简便,方便通过命令进行测试
  • URI Search 仅包含部分查询语法
    在这里插入图片描述

2. Body Search

  • 搜索条件越来越复杂 url Search会越来越长. 这时候就该用 Body Search了,把搜索条件写在请求体中
  • Body Search 支持完备的 Query DSL 查询语法
    在这里插入图片描述

查询语法 Query DSL

es提供的一套完整的基于json格式的结构化查询语法

1.Leaf query clauses 字段类查询

只针对某一个字段进行查询
特定字段中查找特定值

Term-level queries 单词级查询

单词匹配:精确匹配

  • 对倒排索引中存储的词项进行精确匹配操作。
  • 通常用于结构化数据:数字、日期和枚举类型

term:不分词
terms
range:用于date或number类型的字段范围查询
exists
prefix
wildcard
regexp
fuzzy
type
ids

Full text queries 全文查询

相关性分数匹配(Relevance scores)

  • 会对查询语句先进行分词处理,分词后查询语句的任何一个词项被匹配,文档就会被搜到
  • 通常针对text类型的字段进行全文检索,

match:匹配查询
match_phrase:有顺序要求
match_phrase_prefix
multi_match :多字段匹配查询
common_terms
query_string
simple_query_string

详细示例

  1. term 不分词

  2. terms
    在这里插入图片描述
    4. range 用于date或number类型的字段范围查询在这里插入图片描述

    1. match 匹配查询,用评分机制(TF/IDF)进行打分在这里插入图片描述

    2. match_all 查询所有

    3. multi_match 多字段匹配查询

    4. match_phrase 有顺序要求,查询指定段落

    5. query_string

    6. simple_query_string

2.Compound query clauses 复合查询

包含一个或多个字段类查询或者复合查询语句
以逻辑方式组合多个查询(如 bool 和 dis_max 查询)
或更改其行为(如 constant_score 查询)。

POST /_search
{
    "query":{
        "查询类型":{
            "查询条件":"查询条件值"
        }
    }
}

bool

  • bool :布尔查询由一个或多个布尔子句组成
    1. must 返回的文档必须满足must子句的条件,并且参与计算分值
    2. must_not 返回的文档必须不满足定义的条件
    3. filter 返回的文档必须满足filter子句的条件, 不计算分值
    4. should 如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回

在这里插入图片描述
1. must 返回的文档必须满足must子句的条件,并且参与计算分值在这里插入图片描述
2. must_not 返回的文档必须不满足定义的条件在这里插入图片描述
3. filter 返回的文档必须满足filter子句的条件, 不计算分值
用于过滤结构化数据

将查询子句传递给 filter 参数(如 bool 查询中的 filter or must_not 参数、 constant_score 查询中的 filter 参数或 filter 聚合)时,筛选器上下文就会生效。
在这里插入图片描述
5. should 如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回在这里插入图片描述
在这里插入图片描述

  • constant_score在这里插入图片描述
    在这里插入图片描述

boosting

把两个查询封装在一起并降低其中一个查询的评分

constant_score 固定评分

匹配过滤器查询条件的文档,
所有匹配的文档都被赋予相同的“常量” _score

dis_max 析取最大值

支持多并发查询
bool 查询组合了所有匹配查询的分数,
dis_max 查询则使用单个最佳匹配查询子句的分数。

function_score 函数评分

修改查询的文档得分

3. 嵌套查询 TODO

多索引查询 TODO

一个索引可以接受多个 alias 别名,而一个别名也可以映射到多个索引

索引1,索引2

聚合查询 TODO

聚合将您的数据总结为指标、统计数据或其他分析

Metric 指标聚合

根据字段值计算指标(例如总和或平均值)的指标聚合。

Bucket 存储桶聚合

存储桶聚合,根据字段值、范围或其他条件将文档分组到存储桶(也称为存储桶)中

Pipeline 管道聚合

从其他聚合而不是文档或字段获取输入。

REST API

Search APIs

_search 为endpoint,主要分为字段类查询和复合查询。

作用:搜索数据,查询语法多,功能强大

在这里插入图片描述

Cat APIs (紧凑对齐的文本 Compact and aligned)

作用:JSON很乏味,终端需要紧凑且对齐的文本
查询Elasticsearch的相关信息。包括集群中的index数量、运行状态、当前集群所在的ip,

URI Search作用
GET _cat/查看cat支持的所有 endpoint 命令 ,常用:
health:集群健康信息
nodes:集群节点信息(主节点+数据节点)
allocation:集群分配信息(数据节点 与磁盘剩余)
GET _cat/【endpoint】?help查看该endpoint 数据列含义
GET _cat/【endpoint】?v查看该endpoint的列名+数据
GET _cat/【endpoint】?v&h=列名1,列名2…查看指定列
GET _cat/【endpoint】?v&s=列名指定列排序
GET _cat/【indices】?v查看索引

Count APIs

返回符合条件的文档数

GET /{index}/_count

在这里插入图片描述

常用query

集群

kibanaURI Search作用
GET /http://IP:9200/查看集群信息
GET _cat/health?vhttp://IP:9200/_cat/health?v查询集群健康信息
GET _cat/nodes?vhttp://IP:9200/_cat/nodes?v查询集群节点信息
GET _cat/allocation?vhttp://IP:9200/_cat/allocation?v查询集群数据节点信息

索引

methodkibanaURI Search作用
GETGET *http://IP:9200/_cat/indices?v查看所有索引列表
GETGET {index}http://IP:9200/{索引名称}查看指定索引 元数据

文档

methodkibana等同 URI Search作用
GETGET /_search空搜索, 搜索集群 下所有文档
GETGET {index}/_searchhttp://IP:9200/{索引名称}/_search搜索 索引 下所有文档
GETGET {index}/{type}/_search搜索 索引/类型 下所有文档
GETGET /_all/{type}/_search搜索 所有索引/类型 的文档
GETGET {index}/{type}/{id}索引/类型/id 获取唯一文档
POSTGET {index}/_search + {json条件}高级搜索
{
    QUERY_NAME: {
        FIELD_NAME: {
            ARGUMENT: VALUE,
            ARGUMENT: VALUE,...
        }
    }
}

高级搜索

url作用
GET {index}/_search + {json条件}高级搜索
GET /索引库名/_search
{
    "query":{
        "查询类型":{
            "查询条件":"查询条件值"
        }
    }
}
match_all 查询所有
GET /_search
{
	"query": {
		"match_all": {}
	}
}
match 匹配查询
GET /_search
{
	"query": {
		"match": {
			"price":4000.00
		}
	}
}
multi_match 多字段匹配查询

在多个字段中查询。

GET /_search
{
	"query": {
		"multi_match": {
			"query": "zhangsan",
			"fields": ["name","nickname"]
		}
	}
}
term 关键字精确查询

关键词匹配查询,不对查询条件进行分词

GET /_search
{
	"query": {
		"term": {
			"name": {
				"value": "zhangsan"
			}
		}
	}
}
terms 多关键字精确查询
{
	"query": {
		"terms": {
			"name": ["zhangsan","lisi"]
		}
	}
}
range 范围查询

2019 > timestamp > 2021

{"query": 
  {"bool": 
    {"must": 
      [ {"range": 
      		{"timestamp": 
      			{"from": "2019-05-09T18:25:01.000+0800"},
      			{"to": "2021-05-09T18:25:01.000+0800"}
      		}
        }
      ]
    }
  }
}

bool 组合查询

  • must(必须 )、must_not(必须不)、should(应该)组合查询
    在这里插入图片描述
_source 查询指定字段
{
	"_source": ["name","nickname"],
	"query": {
		"terms": {
			"nickname": ["zhangsan"]
		}
	}
}
过滤字段
  • includes / excludes过滤字段
    1. includes:来指定想要显示的字段
    2. excludes:来指定不想要显示的字段
{
	"_source": {
		"includes": ["name","nickname"]
	},
	"query": {
		"terms": {
			"nickname": ["zhangsan"]
		}
	}
}
highlight 高亮
{
	"query": {
		"match": {
			"name": "zhangsan"
		}
	},
	"highlight": {
		"pre_tags": "<font color='red'>",
		"post_tags": "</font>",
		"fields": {
			"name": {}
		}
	}
}
排序
分页查询
## 默认返回10条,可用size指定返回条数,通过from指定位移
curl 'localhost:9200/accounts/person/_search'  -d '
{
    "query": {
        "match" : {
            "desc" : "软件"
        }
    },
    "from": 1,
    "size": 1
}'

query 示例数据

集群信息

  • GET http://IP:9200/
{
  "name": "eZ3dEvq",
  "cluster_name": "ElasticSearch",
  "cluster_uuid": "唯一id",
  "version": {
    "number": "5.5.3",
    "build_hash": "9305a5e",
    "build_date": "2017-09-07T15:56:59.599Z",
    "build_snapshot": false,
    "lucene_version": "6.6.0"
  },
  "tagline": "You Know, for Search"
}

索引信息

methodurl作用
PUThttp://IP:9200/{索引名称}创建索引
GEThttp://IP:9200/_cat/indices?v查看所有索引
GEThttp://IP:9200/{索引名称}查看单个索引
DELETEhttp://IP:9200/{索引名称}删除索引
  • 示例数据
{
	".kibana"【索引名】: {
		"aliases"【别名】: {},
		"mappings"【映射 mappings信息 :修改字段和类型】: {
			"timelion-sheet":{}
		},
		"settings"【settings信息 :修改分片和副本数】: {
			"index"【索引】: {
				"creation_date"【创建时间】: "1614265373911",
				"number_of_shards"【主分片数量】: "1",
				"number_of_replicas"【副分片数量】: "1",
				"mapper": {
					"dynamic": "false"
				},
				"provided_name"【名称】: ".kibana"
				"uuid"【唯一标识】: "eI5wemRERTumxGCc1bAk2A",
				"version"【版本】: {
					"created": "7080099"
				}
			}
		}
	}
}

mapping信息

  • 创建映射
curl -X PUT 'IP:9200/shopping/_mapping' -d '
{
	"properties": {
		"字段名":{
			"type": " 类型 :字符串/数字/日期/数组/对象【text、keyword(不可分词)、long、short、date、integer、Array、object】",
			"index": 是否索引【是索引就可以用来进行搜索】,
			"store": false,【是否将数据进行独立存储】,
			"analyzer": "分词器"
		},
		"name":{
			"type": "text",
			"index": true
		},
		"sex":{
			"type": "text",
			"index": false
		},
		"age":{
			"type": "long",
			"index": false
		}
	}
}'

文档 操作 CRUD

methodurl作用
POSThttp://IP:9200/{索引名称}/{文档名称}创建文档(随机id)
POSThttp://IP:9200/{索引名称}/{文档名称}/{id}创建文档(指定id)
GEThttp://IP:9200/{索引名称}/{文档名称}/{id}查看文档
POSThttp://IP:9200/{索引名称}/{文档名称}/{id}更新文档=创建覆盖文档
POSThttp://IP:9200/{索引名称}/{文档名称}/{id}/_update更新字段
DELETEhttp://IP:9200/{索引名称}/{文档名称}/{id}删除文档
POSThttp://IP:9200/{索引名称}/_delete_by_query条件删除文档
  • 创建文档
curl -X POST 'IP:9200/shopping/phone' -d '
{
	"title":"小米手机",
	"category":"小米10",
	"price":3999.00
}'
# 服务器响应结果
{
	"_index"【索引】: "shopping",
	"_type"【 类型-文档 】: "phone",
	"_id"【唯一标识】: "Xhsa2ncBlvF_7lxyCE9G", #可以类比为 MySQL 中的主键,随机生成
	"_version"【版本】: 1,
	"result"【结果】: "created", #这里的 create 表示创建成功
	"_shards"【分片】: {
		"total"【分片 - 总数】: 2,
		"successful"【分片 - 成功】: 1,
		"failed"【分片 - 失败】: 0
	},
	"_seq_no": 0,
	"_primary_term": 1
}
  • 更新字段:单价改为4000
curl -X POST 'IP:9200/shopping/phone/Xhsa2ncBlvF_7lxyCE9G/_update' -d '
{
	"doc": {
		"price":4000.00
	}
}'
  • 删除指定id的文档
curl -X DELETE 'IP:9200/shopping/phone/{id}'
  • 条件删除文档:删除单价为4000的文档
curl -X POST 'IP:9200/shopping/phone/_delete_by_query' -d '
{
	"query":{
		"match":{
			"price":4000.00
		}
	}
}'

java api

RestClient+SearchSourceBuilder

endPoint
entity/queryStr
BoolQueryBuilder

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐