elasticsearch-DSL高级查询语法

DSL语句查询

查询字符串搜索便于通过命令行完成特定(ad hoc)的搜索,但是它也有局限性(参阅简单搜索章节)。Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。
DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现

文本查询语法

模糊匹配

如搜索奥迪,会查出包含奥迪A8L 和 奥迪 和 A8L 都查询出来,按照词进行查询

GET /sunny/user/_search
{
  "query": {
    "match": {
        "car": "奥迪A8L"
      }
  }
}

短语匹配

match_phrase-短语匹配:如 搜索"奥迪A8L" 不会查出包含 "奥迪" OR "A8L" 只会查出包含 "奥迪A8L"的记录

GET /sunny/user/_search
{
  "query": {
    "match_phrase": {
        "car": "奥迪A8L"
      }
  }
}

多字段匹配

multi_match-多字段匹配:如 搜索"小云" 只要name或者car字段中包含 "小云" OR "小" OR "云" 等分词都会被查找出来

GET /sunny/user/_search
{
     "query": {
          "multi_match": {
               "query": "小云",
               "fields":["name","car"]
          }
     }
}

分页模糊查询

from:第几页
size:每页N条数据

GET /sunny/user/_search
{
  "from":0,
  "size":1,
  "query": {
    "match": {
        "car": "奥迪"
      }
  }
}

高亮搜索

会将要查询到值,高亮显示成 拆分成几个词进行查询

GET /sunny/user/_search
{
   "query" : {
       "match_phrase" : {
           "car" : "奥迪A8L"
       }
   },
   "highlight": {
       "fields" : {
           "car" : {}
       }
   }
}

结构查询语法

精确匹配

term-将按照存储在倒排索引中的确切字词进行操作,这些查询通常用于数字,日期和枚举等结构化数据,而不是全文本字段。 或者,它们允许您制作低级查询,并在分析过程之前进行

GET /sunny/user/_search
{
  "query":{
    "term": {
      "age": 48
    }
  }
}

range范围查询(1)

如查询age大于等于20小于等于30的记录

GET /sunny/user/_search
{
     "query": {
          "range": {
                "age":{
                    "gte":20,
                    "lte":30
                }
          }
     }
}

range范围查询(2)

如查询age大于20小于30的记录

GET /sunny/user/_search
{
     "query": {
          "range": {
                "age":{
                    "gt":20,
                    "lt":30
                }
          }
     }
}

range范围查询(3)

时间范围查询
now:当前时间

GET /sunny/user/_search
{
     "query": {
          "range": {
                "createDate":{
                    "gte":"2019-05-05",
                    "lte":"now"
                }
          }
     }
}

布尔查询

》比如,query的时候,会先比较查询条件,然后计算分值,最后返回文档结果;
而filter则是先判断是否满足查询条件,如果不满足,会缓存查询过程(记录该文档不满足结果);满足的话,就直接缓存结果。
综上所述,filter快在两个方面:
1 对结果进行缓存
2 避免计算分值

为下面查询socre了解做简单的铺垫

elasticsearch的搜索评分逻辑。
查询的权重基于三个因素:词频、逆向文档频率和字段长度归一值。
词频:查询词在该文档中出现的频率。频率越高,权重越高。
逆向文档频率:查询词在所有文档中出现的频率。频率越高,权重越低。可以降低日常使用的高频率词的权重。
字段长度归一值:查询字段的长度。字段长度越长,查询词权重越高,反之越低。

进一步细节说:我们查询的所有文档,会在内部做一次相关性的评分score;然后会根据这个score从大到小的排序,依次展示给客户端
如何计算评分?
Elasticsearch使用的计算评分公式TF-IDF算法的实用计算公式如下: 
score(q,d) coord(q,d)queryNorm(q)(tf (tind)idf (t)2 boost(t)norm(t,d)) 

filter过滤查询

判断是否满足精确查找条件,满足或不满足,做数据过滤,es会对结果进行缓存

查询的结果必须匹配查询条件,和must不同不会计算score

GET /sunny/user/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "age": "48"
          }
        }
      ]
    }
  }
}

must查询必须同时满足我所有条件

例如:文档字段中,age为48 和 name为小名,视图返回给用户
查询的结果必须匹配查询条件,并计算score

GET /sunny/user/_search
{
  "query":{
    "bool": {
      "must": [
        {
         "match": {
            "age": "48"
         }
        },
        {
         "match": {
            "name": "小名"
         }
        }
      ]
    }
  }
}

must_not查询不满足条件

例如:查不年龄不等于48的记录
查询结果必须不符合查询条件

GET /sunny/user/_search
{
  "query":{
    "bool": {
      "must_not": [
        {
         "match": {
            "age": "48"
         }
        }
      ]
    }
  }
}

组合查询

例如:文档字段中,age为48 和 name为小名,视图返回给用户,且过滤条件精准查询sex必须为0,视图返回给用户

GET /sunny/user/_search
{
  "query":{
    "bool": {
      "must": [
        {
         "match": {
            "age": "48"
         }
        },
        {
         "match": {
            "name": "小名"
         }
        }
      ],
      "filter": [
        {
          "term": {
            "sex": "0"
          }
        }
      ]
    }
  }
}

constant_score复合查询

将查询内部的结果文档得分都设定为1或者boost的值,多用于结合bool查询实现自定义得分(将查询的评估固定下来,不支持match,只支持filter)、布尔查询

GET /sunny/user/_search
{
     "query": {
          "constant_score": {
                "filter":{
                    "match":{
                        "age":48
                    }
                }
          }
     }
}

自定义分数查询

常量分值查询,目的就是返回指定的score,一般都结合filter使用,因为filter context忽略score
查询结果 1 > 3 分数值一样

GET /sunny/user/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "match": {
         "car":"奥迪"
        }
      },
      "boost": 3
    }
  }
}

should查询

至少满足一个条件
查询age包含48 或者 car包含奥迪的数据

GET /sunny/user/_search
{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "age": "48"
                    }
                },
                {
                    "match": {
                        "car": "奥迪"
                    }
                }
            ]
        }
    }
}

聚合查询->group by

#根据年龄字段分组查询
GET /sunny/user/_search
{
 "aggs": {
   "group_by_age": {
     "terms": { 
       "field": "age" 
       
     }
   }
 }
}

#根据条件分组
GET /sunny/user/_search
{
 "query": {
   "match": {
     "car": "奥迪"
   }
 },
 "aggs": {
   "group_by_age": {
     "terms": { "field": "age" }
   }
 }
}

#分组并求平均值
GET /sunny/user/_search
{
 "aggs": {
   "group_by_age": {
     "terms": { "field": "age" },
     "aggs" : {
               "avg_age" : {
                   "avg" : { "field" : "age" }
               }
           }
   }
 }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350