1、官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/index.html
SearchAPI
ES 支持两种基本方式检索:
- 一个是通过使用 REST request URL 发送搜索参数(uri+检索参数)
- 另一个是通过使用 REST request body 来发送它们(uri + 请求体)
2、检索信息
一、切检索从_search开始
GET bank/_search |
检索bank下所有信息,包括type和docs |
GET bank/_search?q=*&sort=account_number:asc |
请求参数方式检索 |
入参Params解释: q=* 查询所有 sort=account_number:asc 按照account_number 升序排列 |
|
响应结果解释: took-Elasticsearch 执行搜索的时间(毫秒) time_out 告诉我们搜索是否超时 _shards- 告诉我们多少个分片被搜索了,以及统计了成功/失败的搜索分片 hits- 搜索结果 hits.total- 搜索结果 hits.hits- 实际的搜索结果数组(默认为前10的文档) sort- 结果的排序 key (键) (没有则按score 排序) score- 和 max_score - 相关性得分和最高得分(全文检索用)
|
二、uri+请求体进行检索
GET /bank/_search { "query": { "match_all": {} }, "sort": [{ "account_number": "asc" }] } |
|
HTTP 客户端工具(POSTMAN),get请求不能携带请求体,我们变为post也是一样的 我们post一个JSON风格的查询请求体到_searchAPI。 需要了解 ,一旦搜索的结果被返回,Elasticsearch 就完成了这次请求,并不会维护任何服务端的资源或者结果的cursor(游标)
|
3、Query DSL
1)、基本语法格式
Elasticsearch 提供了一个可以执行查询的Json风格的DSL(domain-specific language 领域特定语言)。这个被称为 Query DSL 。该查询语言非常全面,并且刚开始的时候感觉有点复杂,真正学好它的方法是从一些基础的示例开始的。
- 一个查询语句 的典型结构
{ QUERY_NAME:{ ARGUMENT: VALUE, ARGUMENT:VALUE,..... } }
- 如果是针对某个字段,那么它的结构如下:
{ QUERY_NAME:{ FIELD_NAME:{ AGRUMENT: VALUE, AGRUMENT: VALUE,....... } } }
GET /bank/_search { "query": { "match_all": {}
}, "from": 0, "size": 5, "sort": [ { "balance": { "order": "desc" } } ] } |
|
2)、返回部分字段
GET /bank/_search { "query": { "match_all": {} }, "from": 0, "size": 5, "sort": [ { "balance": { "order": "desc" } } ], "_source": ["balance","firstname"] }
3)、match 【匹配查询】
一、基本类型(非字符串),精确匹配
GET bank/_search { "query": { "match": { "account_number": 20 } } }
match 返回 account_number = 20 的
二、字符串,全文检索
GET bank/_search { "query": { "match": { "address": "mill road" } } }
最终查出address中包含mill 或者 road 或者 mill road 的所有记录,并给出相关性得分。全文检索按照评分进行排序,会对检索条件进行分词匹配。
GET bank/_search { "query": { "match": { "address.keyword": "694 Jefferson" } } }
加了 .keyword 变成精确匹配 意思是 address = 694 Jefferson 才能被匹配出来,
和下面match_phrase 的区别是 match_phrase 是短句匹配 address 中只要有 694 Jefferson 就能被查出来
4)、match_phrase 【短句查询】
将需要匹配的值当成一个整体单词(不分词)进行检索
GET bank/_search { "query": { "match_phrase": { "address": "mill road" } } }
state 或者 address 包含 mill 或者 movico(注意 这里是分词查询!!!!)
6)、bool 【复合查询】
bool 用来做复合查询:
复合语句可以合并 任何 其它查询语句,包括复合语句,了解这一点是很重要的。这就意味着,复合语句之间可以互相嵌套,可以表达非常复杂的逻辑。
GET bank/_search { "query": { "bool": { "must": [ {"match": { "gender": "M" } }, {"match": { "address": "mill" } } ], "must_not": [ {"match": { "age": "28" }} ] ,"should": [ {"match": { "lastname": "Wallace" }} ] } } }
must 一定匹配 gender 一定是 M 的 must_not 一定不匹配 age 不等于 28 should 应该匹配 lastname 等于 Wallance 不等于也没有关系 也可以查出来
7)、filter 【结果过滤】
并不是所有的查询都需要产生分数,特别是那些仅用于“filteing” (过滤)的文档。为了不计算分数Elasticsearch会自动检查场景并且优化查询的执行。
GET bank/_search { "query": { "bool": { "must": [ {"match": { "gender": "M" } }, {"match": { "address": "mill" } } ], "must_not": [ {"match": { "age": "28" }} ] ,"should": [ {"match": { "lastname": "Wallace" }} ], "filter": { "range": { "age": { "gte": 10, "lte": 50 } } } } } }
filter不会计算相关性得分 只会对上一些条件查出的结果进行过滤,类似于JAVA stream 流 的 filter
8)、term
和match一样。匹配某个属性的值,全文检索字段用match,其他非text字段匹配term
GET bank/_search { "query": { "term": { "age": "28" } } }
9)、aggregations(执行聚合)
聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于SQL GROUP BY 和 SQL 聚合函数。在Elasticsearch中,您有执行搜索返回hits(命中结果)分隔开的能力。这是非常强大且有效的,您可以执行查询和多个聚合,并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的API来避免网络往返。
一、搜索address 中包含 mill的所有人的年龄分布以及平均年龄,但不显示这些人的详情。
GET bank/_search { "query": { "match": { "address": "mill" } }, "aggs": { "ageAgg": { "terms": { "field": "age", "size": 10 } }, "ageAvg":{"avg": { "field": "age" }}, "balanceAvg":{ "avg": { "field": "balance" } } }, "size": 0 }
ageAgg 查询年龄分布情况即 年龄为 30的有多少人
ageAvg 求age的平均值
balanceAvg 求balance的平均值
size = 0 返回值不返回查询的结果只返回聚合 aggregations 的结果
二、进阶 按照年龄聚合,并且请求这些年龄段的这些人的平均薪资。
GET bank/_search { "query": { "match_all": {} } , "aggs": { "ageAgg": { "terms": { "field": "age", "size": 100 }, "aggs": { "ageAvg": { "avg": { "field": "balance" } } } } } }
先按照年龄聚合,在求这些年龄段的平均薪资。
三、查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资。
GET bank/_search { "query": { "match_all": {} } , "aggs": { "ageAgg": { "terms": { "field": "age", "size": 100 }, "aggs": { "genderAgg": { "terms": { "field": "gender.keyword", "size": 10 }, "aggs": { "balanceAvg":{ "avg": { "field": "balance" } } } }, "ageBananceAvg":{ "avg": { "field": "balance" } } } } } }
标签:检索,search,进阶,GET,查询,Elasticsearch,bank,query,match From: https://www.cnblogs.com/mangoubiubiu/p/16757599.html