ElasticSearch进阶篇之-Query DSL
ElasticSearch官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/getting-started-search.html
1.ES中的检索方式
在ElasticSearch中支持两种检索方式
- 通过使用REST request URL 发送检索参数(uri+检索参数)
- 通过使用 REST request body 来发送检索参数 (uri+请求体)
第一种方式
GET bank/_search # 检索bank下的所有信息,包括 type 和 docs
GET bank/_search?q=*&sort=account_number:asc
响应结果信息
信息 | 描述 |
---|---|
took | ElasticSearch执行搜索的时间(毫秒) |
time_out | 搜索是否超时 |
_shards | 有多少个分片被搜索了,统计成功/失败的搜索分片 |
hits | 搜索结果 |
hits.total | 搜索结果统计 |
hits.hits | 实际的搜索结果数组(默认为前10条文档) |
sort | 结果的排序key,没有就按照score排序 |
score和max_score | 相关性得分和最高分(全文检索使用) |
第二种方式
通过使用 REST request body 来反射检索参数 (uri+请求体)
GET bank/_search
{
"query":{
"match_all":{}
},
"sort":[
{
"account_number":"desc"
}
]
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
2.Query DSL
2.1 基本语法
ElasticSearch提供了一个可以执行的JSON风格的DSL(domain-specific language 领域特定语言),这个被称为Query DSL,该查询语言非常全面,并且刚开始的时候感觉有点复杂,真正学好它的方法就是从一些基础案例开始的。
完整的语法结构
{
QUERY_NAME:{
ARGUMENT:VALUE,
ARGUMENT:VALUE,...
}
}
- 1
- 2
- 3
- 4
- 5
- 6
如果是针对某个字段,那么它的结构为
{
QUERY_NAME:{
FIELD_NAME:{
ARGUMENT:VALUE,
ARGUMENT:VALUE,...
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2.2 match
上面我们用到来的match_all是匹配所有的数据,而我们现在要讲的match是条件匹配
如果对应的字段是基本类型(非字符串类型),则是精确匹配。
GET bank/_search
{
"query":{
"match":{
"account_number":20
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
match返回的是 account_number:20的记录
如果对应的字段是字符串类型,则是全文检索
GET bank/_search
{
"query":{
"match":{
"address":"mill"
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
match返回的就是address中包含mill字符串的记录
2.3 match_phrase
将需要匹配的值当成一个整体单词(不分词)进行检索,短语匹配
GET bank/_search
{
"query":{
"match_phrase":{
"address":"mill road"
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
查询出address中包含 mill road的所有记录,并给出相关性得分
2.4 multi_match[多字段匹配]
GET bank/_search
{
"query":{
"multi_match":{
"query":"mill road",
"fields":["address","state"]
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
查询出state或者address中包含 mill road的记录
2.5 bool[复合查询]
布尔查询又叫组合查询,bool用来实现复合查询,
bool
把各种其它查询通过 must
(与)、must_not
(非)、should
(或)的方式进行组合
复合语句可以合并任何其他查询语句,包括复合语句也可以合并,了解这一点很重要,这意味着,复合语句之间可以相互嵌套,可以表达非常复杂的逻辑。
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2.6 filter[结果过滤]
并不是所有的查询都需要产生分数,特别是那些仅用于"filtering"的文档,为了不计算分数,ElasticSearch会自动检查场景并且优化查询的执行。
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
2.7 term
和match一样,匹配某个属性的值,全文检索字段用match,其他非text字段匹配用term
GET bank/_search
{
"query":{
"term":{
"account_number":20
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
检索关键字 | 描述 |
---|---|
term | 非text使用 |
match | 在text中我们实现全文检索-分词 |
match keyword | 在属性字段后加.keyword 实现精确查询-不分词 |
match_phrase | 短语查询,不分词,模糊查询 |
好了索引查询这块就介绍到这儿了
文章来源: dpb-bobokaoya-sm.blog.csdn.net,作者:波波烤鸭,版权归原作者所有,如需转载,请联系作者。
原文链接:dpb-bobokaoya-sm.blog.csdn.net/article/details/122952892
- 点赞
- 收藏
- 关注作者
评论(0)