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

全國(guó)咨詢/投訴熱線:400-618-4000

DSL查詢語(yǔ)法常見(jiàn)測(cè)查詢類型有哪些?

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

DSL Query的分類

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

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

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

  • 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ù)合查詢可以將上述各種查詢條件組合起來(lái),合并查詢條件。例如:

  • bool
  • function_score
查詢的基本語(yǔ)法如下:

(1)全文檢索查詢

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

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

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

②multi_match:與match查詢類似,只不過(guò)允許同時(shí)查詢多個(gè)字段,語(yǔ)法:

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

(2)精確查詢

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

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

精確查詢常見(jiàn)的有term查詢和range查詢。語(yǔ)法如下:
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)緯度查詢。常見(jiàn)的使用場(chǎng)景包括:

攜程:搜索我附近的酒店

滴滴:搜索我附近的出租車(chē)

微信:搜索我附近的人

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

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

示例代碼如下:

// 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)小于某個(gè)距離值的所有文檔

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

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

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

相關(guān)性算分

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

Function Score Query

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

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

把這個(gè)問(wèn)題翻譯一下,function score需要的三要素:

  • 過(guò)濾條件:哪些文檔要加分
  • 算分函數(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

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

  • must:必須匹配每個(gè)子查詢,類似“與”
  • 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)功能

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






猜你喜歡:

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

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

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

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

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

0 分享到:
和我們?cè)诰€交談!