概念介绍
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
详细示例
-
term 不分词
-
terms
4. range 用于date或number类型的字段范围查询-
match 匹配查询,用评分机制(TF/IDF)进行打分
-
match_all 查询所有
-
multi_match 多字段匹配查询
-
match_phrase 有顺序要求,查询指定段落
-
query_string
-
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
集群
kibana | URI Search | 作用 |
---|---|---|
GET / | http://IP:9200/ | 查看集群信息 |
GET _cat/health?v | http://IP:9200/_cat/health?v | 查询集群健康信息 |
GET _cat/nodes?v | http://IP:9200/_cat/nodes?v | 查询集群节点信息 |
GET _cat/allocation?v | http://IP:9200/_cat/allocation?v | 查询集群数据节点信息 |
索引
method | kibana | URI Search | 作用 |
---|---|---|---|
GET | GET * | http://IP:9200/_cat/indices?v | 查看所有索引列表 |
GET | GET {index} | http://IP:9200/{索引名称} | 查看指定索引 元数据 |
文档
method | kibana | 等同 URI Search | 作用 |
---|---|---|---|
GET | GET /_search | 空搜索, 搜索集群 下所有文档 | |
GET | GET {index}/_search | http://IP:9200/{索引名称}/_search | 搜索 索引 下所有文档 |
GET | GET {index}/{type}/_search | 搜索 索引/类型 下所有文档 | |
GET | GET /_all/{type}/_search | 搜索 所有索引/类型 的文档 | |
GET | GET {index}/{type}/{id} | 索引/类型/id 获取唯一文档 | |
POST | GET {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过滤字段
- includes:来指定想要显示的字段
- 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"
}
索引信息
method | url | 作用 |
---|---|---|
PUT | http://IP:9200/{索引名称} | 创建索引 |
GET | http://IP:9200/_cat/indices?v | 查看所有索引 |
GET | http://IP:9200/{索引名称} | 查看单个索引 |
DELETE | http://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
method | url | 作用 |
---|---|---|
POST | http://IP:9200/{索引名称}/{文档名称} | 创建文档(随机id) |
POST | http://IP:9200/{索引名称}/{文档名称}/{id} | 创建文档(指定id) |
GET | http://IP:9200/{索引名称}/{文档名称}/{id} | 查看文档 |
POST | http://IP:9200/{索引名称}/{文档名称}/{id} | 更新文档=创建覆盖文档 |
POST | http://IP:9200/{索引名称}/{文档名称}/{id}/_update | 更新字段 |
DELETE | http://IP:9200/{索引名称}/{文档名称}/{id} | 删除文档 |
POST | http://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