Elasticsearch中的Query DSL

Elasticsearch提供了一個可以執行查詢的Json風格的DSL(domain-specific  language領域特定語言)。這個被稱爲Query DSL,該查詢語言非常全面,並且剛開始的時候感覺有點複雜,真正學好它的方法是從一些基礎的示例開始的。
  • 一個查詢語句的典型結構
{
    QUERY_NAME:{
        ARGUMENT: VALUE, 
        ARGUMENT: VALUE,...
    }
}
  • 如果是針對某個字段,那麼它的結構如下:
 
{
    QUERY_NAME:{
        FIELD_NAME:{
            ARGUMENT: VALUE,
            ARGUMENT: VALUE,...
        }
    }
}
 
 
{
    "query":{
        "match all":{}:
    },
    "from":0,
    "size":5,
    "sort":[
        {
           "account number": {
               "order": "desc"
            }
        }
    ]
}
  • query定義如何查詢,
  • match-all查詢類型【代表查詢所有的所有】,es中可以在query中組合非常多的查詢類型完成複雜查詢
  • 除了query參數之外,我們也可以傳遞其它的參數以改變查詢結果。如sort,size
  • from-size限定,完成分頁功能
  • sort排序,多字段排序,會在前序字段相等時後續字段內部排序,否則以前序爲準
 
2)、返回部分字段
{
    "query":{
        "match all":{}:
    },
    "sort":[
        {
           "account number": {
               "order": "desc"
            }
        }
    ],
    "from":0,
    "size":5,
    "_source":["age","balance"]
}
 
3)、match【匹配查詢】
  • 基本類型(非字符串),精確匹配
GET bank/_search
{
  "query": {
    "match": {
      "account_number": "20"
    }
  }
}
match返回account_number=20的
  • 字符串,全文檢索
GET bank/_search
{
  "query": {
    "match": {
      "address": "mill"
    }
  }
}
最終查詢出address中包含mill單詞的所有記錄
match當搜索字符串類型的時候,會進行全文檢索,並且每條記錄有相關性得分
  • 字符串,多個單詞(分詞+全文檢索)
GET bank/_search
{
  "query": {
    "match": {
      "address": "mill load"
    }
  }
}
最終查詢出address中包含mill或者road或者millroad的所有記錄,並給出相關性得分
 
4)、match_phrase【短語匹配】
將需要匹配的值當成一個整體單詞(不分詞)進行檢素
GET bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill road"
    }
  }
}
查出address中包含millroad的所有記錄,並給出相關性得分
 
5)、multi_match【多字段匹配】
GET bank/_search
{
  "query": {
    "multi_match": {
      "query": "mill",
      "fields": ["state","address"]
    }
  }
}
state或者address包含mill
 
6)、bool【複合查詢】
bool用來做複合查詢:複合語句可以合併任何其它查詢語句,包括複合語句,瞭解這一點是很重要的。這就意味
GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "gender": "M"
        }},
        {"match": {
          "address": "mill"
        }}
      ],
      "must_not": [
        {"match": {
          "age": "18"
        }}
      ],
      "should": [
        {"match": {
          "lastname": "Wallace"
        }}
      ]
    }
  }
}
 
7)、filter【過濾查詢】
GET bank/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "age": {
            "gte": 18,
            "lte": 30
          }
        }
      }
    }
  }
}
可以達到和must,must not,should相同的結果,但是沒有相關性得分
 
 
8)、term
和match一樣。匹配某個屬性的值。全文檢索字段用match,其他非text字段匹配用term
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章