DSL結構化查詢

查詢的分類

Leaf query Cluase 葉子查詢(簡單查詢)

這種查詢可以單獨使用种柑,針對指定的字段查詢指定的值亡脑。

Compound query clauses 復雜查詢

復雜查詢可以包含葉子或者其它的復雜查詢語句猜绣,用于組合成復雜的查詢語句课舍,比如not, bool等。

查詢雖然包含這兩種谐宙,但是查詢的行為還與查詢的執(zhí)行環(huán)境有關烫葬,不同的執(zhí)行環(huán)境,查詢操作也不一樣凡蜻。查詢的行為取決于他們所在的查詢上下文搭综,包括Query查詢上下文Filter查詢上下文

查詢與過濾

Query查詢上下文

在Query查詢上下文中划栓,查詢會回答這個問題:這個文檔匹不匹配查詢條件兑巾?它的相關性高么?

除了決定文檔是夠匹配忠荞,針對匹配的文檔蒋歌,查詢語句還會計算一個相關性分值,分數(shù)越高委煤,匹配度越高堂油,默認返回是越靠前。

Filter查詢上下文

在Filter過濾器上下文中碧绞,查詢會回答這個問題:這個文檔是否匹配府框?

這個結果要么“不是”要么“是”,不會計算分值問題讥邻,也不會關心返回的排序問題,這樣性能方面就比Query查詢高了迫靖。Filter過濾器主要用于過濾結構化數(shù)據(jù),例如:時間戳范圍是否在2015-2016之間兴使?status字段是否被設置成“published"?另外系宜,常用的過濾器會自動緩存Elasticsearch,加速性能鲫惶。

原則上來說蜈首,使用查詢語句做全文本搜索或其他需要進行相關性評分的時候实抡,剩下的全部用過濾語句欠母。

兩段不同的檢索方式
query檢索
filter檢索

語法

1. 增刪改查關鍵字

PUT 新建

  • 新建索引 PUT /$index
  • 新建文檔 PUT /$index/$type/$document_id (修改文檔和新建文檔的方式是一樣的,id相同的情況下,數(shù)據(jù)會被覆蓋)

DELETE 刪除

  • 刪除索引配置 DELETE /$index
  • 刪除文檔 DELETE /$index/$type/$document_id

GET/POST 查詢

  • 查詢索引配置 GET /$index/_settings | POST /$index/_settings
  • 查詢文檔 GET /$index/$type/_search | POST /$index/$type/_search (無type可不加type)

2. 全文檢索

2.1 過濾

  • term 過濾

term主要用于精確匹配哪些值欢策,比如數(shù)字,日期赏淌,布爾值或 not_analyzed 的字符串(未經切詞的文本數(shù)據(jù)類型)踩寇。

{ "term": { "date":   "2017-07-01" }} 
{ "term": { "title":    "內蒙古"  }}

我們在外層再加入 query 的上下文關系,就是完整的例子六水。如下俺孙,過濾所有文章標題是內蒙古的。

{ 
  "query": { 
    "term": { 
      "title": "內蒙古" 
    } 
  } 
}
  • terms 過濾

terms 跟 term 有點類似掷贾,但 terms 允許指定多個匹配條件睛榄。 如果某個字段指定了多個值,那么文檔需要一起去做匹配想帅。

{
    "terms": {"title": [  "內蒙古",  "黑龍江"  ] }
}

完整的例子场靴,所有文章標題是 內蒙古 或 黑龍江 的:

{
  "query": {
    "terms": {
      "title": [
        "內蒙古",
        "黑龍江"
      ]
    }
  }
}
  • range 過濾

range過濾允許我們按照指定范圍查找一批數(shù)據(jù)。范圍操作符包含:【gt :: 大于 】 【 gte:: 大于等于 】【 lt :: 小于 】【lte:: 小于等于】

一個完整的例子港准, 查詢發(fā)表時間在2017-06-25和2017-07-01之間的數(shù)據(jù)旨剥。

{
  "query": {
    "range": {
      "pubTime": {
        "gt": "2017-06-25",
        "lt": "2017-07-01"
      }
    }
  }
}
  • exists 和 missing 過濾

exists 和 missing 過濾可以用于查找文檔中是否包含指定字段或沒有某個字段,類似于SQL語句中的IS_NULL條件浅缸。

這兩個過濾只是針對已經查出一批數(shù)據(jù)來轨帜,但是想區(qū)分出某個字段是否存在的時候使用。

{ 
    "exists":   { 
        "field":    "title" 
    } 
} 
  • bool 過濾

bool 過濾可以用來合并多個過濾條件查詢結果的布爾邏輯衩椒,它包含一下操作符:

  1. must :: 多個查詢條件的完全匹配,相當于 and蚌父。
  2. must_not :: 多個查詢條件的相反匹配,相當于 not毛萌。
  3. should :: 至少有一個查詢條件匹配, 相當于 or梢什。

這些參數(shù)可以分別繼承一個過濾條件或者一個過濾條件的數(shù)組:

{ 
    "bool": { 
        "must":     { "term": { "folder": "inbox" }}, 
        "must_not": { "term": { "tag":    "spam"  }}, 
        "should": [ 
                    { "term": { "starred": true   }}, 
                    { "term": { "unread":  true   }} 
        ] 
    } 
}
  • filter 過濾器

官方例子如下:

GET /_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title":   "Search"        }},
        { "match": { "content": "Elasticsearch" }}
      ],
      "filter": [
        { "term":  { "status": "published" }},
        { "range": { "publish_date": { "gte": "2015-01-01" }}}
      ]
    }
  }
}
  • filter 參數(shù)則表示這個子查詢處于 filter context 中
  • filter 語句中的 term 和 range 語句用在 filter context 中,它們只起到過濾的作用朝聋,并不會計算文檔的得分嗡午。

如果你想同時使用 query 和 filter 查詢的話,需要使用 {query:{filtered:{}}}包含這兩個查詢語法冀痕。好處是荔睹,借助于filter的速度可以快速過濾出文檔,然后再由query根據(jù)條件來匹配言蛇。

# SELECT document FROM products where price = 20
# filtered 查詢價格是20的商品
GET /store/products/_search
{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "price": 200
        }
      }
    }
  }
}
 
 
# 也可以指定多個值
GET /store/products/_search
{
  "query": {
    "filtered": {
      "filter": {
        "terms": {
          "price": [10, 20]
        }
      }
    }
  }
}

# SELECT product FROM products WHERE productID = "SD4535233"
# 由于默認分析器進行分析僻他,會將大寫轉小寫
GET /store/products/_search
{
  "query": {
    "filtered": {
      "filter": {
        "term": {
          "productID": "sd4535233"
        }
      }
    }
  }
}

2.2 查詢

  • match_all 查詢

可以查詢到所有文檔,是沒有查詢條件下的默認語句腊尚。

{ 
    "match_all": {} 
}
  • match 查詢

match查詢是一個標準查詢吨拗,不管你需要全文本查詢還是精確查詢基本上都要用到它。

如果你使用 match 查詢一個全文本字段,它會在真正查詢之前用分析器先分析match一下查詢字符:

{
  "query": {
    "match": {
      "content": "韓國 上海 北京"
    }
  }
}

match查詢只能就指定某個確切字段某個確切的值進行搜索劝篷,而你要做的就是為它指定正確的字段名以避免語法錯誤哨鸭。

{ "match": { "age": 12}} 
{ "match": { "pubTime":   "2017-07-01" }} 
{ "match": { "title":    "韓國"  }}
  • multi_match 查詢

multi_match查詢允許你做match查詢的基礎上同時搜索多個字段,在多個字段中同時查一個娇妓。

查詢文章標題和內容包含烏魯木齊的數(shù)據(jù):

{
  "query": {
    "multi_match": {
      "query": "烏魯木齊",
      "fields": [
        "title",
        "content"
      ]
    }
  }
}
  • bool 查詢

bool 查詢與 bool 過濾相似像鸡,用于合并多個查詢子句。不同的是哈恰,bool 過濾可以直接給出是否匹配成功只估, 而bool 查詢要計算每一個查詢子句的 _score (相關性分值)。

  1. must:: 查詢指定文檔一定要被包含着绷。
  2. must_not:: 查詢指定文檔一定不要被包含蛔钙。
  3. should:: 查詢指定文檔,有則可以為文檔相關性加分荠医。

以下查詢將會找到 title 字段中包含 "how to make millions"夸楣,并且 "tag" 字段沒有被標為 spam。 如果有標識為 "starred" 或者發(fā)布日期為2014年之前子漩。

{ 
    "bool": { 
        "must":     { "match": { "title": "how to make millions" }}, 
        "must_not": { "match": { "tag":   "spam" }}, 
        "should": [ 
            { "match": { "tag": "starred" }}, 
            { "range": { "date": { "gte": "2014-01-01" }}} 
        ] 
    } 
}

提示: 如果bool 查詢下沒有must子句豫喧,那至少應該有一個should子句。但是 如果有must子句幢泼,那么沒有should子句也可以進行查詢紧显。

  • wildcards 查詢

使用標準的shell通配符查詢。

以下查詢能夠匹配包含W1F 7HW和W2F 8HW的文檔:

{ 

    "query": { 
        "wildcard": { 
            "postcode": "W?F*HW" 
        } 
    } 
}

又比如下面查詢 hostname 匹配下面shell通配符的:

{
  "query": {
    "wildcard": {
      "title": "烏魯*"
    }
  }
}
  • regexp 查詢

假設您只想匹配以W開頭缕棵,緊跟著數(shù)字的郵政編碼孵班。使用regexp查詢能夠讓你寫下更復雜的模式:

{ 
    "query": { 
        "regexp": { 
            "postcode": "W[0-9].+" 
        } 
    } 
}

這個正則表達式的規(guī)定了詞條需要以W開頭,緊跟著一個0到9的數(shù)字招驴,然后是一個或者多個其它字符篙程。

下面例子是所有以 wxopen 開頭的正則:

{ 
  "query": { 
    "regexp": { 
      "hostname": "wxopen.*" 
    } 
  } 
}
  • prefix 查詢

以什么字符開頭的,可以更簡單地用 prefix别厘,如下面的例子:

{
  "query": {
    "prefix": {
      "title": "美味的"
    }
  }
}
  • 短語匹配(Phrase Matching)

當你需要尋找鄰近的幾個單詞時虱饿,你會使用match_phrase查詢:

{
  "query": {
    "match_phrase": {
      "content": "端午 旅游 云南"
    }
  }
}

和match查詢類似,match_phrase查詢首先解析查詢字符串來產生一個詞條列表触趴。然后會搜索所有的詞條氮发,但只保留含有了所有搜索詞條的文檔,并且詞條的位置要鄰接冗懦。

match_phrase查詢也可以寫成類型為phrase的match查詢:

{
  "query": {
    "match": {
      "content": {
        "query": "端午 旅游 云南",
        "type": "phrase"
      }
    }
  }
}

2.3 處理返回內容

  • _source (source filter)

通過在_source中指定 includes 和 excludes爽冕,控制查詢結果中哪些source字段要返回、哪些source字段不需要返回披蕉。 "_source": false (不指定source字段)颈畸、"_source": ["wheather"] (指定返回源字段wheather)乌奇。

{
    "_source": {
        "includes": [ "obj1.*", "obj2.*" ],
        "excludes": [ "*.description" ]
    },
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}
  • sort 排序

可以指定按一個或多個字段排序。也可通過_score指定按評分值排序眯娱,_doc 按索引順序排序礁苗。默認是按相關性評分從高到低排序。

//order 值:asc困乒、desc寂屏。如果不給定贰谣,默認是asc娜搂,_score默認是desc
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }    },
    {
      "balance": {
        "order": "asc"
      }    },
    "_score"
  ]
}
  • docvalue_fields

允許返回每個表示命中字段的文檔值。

{
    "query" : {
        "match_all": {}
    },
    "docvalue_fields" : ["test1", "test2"]
}

請注意吱抚,如果fields參數(shù)指定了沒有docvalues的字段百宇,它將嘗試從fielddata緩存加載值,導致該字段的項被加載到內存(緩存)秘豹,這將導致更多的內存消耗携御。

  • explain 返回文檔的評分解釋
{
    "explain": true,
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}
  • min_score 限制最低評分得分
{
    "min_score": 0.5,
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}
  • post_filter 后置過濾

在查詢命中文檔、完成聚合后既绕,再對命中的文檔進行過濾啄刹。

如:要在一次查詢中查詢品牌為gucci且顏色為紅色的shirts,同時還要得到gucci品牌各顏色的shirts的分面統(tǒng)計凄贩。

{
  "query": {
    "bool": {
      "filter": {
        "term": { "brand": "gucci" } 
      }
    }
  },
  "aggs": {
    "colors": {
      "terms": { "field": "color" } 
    }
  },
  "post_filter": { 
    "term": { "color": "red" }
  }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末誓军,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疲扎,更是在濱河造成了極大的恐慌昵时,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椒丧,死亡現(xiàn)場離奇詭異壹甥,居然都是意外死亡,警方通過查閱死者的電腦和手機壶熏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門句柠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棒假,你說我怎么就攤上這事俄占。” “怎么了淆衷?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵缸榄,是天一觀的道長。 經常有香客問我祝拯,道長甚带,這世上最難降的妖魔是什么她肯? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮鹰贵,結果婚禮上晴氨,老公的妹妹穿的比我還像新娘。我一直安慰自己碉输,他們只是感情好籽前,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著敷钾,像睡著了一般枝哄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阻荒,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天挠锥,我揣著相機與錄音,去河邊找鬼侨赡。 笑死蓖租,一個胖子當著我的面吹牛,可吹牛的內容都是我干的羊壹。 我是一名探鬼主播蓖宦,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼油猫!你這毒婦竟也來了稠茂?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤眨攘,失蹤者是張志新(化名)和其女友劉穎主慰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲫售,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡共螺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了情竹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藐不。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖秦效,靈堂內的尸體忽然破棺而出雏蛮,到底是詐尸還是另有隱情,我是刑警寧澤阱州,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布挑秉,位于F島的核電站,受9級特大地震影響苔货,放射性物質發(fā)生泄漏犀概。R本人自食惡果不足惜立哑,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姻灶。 院中可真熱鬧铛绰,春花似錦、人聲如沸产喉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曾沈。三九已至这嚣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晦譬,已是汗流浹背疤苹。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工互广, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敛腌,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓惫皱,卻偏偏與公主長得像像樊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旅敷,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容

  • 前言 ES提供了豐富多彩的查詢接口生棍,可以滿足各種各樣的查詢要求。更多內容請參考: ELK修煉之道 Query DS...
    小七奇奇閱讀 240評論 0 0
  • 前言 ES提供了豐富多彩的查詢接口媳谁,可以滿足各種各樣的查詢要求涂滴。更多內容請參考: ELK修煉之道 Query DS...
    小七奇奇閱讀 2,350評論 0 0
  • 原文:https://my.oschina.net/liuyuantao/blog/751438 查詢集API 參...
    陽光小鎮(zhèn)少爺閱讀 3,813評論 0 8
  • 七夕叙凡, 中國式情人節(jié)一疯, 故事總把愛情修飾的很美麗, 蕓蕓眾生饲常,總能明白锤躁,看破紅塵搁料, 方能樂意。
    九沁沁閱讀 66評論 0 1
  • 包包是小版系羞,容量不算特別大但是也還蠻能裝的郭计,沒有配件也很可愛喲,搭配上泡芙花一瞬間又多了一些小清新元素椒振。 圖解如下...
    lalalalalynne閱讀 1,025評論 0 0