真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ES中怎么利用filter提高查詢效率

這篇文章將為大家詳細(xì)講解有關(guān)ES中怎么利用filter提高查詢效率,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

主要從事網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、響應(yīng)式網(wǎng)站建設(shè)、程序開(kāi)發(fā)、微網(wǎng)站、小程序制作等,憑借多年來(lái)在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)絡(luò)營(yíng)銷(xiāo)經(jīng)驗(yàn),集策劃、開(kāi)發(fā)、設(shè)計(jì)、營(yíng)銷(xiāo)、管理等多方位專(zhuān)業(yè)化運(yùn)作于一體,具備承接不同規(guī)模與類(lèi)型的建設(shè)項(xiàng)目的能力。

bool查詢簡(jiǎn)介

Elasticsearch(下面簡(jiǎn)稱ES)中的bool查詢?cè)跇I(yè)務(wù)中使用也是比較多的。在一些非實(shí)時(shí)的分頁(yè)查詢,導(dǎo)出的場(chǎng)景,我們經(jīng)常使用bool查詢組合各種查詢條件。

Bool查詢包括四種子句,

  • must

  • filter

  • should

  • must_not

我這里只介紹下must和filter兩種子句,因?yàn)槭俏覀兘裉煲v的重點(diǎn)。其它的可以自行查詢官方文檔。

  1. must, 返回的文檔必須滿足must子句的條件,并且參與計(jì)算分值

  2. filter, 返回的文檔必須滿足filter子句的條件。但是跟Must不一樣的是,不會(huì)計(jì)算分值, 并且可以使用緩存

從上面的描述來(lái)看,你應(yīng)該已經(jīng)知道,如果只看查詢的結(jié)果,must和filter是一樣的。區(qū)別是場(chǎng)景不一樣。如果結(jié)果需要算分就使用must,否則可以考慮使用filter。

光說(shuō)比較抽象,看個(gè)例子,下面兩個(gè)語(yǔ)句,查詢的結(jié)果是一樣的。

使用filter過(guò)濾時(shí)間范圍,

GET kibana_sample_data_ecommerce/_search
{
  "size": 1000, 
  "query": {
    "bool": {
      "must": [
        {"term": {
          "currency": "EUR"
        }}
      ],
      "filter": {
        "range": {
          "order_date": {
            "gte": "2020-01-25T23:45:36.000+00:00",
            "lte": "2020-02-01T23:45:36.000+00:00"
          }
        }
      }
    }
  }
}
 

使用must過(guò)濾時(shí)間范圍,

GET kibana_sample_data_ecommerce/_search
{
  "size": 1000, 
  "query": {
    "bool": {
      "must": [
        {"term": {
          "currency": "EUR"
        }},
        {"range": {
          "order_date": {
            "gte": "2020-01-25T23:45:36.000+00:00",
            "lte": "2020-02-01T23:45:36.000+00:00"
          }
        }}
      ]
    }
  }
}
 

查詢的結(jié)果都是,

{
  "took" : 25,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1087,
      "relation" : "eq"
    },

    ...
   

filter比較高效的原理

上一節(jié)你已經(jīng)知道了must和filter的基本用法和區(qū)別。簡(jiǎn)單來(lái)講,如果你的業(yè)務(wù)場(chǎng)景不需要算分,使用filter可以真的讓你的查詢效率飛起來(lái)。

為了說(shuō)明filter查詢高效的原因,我們需要引入ES的一個(gè)概念 query contextfilter context。

query context

query context關(guān)注的是,文檔到底有多匹配查詢的條件,這個(gè)匹配的程度是由相關(guān)性分?jǐn)?shù)決定的,分?jǐn)?shù)越高自然就越匹配。所以這種查詢除了關(guān)注文檔是否滿足查詢條件,還需要額外的計(jì)算相關(guān)性分?jǐn)?shù).

filter context

filter context關(guān)注的是,文檔是否匹配查詢條件,結(jié)果只有兩個(gè),是和否。沒(méi)有其它額外的計(jì)算。它常用的一個(gè)場(chǎng)景就是過(guò)濾時(shí)間范圍。

并且filter context會(huì)自動(dòng)被ES緩存結(jié)果,效率進(jìn)一步提高。

對(duì)于bool查詢,must使用的就是query context,而filter使用的就是filter context。

我們可以通過(guò)一個(gè)示例驗(yàn)證下。繼續(xù)使用第一節(jié)的例子,我們通過(guò)kibana自帶的search profiler來(lái)看看ES的查詢的詳細(xì)過(guò)程。

使用must查詢的執(zhí)行過(guò)程是這樣的:

ES中怎么利用filter提高查詢效率

ES中怎么利用filter提高查詢效率

可以明顯看到,此次查詢計(jì)算了相關(guān)性分?jǐn)?shù),而且score的部分占據(jù)了查詢時(shí)間的10分之一左右。

filter的查詢我就不截圖了,區(qū)別就是score這部分是0,也就是不計(jì)算相關(guān)性分?jǐn)?shù)。

除了是否計(jì)算相關(guān)性算分的差別,經(jīng)常使用的過(guò)濾器將被Elasticsearch自動(dòng)緩存,以提高性能。

我自己曾經(jīng)在一個(gè)項(xiàng)目中,對(duì)一個(gè)業(yè)務(wù)查詢場(chǎng)景做了這種優(yōu)化,當(dāng)時(shí)線上的索引文檔數(shù)量大概是3000萬(wàn)左右,改成filter之后,查詢的速度幾乎快了一倍。

我截了幾張圖,你來(lái)感受下。

ES中怎么利用filter提高查詢效率


 

 

ES中怎么利用filter提高查詢效率

可以看到時(shí)間整個(gè)縮短了一半。

關(guān)于“ES中怎么利用filter提高查詢效率”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。


本文名稱:ES中怎么利用filter提高查詢效率
路徑分享:http://weahome.cn/article/gejsei.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部