elasticsearch的原理與使用

目錄

  1. 檢索需求
  2. 倒排索引與全文檢索
  3. elasticsearch的原理
  4. elasticsearch的使用
  5. 應(yīng)用與擴(kuò)展

1 檢索需求

需求特點(diǎn):
非結(jié)構(gòu)化數(shù)據(jù)
大數(shù)據(jù)量
模糊檢索
分詞檢索
拼音檢索

關(guān)系型數(shù)據(jù)庫已不能滿足使用要求

數(shù)據(jù)庫抓督,CRUD,其中檢索最常用
傳統(tǒng)數(shù)據(jù)庫有局限
模糊檢索性能差
字段很長(zhǎng)時(shí)無法索引,每次都要對(duì)每條記錄的所有文本進(jìn)行掃描
不能將搜索詞拆分政溃,搜索“吃雞戰(zhàn)場(chǎng)”就搜不出來“刺激戰(zhàn)場(chǎng)”瞪慧,無法實(shí)現(xiàn)拼音檢索等

2 倒排索引與全文檢索

全文檢索大體分兩個(gè)過程毅戈,索引創(chuàng)建 (Indexing) 和搜索索引 (Search) 驶沼。
索引創(chuàng)建:將現(xiàn)實(shí)世界中所有的結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)提取信息,創(chuàng)建索引的過程难咕。
搜索索引:就是得到用戶的查詢請(qǐng)求课梳,搜索創(chuàng)建的索引距辆,然后返回結(jié)果的過程。


2.1 倒排索引

與倒排索引相對(duì)的正向索引存儲(chǔ)的是每個(gè)文檔包含哪些字符串暮刃,例如通過文檔id查詢內(nèi)容跨算;
倒排索引存儲(chǔ)的是字符串到文件的映射

左邊保存的是一系列字符串,稱為詞典 椭懊。詞典里的詞條稱為詞條
每個(gè)詞條都指向包含此詞條的文檔(Document)鏈表诸蚕,此文檔鏈表稱為倒排表 (Posting List)。

詞條(Term):索引里面最小的存儲(chǔ)和查詢單元氧猬,對(duì)于英文來說是一個(gè)單詞背犯,對(duì)于中文來說一般指分詞后的一個(gè)詞。
詞典(Term Dictionary):或字典盅抚,是詞條Term的集合漠魏。詞典內(nèi)每條索引項(xiàng)記載單詞本身的一些信息以及指向“倒排列表”的指針。
倒排表(Post list):倒排表記錄的是某個(gè)詞在哪些文檔里出現(xiàn)過以及出現(xiàn)的位置妄均。每條記錄稱為一個(gè)倒排項(xiàng)(Posting)柱锹。倒排表記錄的不單是文檔編號(hào),還存儲(chǔ)了詞頻等信息丰包。
倒排文件(Inverted File):所有單詞的倒排列表往往順序地存儲(chǔ)在磁盤的某個(gè)文件里禁熏,這個(gè)文件被稱之為倒排文件,倒排文件是存儲(chǔ)倒排索引的物理文件邑彪。


例如瞧毙,尋找既包含字符串“l(fā)ucene”又包含字符串“solr”的文檔,需要以下幾步:

  1. 取出包含字符串“l(fā)ucene”的文檔鏈表寄症。
  2. 取出包含字符串“solr”的文檔鏈表升筏。
  3. 通過合并鏈表,找出既包含“l(fā)ucene”又包含“solr”的文件瘸爽。


    image.png

2.2 創(chuàng)建索引

第一步:一些要索引的原文檔(Document)您访。

文檔一:
Students should be allowed to go out with their friends, but not allowed to drink beer.

文檔二:
My friend Jerry went to school to see his students but found them drunk which is not allowed.

第二步:將原文檔傳給分詞器(Tokenizer)。

  1. 將文檔分成一個(gè)一個(gè)單獨(dú)的單詞剪决。
  2. 去除標(biāo)點(diǎn)符號(hào)灵汪。
  3. 去除停詞(Stop word) 檀训。

經(jīng)過分詞(Tokenizer) 后得到的結(jié)果稱為詞元(Token) 。

“Students”享言,“allowed”峻凫,“go”,“their”览露,“friends”荧琼,“allowed”,“drink”差牛,“beer”命锄,“My”,“friend”偏化,“Jerry”脐恩,“went”,“school”侦讨,“see”驶冒,“his”,“students”韵卤,“found”骗污,“them”,“drunk”沈条,“allowed”需忿。

所謂停詞(Stop word)就是一種語言中最普通的一些單詞,由于沒有特別的意義拍鲤,因而大多數(shù)情況下不能成為搜索的關(guān)鍵詞贴谎,因而創(chuàng)建索引時(shí),這種詞會(huì)被去掉而減少索引的大小季稳。
英語中停詞(Stop word)如:“the”,“a”擅这,“this”等。
對(duì)于每一種語言的分詞組件(Tokenizer)景鼠,都有一個(gè)停詞(stop word)集合仲翎。

第三步:將得到的詞元(Token)傳給語言處理組件(Linguistic Processor)。

  1. 變?yōu)樾?Lowercase)
  2. 將單詞縮減為詞根形式铛漓,如“cars ”到“car ”溯香。(stemming)
  3. 將單詞轉(zhuǎn)變?yōu)樵~根形式,如“drove ”到“drive ”浓恶。(lemmatization)
  4. 中文的話還會(huì)進(jìn)行同義詞轉(zhuǎn)換玫坛、拼音轉(zhuǎn)換等

語言處理組件(linguistic processor)的結(jié)果稱為詞(Term) 。

“student”包晰,“allow”湿镀,“go”炕吸,“their”,“friend”勉痴,“allow”赫模,“drink”,“beer”蒸矛,“my”瀑罗,“friend”,“jerry”雏掠,“go”斩祭,“school”,“see”磁玉,“his”停忿,“student”驾讲,“find”蚊伞,“them”,“drink”吮铭,“allow”时迫。

語言處理組件(linguistic processor)主要是對(duì)得到的詞元(Token)做一些同語言相關(guān)的處理。

第四步:將得到的詞(Term)傳給索引組件(Indexer)谓晌。

  1. 利用得到的詞(Term)創(chuàng)建一個(gè)詞典掠拳。


  2. 對(duì)詞典按字母順序進(jìn)行排序。


  3. 合并相同的詞(Term) 成為文檔倒排(Posting List) 鏈表纸肉。


Document Frequency
即文檔頻次溺欧,表示總共有多少文件包含這個(gè)詞。

Frequency
即詞頻率柏肪,表示此文件中包含了幾個(gè)這個(gè)詞姐刁。

創(chuàng)建索引的過程就是將文檔轉(zhuǎn)換為詞典和倒排表

2.3 搜索索引

第一步:搜索詞處理

  1. 分詞
  2. 語法規(guī)則解析,and烦味、or聂使、not

第二步:搜索索引

lucene AND learned NOT Hadoop

在反向索引表中,分別找出包含lucene谬俄,learn柏靶,hadoop的文檔鏈表
對(duì)包含lucene,learn的鏈表進(jìn)行合并操作溃论,得到既包含lucene又包含learn的文檔鏈表
將此鏈表與hadoop的文檔鏈表進(jìn)行差操作屎蜓,去除包含hadoop的文檔

第三步:計(jì)算相關(guān)度并排序

  1. 計(jì)算詞的權(quán)重

影響一個(gè)詞(Term)在一篇文檔中的重要性主要有兩個(gè)因素:
Term Frequency (tf):即此Term在此文檔中出現(xiàn)了多少次。tf 越大說明越重要钥勋。
Document Frequency (df):即有多少文檔包含次Term。df 越大說明越不重要返吻。

即:在當(dāng)前文檔中出現(xiàn)的次數(shù)越多,在其他文檔中出現(xiàn)的次數(shù)越少



詞(Term)在文檔中出現(xiàn)的次數(shù)越多测僵,說明此詞(Term)對(duì)該文檔越重要,如“搜索”這個(gè)詞沐旨,在本文檔中出現(xiàn)的次數(shù)很多,說明本文檔主要就是講這方面的事的榨婆。然而在一篇英語文檔中,this出現(xiàn)的次數(shù)更多谊迄,就說明越重要嗎烟央?不是的疑俭,這是由第二個(gè)因素進(jìn)行調(diào)整,第二個(gè)因素說明啄寡,有越多的文檔包含此詞(Term), 說明此詞(Term)太普通挺物,不足以區(qū)分這些文檔葡秒,因而重要性越低眯牧。

  1. 計(jì)算相關(guān)度

把文檔看作一系列詞(Term)学少,每一個(gè)詞(Term)都有一個(gè)權(quán)重(Term weight)版确,
所有此文檔中詞(term)的權(quán)重(term weight) 看作一個(gè)向量。
Document = {term1, term2, …… ,term N}
Document Vector = {weight1, weight2, …… ,weight N}

查詢語句也看作一個(gè)簡(jiǎn)單的文檔侵歇,也用向量來表示惕虑。

把所有搜索出的文檔向量及查詢向量放到一個(gè)N維空間中溃蔫,每個(gè)詞(term)是一維伟叛。

不同的詞(Term)根據(jù)自己在文檔中的權(quán)重來影響文檔相關(guān)性的打分計(jì)算。



兩個(gè)向量之間的夾角越小,相關(guān)性越大癞蚕。

即:搜索語句和文檔中含有的相同且權(quán)重高的詞越多辉哥,相關(guān)性越大

  1. 索引過程:
    a) 有一系列被索引文件
    b) 被索引文件經(jīng)過語法分析和語言處理形成一系列詞(Term) 派诬。
    c) 經(jīng)過索引創(chuàng)建形成詞典和反向索引表缓窜。
    d) 通過索引存儲(chǔ)將索引寫入硬盤。
  2. 搜索過程:
    a) 用戶輸入查詢語句。
    b) 對(duì)查詢語句經(jīng)過語法分析和語言分析得到一系列詞(Term) 滥搭。
    c) 通過語法分析得到一個(gè)查詢樹瑟匆。
    d) 通過索引存儲(chǔ)將索引讀入到內(nèi)存愁溜。
    e) 利用查詢樹搜索索引,從而得到每個(gè)詞(Term) 的文檔鏈表代承,對(duì)文檔鏈表進(jìn)行交次泽,差意荤,并得到結(jié)果文檔玖像。
    f) 將搜索到的結(jié)果文檔對(duì)查詢的相關(guān)性進(jìn)行排序齐饮。
    g) 返回查詢結(jié)果給用戶祖驱。

3 elasticsearch的概念

  1. 云里面的每個(gè)白色正方形的盒子代表一個(gè)節(jié)點(diǎn)——Node捺僻。
  2. 在一個(gè)或者多個(gè)節(jié)點(diǎn)直接匕坯,多個(gè)綠色小方塊組合在一起形成一個(gè)ElasticSearch的索引葛峻。
  3. 在一個(gè)索引下术奖,分布在多個(gè)節(jié)點(diǎn)里的綠色小方塊稱為分片——Shard采记。
  4. 一個(gè)ElasticSearch的Shard本質(zhì)上是一個(gè)Lucene Index。
  5. 在Lucene里面有很多小的segment晰赞,我們可以把它們看成Lucene內(nèi)部的mini-index掖鱼。里面存儲(chǔ)的是倒排文件戏挡、詞典褐墅、緩存等妥凳。

3.1 lucene

Lucene 只是一個(gè)工具包,它不是一個(gè)完整的全文檢索引擎屑那,它實(shí)現(xiàn)了倒排索引的查詢結(jié)構(gòu)持际。Lucene的目的是為軟件開發(fā)人員提供一個(gè)簡(jiǎn)單易用的工具包蜘欲,以方便的在目標(biāo)系統(tǒng)中實(shí)現(xiàn)全文檢索的功能姥份,或者是以此為基礎(chǔ)建立起完整的全文檢索引擎殿衰。
目前以 Lucene 為基礎(chǔ)建立的開源可用全文搜索引擎主要是 Solr 和 Elasticsearch。
Solr 和 Elasticsearch 都是比較成熟的全文搜索引擎傲诵,能完成的功能和性能也基本一樣箱硕。但是 ES 本身就具有分布式的特性和易安裝使用的特點(diǎn)剧罩,而Solr的分布式需要借助第三方來實(shí)現(xiàn),例如通過使用zookeeper來達(dá)到分布式協(xié)調(diào)管理挑势。

3.2 集群(cluster)與節(jié)點(diǎn)(node)

ES集群由一個(gè)或多個(gè)Elasticsearch節(jié)點(diǎn)組成潮饱。
一個(gè)Elasticsearch服務(wù)啟動(dòng)實(shí)例就是一個(gè)節(jié)點(diǎn)(Node)香拉。


一個(gè)Elasticsearch服務(wù)啟動(dòng)實(shí)例就是一個(gè)節(jié)點(diǎn)(Node)凫碌。節(jié)點(diǎn)通過node.name來設(shè)置節(jié)點(diǎn)名稱证鸥,如果不設(shè)置則在啟動(dòng)時(shí)給節(jié)點(diǎn)分配一個(gè)隨機(jī)通用唯一標(biāo)識(shí)符作為名稱枉层。
Zen Discovery是Elasticsearch的內(nèi)置默認(rèn)發(fā)現(xiàn)模塊

假設(shè)這時(shí)節(jié)點(diǎn)Node1服務(wù)宕機(jī)了或者網(wǎng)絡(luò)不可用了鸟蜡,那么主節(jié)點(diǎn)上主分片S0也就不可用了揉忘。幸運(yùn)的是還存在另外兩個(gè)節(jié)點(diǎn)能正常工作泣矛,這時(shí)ES會(huì)重新選舉新的主節(jié)點(diǎn)您朽,而且這兩個(gè)節(jié)點(diǎn)上存在我們的所需要的S0的所有數(shù)據(jù)哗总,我們會(huì)將S0的副本分片提升為主分片讯屈,這個(gè)提升主分片的過程是瞬間發(fā)生的县习。此時(shí)集群的狀態(tài)將會(huì)為 yellow。

3.3 分片(shards)

ES支持PB級(jí)全文搜索沪蓬,當(dāng)索引上的數(shù)據(jù)量太大的時(shí)候怜跑,ES通過水平拆分的方式將一個(gè)索引上的數(shù)據(jù)拆分出來分配到不同的數(shù)據(jù)塊上性芬,拆分出來的數(shù)據(jù)庫塊稱之為一個(gè)分片植锉。

shard = hash(routing) % number_of_primary_shards

分片的數(shù)量和副本數(shù)量都是可以通過創(chuàng)建索引時(shí)的settings來配置俊庇。

PUT /myIndex
{
   "settings" : {
      "number_of_shards" : 5,
      "number_of_replicas" : 1
   }
}

這類似于MySql的分庫分表辉饱,只不過Mysql分庫分表需要借助第三方組件而ES內(nèi)部自身實(shí)現(xiàn)了此功能彭沼。

routing值是一個(gè)任意字符串姓惑,它默認(rèn)是_id但也可以自定義于毙。這個(gè)routing字符串通過哈希函數(shù)生成一個(gè)數(shù)字唯沮,然后除以主切片的數(shù)量得到一個(gè)余數(shù)(remainder)烂翰,余數(shù)的范圍永遠(yuǎn)是0到number_of_primary_shards - 1,這個(gè)數(shù)字就是特定文檔所在的分片竿滨。
這也解釋了為什么主分片的數(shù)量只能在創(chuàng)建索引時(shí)定義且不能修改:如果主分片的數(shù)量在未來改變了于游,所有先前的路由值就失效了贰剥,文檔也就永遠(yuǎn)找不到了蚌成。

3.4 副本(Replicas)

副本就是對(duì)分片的Copy担忧。
將數(shù)據(jù)分片是為了提高可處理數(shù)據(jù)的容量和易于進(jìn)行水平擴(kuò)展瓶盛,為分片做副本是為了提高集群的穩(wěn)定性和提高并發(fā)量惩猫。索引的分片數(shù)和副本數(shù)也不是越多越好
每個(gè)主分片都有一個(gè)或多個(gè)副本分片轧房,當(dāng)主分片異常時(shí)锯厢,副本可以提供數(shù)據(jù)的查詢等操作实辑。主分片和對(duì)應(yīng)的副本分片是不會(huì)在同一個(gè)節(jié)點(diǎn)上的剪撬,所以副本分片數(shù)的最大值是 n -1(其中n為節(jié)點(diǎn)數(shù))残黑。


3.5 段(Segment)

索引文件被拆分為多個(gè)子文件拭荤,則每個(gè)子文件叫作段舅世, 每一個(gè)段本身都是一個(gè)倒排索引雏亚,并且段具有不變性罢低,一旦索引的數(shù)據(jù)被寫入硬盤网持,就不可再修改翎碑。

段的概念提出主要是因?yàn)椋涸谠缙谌臋z索中為整個(gè)文檔集合建立了一個(gè)很大的倒排索引日杈,并將其寫入磁盤中莉擒。如果索引有更新涨冀,就需要重新全量創(chuàng)建一個(gè)索引來替換原來的索引鹿鳖。這種方式在數(shù)據(jù)量很大時(shí)效率很低翅帜,并且由于創(chuàng)建一次索引的成本很高涝滴,所以對(duì)數(shù)據(jù)的更新不能過于頻繁歼疮,也就不能保證時(shí)效性韩脏。

索引文件分段存儲(chǔ)并且不可修改赡矢,那么新增愚屁、更新和刪除如何處理呢?

3.6 映射(Mapping)

映射是用于定義ES對(duì)索引中字段的存儲(chǔ)類型梦谜、分詞方式和是否存儲(chǔ)等信息唁桩,就像數(shù)據(jù)庫中的 schema 。
對(duì)字段類型根據(jù)數(shù)據(jù)格式自動(dòng)識(shí)別的映射稱之為動(dòng)態(tài)映射(Dynamic mapping)单山,我們創(chuàng)建索引時(shí)具體定義字段類型的映射稱之為靜態(tài)映射或顯示映射(Explicit mapping)米奸。
映射是用于定義ES對(duì)索引中字段的存儲(chǔ)類型悴晰、分詞方式和是否存儲(chǔ)等信息铡溪,就像數(shù)據(jù)庫中的 schema 棕硫,描述了文檔可能具有的字段或?qū)傩浴⒚總€(gè)字段的數(shù)據(jù)類型灶泵。只不過關(guān)系型數(shù)據(jù)庫建表時(shí)必須指定字段類型赦邻,而ES對(duì)于字段類型可以不指定然后動(dòng)態(tài)對(duì)字段類型猜測(cè)惶洲,也可以在創(chuàng)建索引時(shí)具體指定字段的類型恬吕。


3.7 寫入數(shù)據(jù)

  1. 客戶端向ES1節(jié)點(diǎn)(協(xié)調(diào)節(jié)點(diǎn))發(fā)送寫請(qǐng)求渐裂,通過路由計(jì)算公式得到值為0柒凉,則當(dāng)前數(shù)據(jù)應(yīng)被寫到主分片S0上。
  2. ES1節(jié)點(diǎn)將請(qǐng)求轉(zhuǎn)發(fā)到S0主分片所在的節(jié)點(diǎn)ES3蔬咬,ES3接受請(qǐng)求并寫入到內(nèi)存计盒。
  3. 并發(fā)將數(shù)據(jù)復(fù)制到兩個(gè)副本分片R0上北启,一旦所有的副本分片都報(bào)告成功咕村,則節(jié)點(diǎn)ES3將向協(xié)調(diào)節(jié)點(diǎn)報(bào)告成功懈涛,協(xié)調(diào)節(jié)點(diǎn)向客戶端報(bào)告成功。
  4. 達(dá)到默認(rèn)時(shí)間或達(dá)到一定量后埋心,會(huì)觸發(fā)refresh拷呆,由內(nèi)存刷新到文件緩存系統(tǒng)生成新的段茬斧,這時(shí)數(shù)據(jù)才能被檢索到项秉;再然后才被刷新到磁盤绣溜。

延遲寫策略
每當(dāng)有新增的數(shù)據(jù)時(shí),就將其先寫入到內(nèi)存中伙狐,在內(nèi)存和磁盤之間是文件系統(tǒng)緩存涮毫,當(dāng)達(dá)到默認(rèn)的時(shí)間(1秒鐘)或者內(nèi)存的數(shù)據(jù)達(dá)到一定量時(shí),會(huì)觸發(fā)一次刷新(Refresh)贷屎,將內(nèi)存中的數(shù)據(jù)生成到一個(gè)新的段上并緩存到文件緩存系統(tǒng) 上,稍后再被刷新到磁盤中并生成提交點(diǎn)艘虎。
這里的內(nèi)存使用的是ES的JVM內(nèi)存,而文件緩存系統(tǒng)使用的是操作系統(tǒng)的內(nèi)存野建。新的數(shù)據(jù)會(huì)繼續(xù)的被寫入內(nèi)存属划,但內(nèi)存中的數(shù)據(jù)并不是以段的形式存儲(chǔ)的,因此不能提供檢索功能候生。由內(nèi)存刷新到文件緩存系統(tǒng)的時(shí)候會(huì)生成了新的段同眯,并將段打開以供搜索使用,而不需要等到被刷新到磁盤唯鸭。
在 Elasticsearch 中须蜗,寫入和打開一個(gè)新段的輕量的過程叫做 refresh (即內(nèi)存刷新到文件緩存系統(tǒng))。 默認(rèn)情況下每個(gè)分片會(huì)每秒自動(dòng)刷新一次目溉。這就是為什么我們說 Elasticsearch 是近實(shí)時(shí)搜索明肮,因?yàn)槲臋n的變化并不是立即對(duì)搜索可見,但會(huì)在一秒之內(nèi)變?yōu)榭梢婄愿丁N覀円部梢允謩?dòng)觸發(fā) refresh柿估,POST /_refresh 刷新所有索引,POST /nba/_refresh刷新指定的索引陷猫。

4 elasticsearch的使用

4.1 index api

檢查

GET /_cat/health?v

查看索引

GET /_cat/indices?v

創(chuàng)建索引

PUT /test_index?pretty

刪除索引

DELETE /test_index

4.2 doc api

創(chuàng)建文檔

PUT /index/type/id
{
  "json數(shù)據(jù)"
}

根據(jù)id獲取文檔

GET /index/Type/id

更新文檔

POST /index/type/id/_update
{
  "doc": {
    "name": “xxxxx"
  }
}

刪除文檔

DELETE /index/type/id 

4.3 search api

查詢方式
Term query(不分詞)
Range query(范圍)
Exists query(字段有值)
Wildcard query(通配符)

匹配方式
match
match_phrase

組合查詢
Bool query(布爾秫舌,加權(quán)得分)
Dis_max query(分離最大化,最大得分)

Nested query(嵌套)



Match
對(duì)搜索詞分詞
任一term匹配就會(huì)被返回

Match phrase
對(duì)搜索詞分詞
match_phase中的所有term都出現(xiàn)在待查詢字段之中
待查詢字段之中的所有term都必須和match_phase具有相同的順序

4.4 bool query

must: 匹配must下查詢條件的doc會(huì)被返回
must_not: 匹配must_not下查詢條件的doc不會(huì)被返回
should: 至少匹配should下一個(gè)查詢條件的doc會(huì)被返回
filter: 匹配filter下查詢條件的doc會(huì)被會(huì)被返回绣檬。


4.5 query & filter

filter:僅僅只是按照搜索條件過濾出需要的數(shù)據(jù)而已足陨,不計(jì)算任何相關(guān)度分?jǐn)?shù),對(duì)相關(guān)度沒有任何影響
query:會(huì)去計(jì)算每個(gè)文檔相對(duì)于搜索條件的相關(guān)度河咽,并按照相關(guān)度進(jìn)行排序
filter的性能比query的性能高钠右,es通常是先執(zhí)行filter,之后執(zhí)行query忘蟹,先把query的執(zhí)行集縮小飒房,這樣可以提高query的執(zhí)行效率搁凸。

GET /_search 
{ 
    "query": { 
        "filtered": { 
            "query":  { "match": { "email": "business opportunity" }}, 
            "filter": { "term": { "folder": "inbox" }} 
        } 
    } 
}

因?yàn)閒ilter不計(jì)算相關(guān)性得分,不排序狠毯,而且會(huì)緩存护糖,所以:filter的性能比query的性能高,es通常是先執(zhí)行filter嚼松,之后執(zhí)行query嫡良,先把query的執(zhí)行集縮小,這樣可以提高query的執(zhí)行效率献酗。
我們通常把不影響排序的查詢條件放到filter里面

4.6 排序寝受、高亮



高亮,不同字段設(shè)置不同的標(biāo)簽
number_of_fragments fragment 是指一段連續(xù)的文字罕偎。返回結(jié)果最多可以包含幾段不連續(xù)的文字很澄。默認(rèn)是5。
fragment_size 一段 fragment 包含多少個(gè)字符颜及。默認(rèn)100甩苛。
no_match_size 即使字段中沒有關(guān)鍵字命中,也可以返回一段文字俏站,該參數(shù)表示從開始多少個(gè)字符被返回讯蒲。

4.7 聚合(Aggregations)

類似于SQL語言中的group by,avg肄扎,sum等函數(shù)

桶(Buckets):符合條件的文檔的集合墨林,相當(dāng)于SQL中的group by。比如反浓,在users表中萌丈,按“地區(qū)”聚合,一個(gè)人將被分到北京桶或上海桶或其他桶里雷则;按“性別”聚合辆雾,一個(gè)人將被分到男桶或女桶

指標(biāo)(Metrics):基于Buckets的基礎(chǔ)上進(jìn)行統(tǒng)計(jì)分析,相當(dāng)于SQL中的count,avg,sum等月劈。比如度迂,按“地區(qū)”聚合,計(jì)算每個(gè)地區(qū)的人數(shù)猜揪,平均年齡等

4.8 腳本(script)



查詢惭墓,對(duì)查詢結(jié)果做二次處理,返回我們想要的格式

更新而姐,過濾符合條件的數(shù)據(jù)并批量修改

4.9 管道(pipeline)

pipeline 就是在文檔寫入數(shù)據(jù)節(jié)點(diǎn)之前進(jìn)行一系列的數(shù)據(jù)預(yù)處理
例:添加數(shù)據(jù)插入時(shí)間字段的腳本


4.10 自定義分詞器

Character Filters(字符過濾器):
針對(duì)原始文本處理腊凶,比如增加,刪除及替換字符串;
0個(gè)或多個(gè)钧萍;
html_strip mapping pattern_replace

Tokenizer(分詞器):
按照規(guī)則分為單詞褐缠;有且只有一個(gè);
standard ngram whitespace keyword
ik pinyin dynamic_synonym

Token Filters(標(biāo)記過濾器):
將切分的單詞進(jìn)行加工风瘦,小寫队魏,刪除stopwords,
過濾万搔,增加同義詞胡桨; 0個(gè)或多個(gè);
lowercase uppercase length

5 應(yīng)用與擴(kuò)展

5.1 應(yīng)用

  1. 當(dāng)mysql中數(shù)據(jù)量比較大時(shí)模糊查詢會(huì)很慢瞬雹,
    -- 于是將查詢字段同步到es中進(jìn)行檢索
  1. 要求實(shí)現(xiàn)一次搜索可以同時(shí)實(shí)現(xiàn)拼音昧谊、同義詞、模糊挖炬、分詞檢索 揽浙;還可以進(jìn)行檢索提示與糾錯(cuò)
    -- 在一個(gè)字段上使用多種分詞方式;使用字段別名實(shí)現(xiàn)跨索引檢索意敛;通過拼音及前置匹配等方式實(shí)現(xiàn)檢索提示與糾錯(cuò)

5.2 擴(kuò)展

  1. 多shard場(chǎng)景下相關(guān)度分?jǐn)?shù)(relevance score)不準(zhǔn)確問題
    -- es默認(rèn)在一個(gè)shard中統(tǒng)計(jì)的,不是索引里所有的primary shard膛虫,當(dāng)數(shù)據(jù)分布不平均的時(shí)候草姻,就可能出現(xiàn)在一個(gè)shard里的得分高但在全部shard的得分卻低
    -- 數(shù)據(jù)盡量平均分布;主分片數(shù)設(shè)為1稍刀;搜索附帶search_type=dfs_query_then_fetch參數(shù)
  1. 查詢結(jié)果“震蕩”問題
    -- 主分片和副本分片可能不一致撩独,導(dǎo)致最終在主分片和副本分片上計(jì)算得到的得分不同,而導(dǎo)致最終的查詢結(jié)果不一致账月。
    -- 用preference參數(shù)指定分片查詢的優(yōu)先級(jí)综膀,可以通過該參數(shù)來控制搜索時(shí)的索引數(shù)據(jù)分片。
  1. 深度分頁問題


  2. 性能調(diào)優(yōu)


出處:
https://blog.csdn.net/qq_16162981/article/details/70142166
https://www.cnblogs.com/jajian/p/11223992.html
https://www.elastic.co/guide
(歡迎轉(zhuǎn)載局齿,但必須在文章頁面明顯位置給出原文鏈接)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末剧劝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子抓歼,更是在濱河造成了極大的恐慌讥此,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谣妻,死亡現(xiàn)場(chǎng)離奇詭異萄喳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蹋半,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門他巨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事染突∧硪” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵觉痛,是天一觀的道長(zhǎng)役衡。 經(jīng)常有香客問我,道長(zhǎng)薪棒,這世上最難降的妖魔是什么手蝎? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮俐芯,結(jié)果婚禮上棵介,老公的妹妹穿的比我還像新娘。我一直安慰自己吧史,他們只是感情好邮辽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贸营,像睡著了一般吨述。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钞脂,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天揣云,我揣著相機(jī)與錄音,去河邊找鬼冰啃。 笑死邓夕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阎毅。 我是一名探鬼主播焚刚,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼扇调!你這毒婦竟也來了矿咕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤肃拜,失蹤者是張志新(化名)和其女友劉穎痴腌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燃领,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡士聪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猛蔽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剥悟。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灵寺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出区岗,到底是詐尸還是另有隱情略板,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布慈缔,位于F島的核電站叮称,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏藐鹤。R本人自食惡果不足惜瓤檐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娱节。 院中可真熱鬧挠蛉,春花似錦、人聲如沸肄满。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稠歉。三九已至掰担,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怒炸,已是汗流浹背恩敌。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留横媚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓月趟,卻偏偏與公主長(zhǎng)得像灯蝴,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子孝宗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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