1. 程式人生 > >ES:Query DSL搜尋語法

ES:Query DSL搜尋語法

1、Query DSL的基本語法

{
    QUERY_NAME: {
        ARGUMENT: VALUE,
        ARGUMENT: VALUE,...
    }
}

{
    QUERY_NAME: {
        FIELD_NAME: {
            ARGUMENT: VALUE,
            ARGUMENT: VALUE,...
        }
    }
}

例:

GET /test_index/test_type/_search 
{
  "query": {
    "match": {
      "test_field": "test"
    }
  }
}

2、如何組合多個搜尋條件

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

  • must:: 查詢指定文件一定要被包含。
  • must_not:: 查詢指定文件一定不要被包含。
  • should:: 查詢指定文件,有則可以為文件相關性加分。
    在這裡插入圖片描述

3、filter與query對比

在這裡插入圖片描述

filter,僅僅只是按照搜尋條件過濾出需要的資料而已,不計算任何相關度分數,對相關度沒有任何影響

query,會去計算每個document相對於搜尋條件的相關度,並按照相關度進行排序

一般來說,如果你是在進行搜尋,需要將最匹配搜尋條件的資料先返回,那麼用query;如果你只是要根據一些條件篩選出一部分資料,不關注其排序,那麼用filter
除非是你的這些搜尋條件,你希望越符合這些搜尋條件的document越排在前面返回,那麼這些搜尋條件要放在query中;如果你不希望一些搜尋條件來影響你的document排序,那麼就放在filter中即可

filter,不需要計算相關度分數,不需要按照相關度分數進行排序,同時還有內建的自動cache最常使用filter的資料

query,相反,要計算相關度分數,按照分數進行排序,而且無法cache結果

4、各種query搜尋語法

1、match all
可以查詢到所有文件,是沒有查詢條件下的預設語句。

GET /_search
{
    "query": {
        "match_all": {}
    }
}

此查詢常用於合併過濾條件。 比如說你需要檢索所有的郵箱,所有的文件相關性都是相同的,所以得到的_score為1.
2、match
match查詢是一個標準查詢,不管你需要全文字查詢還是精確查詢基本上都要用到它。
如果你使用 match 查詢一個全文字欄位,它會在真正查詢之前用分析器先分析match一下查詢字元:

GET /_search
{
  "query": {
    "match": {
      "title": "my elasticsearch article"
    }
  }
}

做精確匹配搜尋時,你最好用過濾語句,因為過濾語句可以快取資料。

3、multi match
multi_match查詢允許你做match查詢的基礎上同時搜尋多個欄位,在多個欄位中同時查一個

GET /company/employee/_search
{
  "query": {
    "multi_match": {
      "query": "xian",
      "fields": ["address.*", "name"]
    }
  }
}

4、range query
range過濾允許我們按照指定範圍查詢一批資料:

  • gt :: 大於
  • gte:: 大於等於
  • lt :: 小於
  • lte:: 小於等於
GET /company/employee/_search 
{
  "query": {
    "range": {
      "age": {
        "gte": 30
      }
    }
  }
}

5、term query
term主要用於精確匹配哪些值,比如數字,日期,布林值或 not_analyzed 的字串(未經分析的文字資料型別):

GET /company/employee/_search 
{
  "query": {
    "term": {
      "join_date": "2015-01-01"
    }
  }
}

6、terms query
terms 跟 term 有點類似,但 terms 允許指定多個匹配條件。 如果某個欄位指定了多個值,那麼文件需要一起去做匹配:

GET /company/employee/_search
{
  "query": {
    "terms": {
      "age": [
        30,
        35
      ]
    }
  }
}