目錄
- 檢索需求
- 倒排索引與全文檢索
- elasticsearch的原理
- elasticsearch的使用
- 應(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”的文檔,需要以下幾步:
- 取出包含字符串“l(fā)ucene”的文檔鏈表寄症。
- 取出包含字符串“solr”的文檔鏈表升筏。
-
通過合并鏈表,找出既包含“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)。
- 將文檔分成一個(gè)一個(gè)單獨(dú)的單詞剪决。
- 去除標(biāo)點(diǎn)符號(hào)灵汪。
- 去除停詞(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)。
- 變?yōu)樾?Lowercase)
- 將單詞縮減為詞根形式铛漓,如“cars ”到“car ”溯香。(stemming)
- 將單詞轉(zhuǎn)變?yōu)樵~根形式,如“drove ”到“drive ”浓恶。(lemmatization)
- 中文的話還會(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)谓晌。
-
利用得到的詞(Term)創(chuàng)建一個(gè)詞典掠拳。
-
對(duì)詞典按字母順序進(jìn)行排序。
-
合并相同的詞(Term) 成為文檔倒排(Posting List) 鏈表纸肉。
Document Frequency
即文檔頻次溺欧,表示總共有多少文件包含這個(gè)詞。
Frequency
即詞頻率柏肪,表示此文件中包含了幾個(gè)這個(gè)詞姐刁。
創(chuàng)建索引的過程就是將文檔轉(zhuǎn)換為詞典和倒排表
2.3 搜索索引
第一步:搜索詞處理
- 分詞
- 語法規(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)度并排序
- 計(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ū)分這些文檔葡秒,因而重要性越低眯牧。
- 計(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)性越大
- 索引過程:
a) 有一系列被索引文件
b) 被索引文件經(jīng)過語法分析和語言處理形成一系列詞(Term) 派诬。
c) 經(jīng)過索引創(chuàng)建形成詞典和反向索引表缓窜。
d) 通過索引存儲(chǔ)將索引寫入硬盤。 - 搜索過程:
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的概念
- 云里面的每個(gè)白色正方形的盒子代表一個(gè)節(jié)點(diǎn)——Node捺僻。
- 在一個(gè)或者多個(gè)節(jié)點(diǎn)直接匕坯,多個(gè)綠色小方塊組合在一起形成一個(gè)ElasticSearch的索引葛峻。
- 在一個(gè)索引下术奖,分布在多個(gè)節(jié)點(diǎn)里的綠色小方塊稱為分片——Shard采记。
- 一個(gè)ElasticSearch的Shard本質(zhì)上是一個(gè)Lucene Index。
- 在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ù)
- 客戶端向ES1節(jié)點(diǎn)(協(xié)調(diào)節(jié)點(diǎn))發(fā)送寫請(qǐng)求渐裂,通過路由計(jì)算公式得到值為0柒凉,則當(dāng)前數(shù)據(jù)應(yīng)被寫到主分片S0上。
- ES1節(jié)點(diǎn)將請(qǐng)求轉(zhuǎn)發(fā)到S0主分片所在的節(jié)點(diǎn)ES3蔬咬,ES3接受請(qǐng)求并寫入到內(nèi)存计盒。
- 并發(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)告成功。
- 達(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)用
- 當(dāng)mysql中數(shù)據(jù)量比較大時(shí)模糊查詢會(huì)很慢瞬雹,
-- 于是將查詢字段同步到es中進(jìn)行檢索
- 要求實(shí)現(xiàn)一次搜索可以同時(shí)實(shí)現(xiàn)拼音昧谊、同義詞、模糊挖炬、分詞檢索 揽浙;還可以進(jìn)行檢索提示與糾錯(cuò)
-- 在一個(gè)字段上使用多種分詞方式;使用字段別名實(shí)現(xiàn)跨索引檢索意敛;通過拼音及前置匹配等方式實(shí)現(xiàn)檢索提示與糾錯(cuò)
5.2 擴(kuò)展
- 多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ù)
- 查詢結(jié)果“震蕩”問題
-- 主分片和副本分片可能不一致撩独,導(dǎo)致最終在主分片和副本分片上計(jì)算得到的得分不同,而導(dǎo)致最終的查詢結(jié)果不一致账月。
-- 用preference參數(shù)指定分片查詢的優(yōu)先級(jí)综膀,可以通過該參數(shù)來控制搜索時(shí)的索引數(shù)據(jù)分片。
-
深度分頁問題
-
性能調(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)載局齿,但必須在文章頁面明顯位置給出原文鏈接)