es深入搜索之結(jié)構(gòu)化搜索

??結(jié)構(gòu)化搜索(Structured search) 是指有關(guān)探詢那些具有內(nèi)在結(jié)構(gòu)數(shù)據(jù)的過(guò)程做瞪。比如日期布朦、時(shí)間和數(shù)字都是結(jié)構(gòu)化的:它們有精確的格式请敦,我們可以對(duì)這些格式進(jìn)行邏輯操作贸营。比較常見(jiàn)的操作包括比較數(shù)字或時(shí)間的范圍贾漏,或判定兩個(gè)值的大小。

1.精確值查找

??當(dāng)使用精確值查找時(shí)翁垂,我們會(huì)使用過(guò)濾器铆遭,由于它不會(huì)計(jì)算相關(guān)度硝桩,所以它的查詢速度相對(duì)較快沿猜。

??我們首先來(lái)看最為常用的 term 查詢, 可以用它處理數(shù)字碗脊、布爾值啼肩、日期以及文本。使用方式如下:

GET /index/type/_search
{
    "query" : {
        "constant_score" : {    //表示該次查詢不計(jì)算相關(guān)度衙伶,常使用它將查詢轉(zhuǎn)化為過(guò)濾
             "filter" : {
                "term" : {
                     "filed" : value
                }
            }
        }
    }
}
2.bool組合過(guò)濾器

??在第一部分中祈坠,我們講了單個(gè)過(guò)濾器的使用,在日常生活中矢劲,我們經(jīng)常要使用多個(gè)過(guò)濾器來(lái)進(jìn)行篩選結(jié)果赦拘,比如我們要選擇華為品牌,64G芬沉, 價(jià)格在2k-4k之間的手機(jī)躺同,我們要使用組合過(guò)濾器對(duì)結(jié)果進(jìn)行篩選阁猜。

??一個(gè)過(guò)濾器包括三種取值:
(1)must: 表示必須匹配,相當(dāng)于AND蹋艺。
(2)must_not: 表示必須不匹配剃袍,相當(dāng)于NOT。
(3)should:表示任一匹配即可捎谨,相當(dāng)于OR民效。
??使用案例如下(和傳統(tǒng)的sql語(yǔ)句相同,bool過(guò)濾器也支持嵌套):

查詢出產(chǎn)品為三星NOTE7,或者 產(chǎn)品為華為而且價(jià)格為30的記錄
GET /index/type/_search
{
   "query" : {
      "filtered" : {
         "filter" : {
            "bool" : {
              "should" : [
                { "term" : {"productID" : "三星NOTE7"}},
                { "bool" : {
                  "must" : [
                    { "term" : {"productID" : "華為"}},
                    { "term" : {"price" : 30}}
                    ]
                }}
              ],
              "minimum_should_match": 1
           }
         }
      }
   }
}

??注意:
??1 . bool 查詢會(huì)為每個(gè)文檔計(jì)算相關(guān)度評(píng)分 _score 涛救,再將所有匹配的 must 和 should 語(yǔ)句的分?jǐn)?shù) _score 求和畏邢,最后除以 must 和 should 語(yǔ)句的總數(shù)。其中must_not 語(yǔ)句不會(huì)影響評(píng)分检吆;它的作用只是將不相關(guān)的文檔排除棵红。
??2 .所有 must 語(yǔ)句必須匹配,所有 must_not 語(yǔ)句都必須不匹配咧栗,默認(rèn)情況下逆甜,沒(méi)有 should 語(yǔ)句是必須匹配的,只有一個(gè)例外:那就是當(dāng)沒(méi)有 must 語(yǔ)句的時(shí)候致板,至少有一個(gè) should 語(yǔ)句必須匹配交煞。可以通過(guò)設(shè)置minimum_should_match參數(shù)來(lái)設(shè)置必須匹配的should語(yǔ)句斟或,他可以使數(shù)字也可以是百分比素征。

3.查詢多個(gè)精確值

??term查詢?cè)谒阉鲉蝹€(gè)值十分有用,但是我們?nèi)绾嗡阉鳚M足多個(gè)條件的值呢萝挤?比如要搜索價(jià)格為10或者20的手機(jī)御毅,相當(dāng)于傳統(tǒng)sql語(yǔ)句中的in ,當(dāng)然使用bool查詢是一種方式,es給我們提供了terms查詢怜珍,使用方式如下:

{
    "terms" : {
        "price" : [20, 30]
    }
}

?? 注意:term和terms的操作是包含而非精確相等端蛆,比如我們使用該語(yǔ)句{ "term" : { "tags" : "search" } }進(jìn)行過(guò)濾時(shí),他會(huì)和以下兩個(gè)文檔同時(shí)匹配:

{ "tags" : ["search"] }
{ "tags" : ["search", "open_source"] }

??如果向要精確匹配酥泛,最好的操作就是增加一個(gè)字段今豆,用以存儲(chǔ)該字段包含項(xiàng)的數(shù)量,用以上為例

{ "tags" : ["search"], "tag_count" : 1 }
{ "tags" : ["search", "open_source"], "tag_count" : 2 }

在搜索條件時(shí)柔袁,將語(yǔ)句修改為bool查詢的must操作呆躲,讓tags的值為search,且tag_count的值為1

"bool" : {
        "must" : [
             { "term" : { "tags" : "search" } }, 
             { "term" : { "tag_count" : 1 } }
         ]
 }
4.范圍

?? 到目前為止捶索,我們都介紹了如何處理相等查詢插掂,對(duì)于數(shù)字過(guò)濾查詢有時(shí)會(huì)更有用,比如在淘寶上搜索手機(jī),可以在首頁(yè)的頭部可以選擇價(jià)格區(qū)間辅甥,用來(lái)更快的找到滿足自己價(jià)位的手機(jī)箩祥。

"range" : {
    "price" : {
        "gte" : greaterValue,
        "lte" : lessValue
    }
}
gt: > 大于(greater than)
lt: < 小于(less than)
gte: >= 大于或等于(greater than or equal to)
lte: <= 小于或等于(less than or equal to)

range查詢不只是能用在數(shù)字上,其他類(lèi)型也可以使用肆氓,比如日期袍祖,字符串

  1. 日期查詢
eg: 查詢過(guò)去一小時(shí)內(nèi)的所有文檔
"range" : {
    "timestamp" : {
        "gt" : "now-1h"
    }
}

??日期計(jì)算還可以應(yīng)用到具體的時(shí)間,并非只能是now這樣的占位符谢揪,只需要增加一個(gè)雙管符號(hào)||并緊跟一個(gè)一個(gè)日期表達(dá)式蕉陋。更多詳細(xì)內(nèi)容請(qǐng)看時(shí)間格式參考文檔

eg: 小于2020-01-07加一個(gè)月也就是 2020-02-07之前拨扶,2020-01-07之后的所有文檔
"range" : {
    "timestamp" : {
        "gt" : "2020-01-07 00:00:00",
        "lt" : "2020-01-07 00:00:00||+1M"
    }
}

2.字符串范圍
es在給字符串范圍操作時(shí)凳鬓,是使用的字典序或這字母順序進(jìn)行過(guò)濾的。

eg:查詢文檔字段title中只包含a的文檔患民。
"range" : {
    "title" : {
        "gte" : "a",
        "lt" :  "b"
    }
}

注意:數(shù)字和日期范圍的過(guò)濾會(huì)提高搜索性能缩举,但是字符串有可能并非如此,在對(duì)字符串過(guò)濾時(shí)匹颤,es會(huì)對(duì)每個(gè)詞項(xiàng)都進(jìn)行term過(guò)濾仅孩。

5.關(guān)于緩存

es對(duì)非評(píng)分的行為,會(huì)對(duì)結(jié)果進(jìn)行緩存印蓖。
??1. 查找匹配文檔

??2. 創(chuàng)建bitset對(duì)結(jié)果進(jìn)行緩存,該bit有一個(gè)只包含0和1的數(shù)組辽慕,用來(lái)標(biāo)記那個(gè)文檔匹配。

比如我們有三個(gè)doc
 doc1: { price : 20, productid : 1 }
 doc2: { price : 30, productid : 2 }
 doc3: { price : 40, productid : 3 }
 進(jìn)行過(guò)濾查詢 : term: { productid : 3 }
此時(shí)會(huì)創(chuàng)建bitset數(shù)組 [ 0, 0, 1]

??3. 如果有多個(gè)過(guò)濾查詢赦肃,會(huì)迭代bitsets溅蛉,對(duì)結(jié)果集進(jìn)行合并,一般會(huì)先迭代稀疏的bitset他宛,因?yàn)闀?huì)過(guò)濾大量的文檔船侧。

??4. es會(huì)根據(jù)該索引最近的所查詢的歷史狀態(tài),如果該該查詢?cè)谧罱牡?56次查詢被用到過(guò)厅各,則緩存到內(nèi)存中镜撩。如果可以則會(huì)判斷該索引所在的段是否‘足夠大’, 因?yàn)楸容^小的段最后會(huì)被合并讯检,分配緩存會(huì)被浪費(fèi)琐鲁,如果所在的段較小,該緩存會(huì)被忽略人灼。

??注意:

??1. 緩存中的bitset是增量更新的,如果新增加一個(gè)文檔顾翼,并不會(huì)對(duì)所有的bitset緩存進(jìn)行重新計(jì)算投放,而是只會(huì)計(jì)算該新文檔,然后將結(jié)果保存到bitset數(shù)組中适贸。

??2. bitset并不會(huì)依賴(lài)他所在查詢的上下文灸芳,這樣使得緩存可以加速查詢中經(jīng)常使用的部分涝桅,從而降低較少、易變的部分所帶來(lái)的消耗烙样。

    如下圖所示:會(huì)查詢?cè)谑占淝覜](méi)有讀過(guò)的冯遂,或者不在收件箱的。其中1 和2的 bitset相同谒获,盡管一個(gè)是 must 蛤肌,一個(gè)是 must_not
            "bool": {
                 "should": [
                    { "bool": {
                          "must": [
                             { "term": { "folder": "inbox" }},     1
                             { "term": { "read": false }}
                          ]
                     }},
                  { "bool": {
                         "must_not": {
                             "term": { "folder": "inbox" }          2  
                          }
                  }}
                 ]
              }

??3. es會(huì)基于使用頻率自動(dòng)緩存查詢,如果一個(gè)非評(píng)分查詢?cè)谧罱?56次查詢中被使用過(guò)批狱,且所在的段足夠大裸准,才會(huì)緩存。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赔硫,一起剝皮案震驚了整個(gè)濱河市炒俱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爪膊,老刑警劉巖权悟,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異推盛,居然都是意外死亡僵芹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)小槐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拇派,“玉大人,你說(shuō)我怎么就攤上這事凿跳〖悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵控嗜,是天一觀的道長(zhǎng)茧彤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)疆栏,這世上最難降的妖魔是什么曾掂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮壁顶,結(jié)果婚禮上珠洗,老公的妹妹穿的比我還像新娘。我一直安慰自己若专,他們只是感情好许蓖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般膊爪。 火紅的嫁衣襯著肌膚如雪自阱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天米酬,我揣著相機(jī)與錄音沛豌,去河邊找鬼。 笑死赃额,一個(gè)胖子當(dāng)著我的面吹牛加派,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爬早,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼哼丈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了筛严?” 一聲冷哼從身側(cè)響起醉旦,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桨啃,沒(méi)想到半個(gè)月后车胡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡照瘾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年匈棘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片析命。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡主卫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鹃愤,到底是詐尸還是另有隱情簇搅,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布软吐,位于F島的核電站瘩将,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏凹耙。R本人自食惡果不足惜姿现,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肖抱。 院中可真熱鬧备典,春花似錦、人聲如沸虐沥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)欲险。三九已至镐依,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間天试,已是汗流浹背槐壳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喜每,地道東北人务唐。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像带兜,于是被迫代替她去往敵國(guó)和親枫笛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 結(jié)構(gòu)化搜索 非黑即白刚照。結(jié)構(gòu)化查詢不關(guān)心文件的相關(guān)度刑巧,簡(jiǎn)單的對(duì)文檔包括或排除處理 精確值查找 盡可能多的使用過(guò)濾式查...
    潘大的筆記閱讀 310評(píng)論 0 0
  • 結(jié)構(gòu)化搜索:在結(jié)構(gòu)化查詢中,我們得到的結(jié)果總是非是即否无畔,要么存在于集合之中啊楚,要么存在于集合之外,結(jié)構(gòu)化查詢不關(guān)心文...
    我不傻_cyy閱讀 396評(píng)論 0 0
  • 結(jié)構(gòu)化搜索 在結(jié)構(gòu)化查詢中浑彰,我們得到的結(jié)果 總是 非是即否恭理,要么存于集合之中,要么存在集合之外郭变。結(jié)構(gòu)化查詢不關(guān)心文...
    2fc2a81494ac閱讀 1,830評(píng)論 0 0
  • Elastic+logstash+head簡(jiǎn)單介紹 一. 概述 ElasticSearch是一個(gè)基于Lucene的...
    柒月失凄閱讀 4,269評(píng)論 0 4
  • 前幾天和兩個(gè)高中同學(xué)吃飯诉濒,按說(shuō)三十四五歲的年齡周伦,正是風(fēng)華正茂、意氣風(fēng)發(fā)的時(shí)候循诉,結(jié)果卻是一臉的疲態(tài)横辆,有著和年齡不相符...
    處處1閱讀 2,671評(píng)論 2 3