教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

DSL查詢語法常見測查詢類型有哪些?

更新時間:2021年12月24日16時53分 來源:傳智教育 瀏覽次數(shù):

DSL Query的分類

Elasticsearch提供了基于JSON的DSL(Domain Specific Language)來定義查詢。常見的查詢類型包括:

查詢所有:查詢出所有數(shù)據(jù),一般測試用。例如:match_all

全文檢索(full text)查詢:利用分詞器對用戶輸入內(nèi)容分詞,然后去倒排索引庫中匹配。例如:

  • match_query
  • multi_match_query

精確查詢:根據(jù)精確詞條值查找數(shù)據(jù),一般是查找keyword、數(shù)值、日期、boolean等類型字段。例如:

  • ids
  • range
  • term

地理(geo)查詢:根據(jù)經(jīng)緯度查詢。例如:

  • geo_distance
  • geo_bounding_box

復(fù)合(compound)查詢:復(fù)合查詢可以將上述各種查詢條件組合起來,合并查詢條件。例如:

  • bool
  • function_score
查詢的基本語法如下:

(1)全文檢索查詢

會對用戶輸入內(nèi)容分詞,常用于搜索框搜索:

①match查詢:全文檢索查詢的一種,會對用戶輸入內(nèi)容分詞,然后去倒排索引庫檢索,語法:

GET /indexName/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  }
}

②multi_match:與match查詢類似,只不過允許同時查詢多個字段,語法:

GET /indexName/_search
{
  "query": {
    "multi_match": {
      "query": "TEXT",
      "fields": ["FIELD1", " FIELD12"]
    }
  }
}

(2)精確查詢

精確查詢一般是查找keyword、數(shù)值、日期、boolean等類型字段。所以不會對搜索條件分詞。常見的有:

  • term:根據(jù)詞條精確值查詢
  • range:根據(jù)值的范圍查詢

精確查詢常見的有term查詢和range查詢。語法如下:
term查詢
// term查詢
GET /indexName/_search
{
  "query": {
    "term": {
      "FIELD": {
        "value": "VALUE"
      }
    }
  }
}
根據(jù)詞條精確匹配,一般搜索keyword類型、數(shù)值類型、布爾類型、日期類型字段
range查詢
// range查詢
GET /indexName/_search
{
  "query": {
    "range": {
      "FIELD": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}


根據(jù)數(shù)值范圍查詢,可以是數(shù)值、日期的范圍

(3)地理查詢

根據(jù)經(jīng)緯度查詢。常見的使用場景包括:

攜程:搜索我附近的酒店

滴滴:搜索我附近的出租車

微信:搜索我附近的人

根據(jù)經(jīng)緯度查詢,官方文檔。例如:

geo_bounding_box:查詢geo_point值落在某個矩形范圍的所有文檔

示例代碼如下:

// geo_bounding_box查詢
GET /indexName/_search
{
  "query": {
    "geo_bounding_box": {
      "FIELD": {
        "top_left": {
          "lat": 31.1,
          "lon": 121.5
        },
        "bottom_right": {
          "lat": 30.9,
          "lon": 121.7
        }
      }
    }
  }
}

根據(jù)經(jīng)緯度查詢,官方文檔。例如:

geo_distance:查詢到指定中心點(diǎn)小于某個距離值的所有文檔

// geo_distance 查詢
GET /indexName/_search
{
  "query": {
    "geo_distance": {
      "distance": "15km",
      "FIELD": "31.21,121.5"
    }
  }
}

(4)復(fù)合(compound)查詢:

復(fù)合查詢可以將其它簡單查詢組合起來,實(shí)現(xiàn)更復(fù)雜的搜索邏輯,例如:fuction score:算分函數(shù)查詢,可以控制文檔相關(guān)性算分,控制文檔排名。例如百度競價

相關(guān)性算分

當(dāng)我們利用match查詢時,文檔結(jié)果會根據(jù)與搜索詞條的關(guān)聯(lián)度打分(_score),返回結(jié)果時按照分值降序列。例如,我們搜索 "虹橋如家",結(jié)果如下:

Function Score Query

使用 function score query,可以修改文檔的相關(guān)性算分(query score),根據(jù)新得到的算分排序。

案例:給 如家 這個品牌的酒店排名靠前一些

把這個問題翻譯一下,function score需要的三要素:

  • 過濾條件:哪些文檔要加分
  • 算分函數(shù):如何計(jì)算function score
  • 加權(quán)方式:function score 與 query score如何運(yùn)算
示例代碼如下:
GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {// ... },
      "functions": [ // 算分函數(shù)
        {
          "filter": { // 滿足的條件,品牌必須是如家
            "term": {
              "brand": "如家"
            }
          },
          "weight": 2 // 算分權(quán)重為2
        }
      ],
      "boost_mode": "sum"
    }
  }
}

①利用復(fù)合查詢Boolean Query

布爾查詢是一個或多個查詢子句的組合。子查詢的組合方式有:

  • must:必須匹配每個子查詢,類似“與”
  • should:選擇性匹配子查詢,類似“或”
  • must_not:必須不匹配,不參與算分,類似“非”
  • filter:必須匹配,不參與算分

GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {"city": "上海" }}
      ],
      "should": [
        {"term": {"brand": "皇冠假日" }},
        {"term": {"brand": "華美達(dá)" }}
      ],
      "must_not": [
        { "range": { "price": { "lte": 500 } }}
      ],
      "filter": [
        { "range": {"score": { "gte": 45 } }}
      ]
    }
  }
}

②利用bool查詢實(shí)現(xiàn)功能

需求:搜索名字包含“如家”,價格不高于400,在坐標(biāo)31.21,121.5周圍10km范圍內(nèi)的酒店。






猜你喜歡:

一張圖讓你看懂什么是ADSL?[運(yùn)維培訓(xùn)]

軟件測試人員需要熟悉哪些系統(tǒng)操作環(huán)境?

APP功能測試與PC端軟件測試有什么區(qū)別?

BUG是什么意思?為什么用bug代指漏洞?

傳智教育軟件測試開發(fā)培訓(xùn)

0 分享到:
和我們在線交談!