版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
./WORD完美格式ElasticSearch學(xué)習(xí)資料內(nèi)部文件:[1.0]頒布時(shí)間:[2014.1.21].目錄文件版本說明3參考資料3手冊目的3聲明3名詞定義和縮略語說明31.總述41.1.簡介41.2.國外的使用案例41.3.基本概念解析61.3.1.Cluster61.3.2.Shards61.3.3.Replicas61.3.4.Recovery71.3.5.River71.3.6.Gateway71.3.7.discovery.zen71.3.8.Transport72.服務(wù)器搭建82.1.單機(jī)環(huán)境82.2.服務(wù)器環(huán)境82.3.中文分詞集成92.4.配置詳解123.JavaAPI153.1.與集群交互153.1.1.Node方式153.1.2.TransportClient方式163.2.putMapping定義索引字段屬性163.3.索引數(shù)據(jù)193.4.刪除索引數(shù)據(jù)193.5.搜索203.6.批量添加索引213.7.與MongoDB同步數(shù)據(jù)223.8.使用Morelikethis實(shí)現(xiàn)基于內(nèi)容的推薦25.文件版本說明表1版本說明版本發(fā)布時(shí)間修訂章節(jié)作者1.02014.1.21第一版虞晶參考資料Elasticsearch官網(wǎng):htt手冊目的ElasticSearch學(xué)習(xí)資料聲明無名詞定義和縮略語說明表2名詞定義及縮略語說明序號(hào)縮寫說明1ESElasticsearch,一種設(shè)計(jì)用于云計(jì)算的分布式全文索引解決方案。.總述簡介ElasticSearch是一個(gè)基于Lucene構(gòu)建的開源,分布式,RESTful搜索引擎。設(shè)計(jì)用于云計(jì)算中,能夠達(dá)到實(shí)時(shí)搜索,穩(wěn)定,可靠,快速,安裝使用方便。支持通過HTTP使用JSON進(jìn)行數(shù)據(jù)索引。我們建立一個(gè)網(wǎng)站或應(yīng)用程序,并要添加搜索功能,令我們受打擊的是:搜索工作是很難的。我們希望我們的搜索解決方案要快,我們希望有一個(gè)零配置和一個(gè)完全免費(fèi)的搜索模式,我們希望能夠簡單地使用JSON通過HTTP的索引數(shù)據(jù),我們希望我們的搜索服務(wù)器始終可用,我們希望能夠一臺(tái)開始并擴(kuò)展到數(shù)百,我們要實(shí)時(shí)搜索,我們要簡單的多租戶,我們希望建立一個(gè)云的解決方案。Elasticsearch旨在解決所有這些問題和更多的。國外的使用案例Github"Github使用Elasticsearch搜索20TB的數(shù)據(jù),包括13億的文件和1300億行的代碼"這個(gè)不用介紹了吧,碼農(nóng)們都懂的,Github在2013年1月升級(jí)了他們的代碼搜索,由solr轉(zhuǎn)為elasticsearch,目前集群規(guī)模為26個(gè)索引存儲(chǔ)節(jié)點(diǎn)和8個(gè)客戶端節(jié)點(diǎn)〔負(fù)責(zé)處理搜索請求,詳情請看官方博客/blog/1381-a-whole-new-code-searchFoursquare"實(shí)時(shí)搜索5千萬地點(diǎn)信息?Foursquare每天都用Elasticsearch做這樣的事"Foursquare是一家基于用戶地理位置信息的手機(jī)服務(wù)網(wǎng)站,并鼓勵(lì)手機(jī)用戶同他人分享自己當(dāng)前所在地理位置等信息。與其他老式網(wǎng)站不同,Foursquare用戶界面主要針對(duì)手機(jī)而設(shè)計(jì),以方便手機(jī)用戶使用。SoundCloud"SoundCloud使用Elasticsearch來為1.8億用戶提供即時(shí)精準(zhǔn)的音樂搜索服務(wù)"SoundCloud是一家德國網(wǎng)站,提供音樂分享社區(qū)服務(wù),成長很快,Alexa世界排名已達(dá)第236位。你可以在線錄制或上傳任何聲音到SoundCloud與大家分享,可在線上傳也可以通過軟件客戶端來上傳音樂文件,沒有文件大小限制,但免費(fèi)版限制上傳音頻總長不可超過2個(gè)小時(shí)播放時(shí)長,每首歌曲限最多100次下載。SoundCloud允許音樂通過Flash播放器方式嵌入到網(wǎng)頁中。FogCreek"Elasticsearch使FogCreek可以在400億行代碼中進(jìn)行一個(gè)月3千萬次的查詢"StumbleUpon"Elasticsearch是StumbleUpon的關(guān)鍵部件,它每天為社區(qū)提供百萬次的推薦服務(wù)"StumbleUpon是個(gè)能發(fā)現(xiàn)你喜歡的網(wǎng)頁的網(wǎng)站,進(jìn)去時(shí)先注冊,注冊完就選擇你感興趣的東西,它會(huì)自動(dòng)幫你推薦一些網(wǎng)頁,如果你喜歡這個(gè)網(wǎng)頁就點(diǎn)喜歡按鈕,按stumble按鈕就會(huì)推薦下一個(gè)網(wǎng)頁。目前其數(shù)據(jù)量達(dá)到25億,基本數(shù)據(jù)存儲(chǔ)在HBase中,并用elasticsearch建立索引,elasticsearch在其中除了用在搜索功能還有在推薦和統(tǒng)計(jì)功能。之前他們是使用solr作為搜索,由于solr滿足不了他們的業(yè)務(wù)增長需要而替換為elasticsearch。MozillaMozilla公司以火狐著名,它目前使用WarOnOrange這個(gè)項(xiàng)目來進(jìn)行單元或功能測試,測試的結(jié)果以json的方式索引到elasticsearch中,開發(fā)人員可以非常方便的查找bug。Socorro是Mozilla公司的程序崩潰報(bào)告系統(tǒng),一有錯(cuò)誤信息就插入到Hbase和Postgres中,然后從Hbase中讀取數(shù)據(jù)索引到elasticsearch中,方便查找。SonySony公司使用elasticsearch作為信息搜索引擎Infochimps"在Infochimps,我們已經(jīng)索引了25億文檔,總共占用4TB的空間"。Infochimps是一家位于德克薩斯州奧斯丁的創(chuàng)業(yè)公司,為大數(shù)據(jù)平臺(tái)提供商。它主要提供基于hadoop的大數(shù)據(jù)處理方案。ScalingLucene怎樣在Lucene之上構(gòu)建一個(gè)分布式、高度伸縮、接近實(shí)時(shí)的搜索引擎呢?讓我們回顧一下在搜索引擎〔基于lucene伸縮性這條路上都做了那些嘗試,并且elasticsearch是如何嘗試并去解決這些挑戰(zhàn)的。首先我們了解下最基礎(chǔ)的理論知識(shí)buildingblocks〔這些理論基礎(chǔ)是構(gòu)建分布式近實(shí)時(shí)搜索引擎的基礎(chǔ)。接著我們研究一下到底哪種才是最佳的分區(qū)策略partitioning〔將lucene索引文檔分割到多個(gè)分布式的分片中去。然后我們同樣需要決定使用哪種分區(qū)復(fù)制方式replication〔復(fù)制能夠保證系統(tǒng)的高可用以及提高搜索的吞吐。最后,我們再看一下事務(wù)日志transactionlog〔事務(wù)日志在elasticsearch里面是一個(gè)保證數(shù)據(jù)一致性的非??岬墓δ?。BuildingBlocks當(dāng)我們要構(gòu)建一個(gè)分布式接近實(shí)時(shí)的搜索引擎,并且要讓lucene可伸縮可擴(kuò)展,必須首先知道lucene的關(guān)鍵概念以及它們與我們要達(dá)成目標(biāo)的一些局限性.DirectoryLuceneDirectory是一個(gè)抽象的文件系統(tǒng)的接口,用來允許你讀寫文件,不管lucene的索引是存放在內(nèi)存中還是在物理磁盤上,它都是通過lucene的Directory抽象層來訪問和維護(hù)的。IndexWriterIndexWriter用來添加、刪除和更新lucene里面的索引文檔。這些操作是在內(nèi)存中完成以保證更好的性能,但是如果要保證這些操作的持久化,這些操作是需要flush到磁盤的。并且,flush操作或者是顯式的commit提交開銷都是比較大的,因?yàn)檫@些操作通常需要處理很多的文件,而處理這些文件又涉及到大量的磁盤io。此外,每次只能有一個(gè)IndexWriter對(duì)象來對(duì)一個(gè)索引目錄進(jìn)行索引操作,并且創(chuàng)建這個(gè)對(duì)象的開銷很大,所以必須盡可能去重用這個(gè)對(duì)象.IndexSegmentsLucene索引被分解為很多段〔segments。每個(gè)索引段實(shí)際上是一個(gè)功能完整的lucene索引,一旦一個(gè)索引段創(chuàng)建完成,它將是不可變的,并且不能刪除段里面的索引文檔。commit提交操作用來往索引里面添加一個(gè)新段。lucene內(nèi)部會(huì)來對(duì)這些段進(jìn)行合并,所以我們必須要有策略來控制這些合并<MergePolisy,MergeScheuler,…etc>。BecausesegmentsneedtobekeptatbaytheyarebeingmergedcontinuouslybyinternalLuceneprocesses<MergePolisy,MergeScheuler,…etc>。因?yàn)槎问遣豢勺兊?所以用來做緩存〔caching是一個(gè)很好的選擇,你可以加載所有的term詞條并且創(chuàng)建一個(gè)跳躍列表〔skiplists>,或者用來構(gòu)造FieldCache,如果段沒有變化,你就不需要重新加載。IndexReaderIndexReader用來執(zhí)行搜索索引。這個(gè)對(duì)象通過IndexWriter來提供,并且創(chuàng)建代價(jià)也是比較高。一旦IndexReader打開之后,它就不能夠發(fā)現(xiàn)打開之后的索引變化,如果要知道這些由IndexWriter產(chǎn)生的索引變化,除非刷新IndexReader對(duì)象〔當(dāng)然前提需要flush操作。搜索操作在內(nèi)部其實(shí)是按段來進(jìn)行的〔每次一個(gè)段.NearReal-TimeSearch獲取一個(gè)新的IndexReader開銷很大,所以也是我們不能每次一有索引操作就真的去獲取一個(gè)新的IndexReader,你可以隔一段時(shí)間去刷新一下,比如每隔一秒鐘等等,這也是我們在這里稱之為接近實(shí)時(shí)<nearreal-time>的原因.Partitioning可能用來伸縮Lucene的途徑〔PossibleapproachtoScaleLucene:DistributedDirectory其中一個(gè)途徑用來伸縮Lucene就是使用分布式文件系統(tǒng),大文件會(huì)被拆分成chunks塊并且會(huì)保存到分布式存儲(chǔ)系統(tǒng)〔比如Coherence,Terracota,GigaSpacesorInfinispan等等>。這樣IndexWriter和IndexReader都是工作在一個(gè)自定義的Directory分布式實(shí)現(xiàn)上,每個(gè)操作后面其實(shí)是分布了很多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)上面存儲(chǔ)了索引文件的一部分.但是這種方案有一些問題:首先,這種方案會(huì)產(chǎn)生密集的網(wǎng)絡(luò)流量。盡管可以用一些高級(jí)的方法如本地緩存等,但仍然會(huì)產(chǎn)生大量的網(wǎng)絡(luò)請求,因?yàn)樽钪饕脑蚴且驗(yàn)檫@種將文件拆分為塊的想法與lucene索引文件構(gòu)建方式和使用方式實(shí)在相隔太遠(yuǎn),結(jié)論就是使用這種方式來做大規(guī)模索引和搜索是不切實(shí)際的。〔ps:所以solandra這種玩意還是不要去考慮了。其次,大的索引必然會(huì)使IndexReader變的無法分布式。IndexReader是一個(gè)很重的對(duì)象,并且term詞條越多,其消耗的內(nèi)存也會(huì)越多。最后,索引操作也會(huì)變的非常困難,因?yàn)橹挥幸粋€(gè)單一的IndexWriter能夠?qū)懰饕?。所?我們把目光投向另一種方式。Partitioning有2種通過將數(shù)據(jù)分區(qū)方式來scale搜索引擎:基于文檔〔Documentbasedpartitioningand基于詞條〔Termbasedpartitioning.Elasticsearch使用的基于文檔的分區(qū)方式。基于文檔的分區(qū)〔DocumentBasedPartitioning每一個(gè)文檔只存一個(gè)分區(qū),每個(gè)分區(qū)持有整個(gè)文檔集的一個(gè)子集,分區(qū)是一個(gè)功能完整的索引。優(yōu)點(diǎn):每個(gè)分區(qū)都可以獨(dú)立的處理查詢??梢苑浅:唵蔚奶砑右晕臋n為單位的索引信息。網(wǎng)絡(luò)開銷很小,每個(gè)節(jié)點(diǎn)可以分別執(zhí)行搜索,執(zhí)行完了之后只需用返回文檔的ID和評(píng)分信息就可以了,然后在其中一個(gè)我們執(zhí)行分布式搜索的節(jié)點(diǎn)上執(zhí)行合并就可以了。缺點(diǎn):查詢?nèi)绻枰谒械姆謪^(qū)上執(zhí)行,那么它將執(zhí)行O<K*N>次磁盤操作〔K是詞條〔Term,或者理解為Field的數(shù)量,N是分區(qū)的數(shù)量。在實(shí)用性的角度來看基于文檔的分區(qū)方式已經(jīng)被證明是一個(gè)構(gòu)建大型的分布式信息檢索系統(tǒng)的一種行之有效的方法,關(guān)于這方面的詳細(xì)內(nèi)容,可以看這里talkbyJeffreyDean<Google>?;谠~條的分區(qū)〔TermBasedPartitioning每個(gè)分區(qū)擁有一部分詞條,詞條里面包含了整個(gè)index的文檔數(shù)據(jù)。一些基于詞條分區(qū)的系統(tǒng),如RiakSearch<builtontopofRiakkey-valuestoreengine>或是Lucandra/Solandra<ontopofCassandra>.盡管這些系統(tǒng)不是完全一樣,但是它們都面臨一個(gè)相似的挑戰(zhàn),當(dāng)然也得益于相同的設(shè)計(jì)理念。優(yōu)點(diǎn):一般來說,你只需要在很少的部分分區(qū)上執(zhí)行查詢就行了,比如,我們有5個(gè)term詞條的查詢,我們將至多命中5個(gè)分區(qū),如果這5個(gè)term詞條都保存同一個(gè)分區(qū)中,那么我們只需用訪問一個(gè)分區(qū)即可,而不管我們是不是實(shí)際上有50個(gè)分區(qū)。另外一個(gè)優(yōu)勢就是對(duì)應(yīng)K個(gè)Term詞條的查詢,你只需用執(zhí)行O<K>次磁盤查找〔假設(shè)我們使用的優(yōu)化過的實(shí)現(xiàn)。缺點(diǎn):最主要的問題是LuceneSegment概念里面固有的很多結(jié)構(gòu)都將失去。ThemainproblemisthatwholenotionofLuceneSegmentwhichisinherenttoalotofconstructsinLuceneislost.對(duì)于那些復(fù)雜的查詢,網(wǎng)絡(luò)開銷將會(huì)變得非常高,并且可能使得系統(tǒng)可用性大大降低,尤其是那些會(huì)expand出大量的term詞條的查詢,如fuzzy或者prefix查詢。另外一個(gè)問題就是獲取每個(gè)文檔的信息將會(huì)變得非常困難,舉例來說,如果你想獲取文檔的一部分?jǐn)?shù)據(jù)來做進(jìn)一步的控制,比如〔google的PageRank算法,獲取每個(gè)文檔的這些數(shù)據(jù)都會(huì)變得非常困難,因?yàn)檫@種分區(qū)的方式使得文檔的數(shù)據(jù)被分散到了不同的地方,所以實(shí)現(xiàn)faceting、評(píng)分、自定義評(píng)分等等都將變得難以實(shí)現(xiàn)。Replication分布式系統(tǒng)的另外一方面就是復(fù)制<replication>了。通過復(fù)制我們可以得到2個(gè)主要的好處:HighAvailability<HA高可用性>。如果一個(gè)節(jié)點(diǎn)掛了,另外一個(gè)節(jié)點(diǎn)能從它趴下的地方應(yīng)頭頂上,如果一個(gè)節(jié)點(diǎn)上面持有索引分片,而另一個(gè)節(jié)點(diǎn)持有該分片的副本,那么我們的數(shù)據(jù)就有了一個(gè)備份。擁有數(shù)據(jù)多個(gè)副本的另一個(gè)好處就是scalability<可伸縮性>。我們沒有理由不通過增加副本來提高搜索能力,而我們只需要簡單的增加幾個(gè)副本或從節(jié)點(diǎn)〔slavenodes就能提升我們搜索的吞吐,何樂而不為呢。一般有兩種方式來實(shí)現(xiàn)復(fù)制:PushReplication〔推模式和PullReplication〔拉模式。Elasticsearch使用的是PushReplication<推模式>。PushReplication工作起來非常簡單,當(dāng)你往[master]主分片上面索引一個(gè)文檔,該分片會(huì)復(fù)制該文檔<document>到剩下的所有[replica]副本分片中,這些分片也會(huì)索引這個(gè)文檔。缺點(diǎn):同一個(gè)文檔重復(fù)索引多次,相比拉模式而言,要傳輸相對(duì)較少的數(shù)據(jù)<眾所周知,Lucene索引速度非???gt;。Youindexthesamedocumentseveraltimes,butwetransfermuchlessdatacomparedtoPullreplication<andLuceneisknowntoindexveryfast>。這就需要在并發(fā)索引的時(shí)候進(jìn)行一些微妙的控制,比如對(duì)同一個(gè)文檔進(jìn)行非常頻繁的索引,在主分片和副本分片上面執(zhí)行索引操作的時(shí)候,你必須保證每次更新是按照正確的順序,或者通過版本〔versioning來拒絕舊版本的操作,而拉模式就沒有這個(gè)問題。優(yōu)點(diǎn):一旦文檔索引完畢,那么該文檔在所有的分片及副本上都是立即可用的。索引操作會(huì)等待直到確認(rèn)所有的副本也執(zhí)行了同樣的索引操作<注意:如果需要,你也可以使用異步復(fù)制>。這意味著索引的實(shí)時(shí)性。然后你只需要refresh一下IndexReader就能搜索到新的數(shù)據(jù)了。這樣的架構(gòu)能讓你非常方便的在節(jié)點(diǎn)之間進(jìn)行切換,假如包含主分片〔primaryshard的節(jié)點(diǎn)掛了,我們能夠很快的進(jìn)行切換,因?yàn)槠渌姆制椭鞣制际且荒R粯拥?。PullReplication拉模式是一種主從方式〔master–slave<Solr用的就是這種>。當(dāng)一個(gè)文檔在master上面進(jìn)行索引,并且數(shù)據(jù)通過commit操作產(chǎn)生了新的段文件〔segment,這個(gè)時(shí)候,從節(jié)點(diǎn)〔slave把這些段文件〔segments拉到自己的機(jī)器然后再執(zhí)行相應(yīng)的刷新操作,并保證lucene能夠使用這些新的數(shù)據(jù)。缺點(diǎn):需要在master上面執(zhí)行commit操作來產(chǎn)生這些段文件〔segment,這樣slave才能夠執(zhí)行pull操作。不知道你還記不記得前面說過,lucene的commit的開銷是非常大的,如果可能,commit次數(shù)越少越好。數(shù)據(jù)的傳輸會(huì)有不必要的冗余。在分布式系統(tǒng)里面,網(wǎng)絡(luò)通常來說是非常寶貴的資源<如果你跑在EC2上面,那將更加寶貴,$$$>并且最終要移動(dòng)的數(shù)據(jù)會(huì)越來越多,舉例來說,如果你有2個(gè)段文件,里面包含了文檔,文檔里面的字段都是存儲(chǔ)的〔storedfields,并且Lucene決定要合并這2個(gè)段文件,那么你也必須要傳輸這部分?jǐn)?shù)據(jù)〔合并之后的段文件,因?yàn)檫@是一個(gè)新的段文件,但是實(shí)際上你傳輸?shù)氖且环菹嗤臄?shù)據(jù)。這將造成一個(gè)這樣的局面,所有的slaves確實(shí)是在master后面。也可能是確實(shí)沒有理由每次都進(jìn)行commit或者花大量時(shí)間來傳輸一個(gè)大的段文件。但是至少意味著你的slave會(huì)丟失highavailability,并且不可能當(dāng)成是一個(gè)實(shí)時(shí)的slave〔arealtimehighavailableslave。實(shí)時(shí)搜索不可能存在,并且〔使用拉模式也不可能有這種1秒的刷新率,然后lucene就能實(shí)時(shí)搜索。TransactionLog正如前面提到過的,索引提交〔commit的開銷實(shí)在太大,但是我們又必須通過提交操作來保證數(shù)據(jù)被可靠的持久化,如果擁有數(shù)據(jù)的節(jié)點(diǎn)突然崩潰的話,那么最后一次提交操作之后產(chǎn)生的數(shù)據(jù)操作將會(huì)丟失。數(shù)據(jù)可靠性〔DataPersistencyElasticSearch通過使用transactionlog<或預(yù)寫日志<writeaheadlog>>來解決這個(gè)問題,通過日志記錄發(fā)生在索引上的各種操作,來保證就算沒有調(diào)用commit操作也能保證數(shù)據(jù)的持久化。并且能夠很自然的支持推送復(fù)制〔pushreplication,因?yàn)槲覀兡軌蜃屆總€(gè)不同的shard都擁有transactionlog,就算某些節(jié)點(diǎn)崩潰了,如果有必要,可以很輕松對(duì)日志操作進(jìn)行重放〔replay。Transactionlog周期性的將數(shù)據(jù)刷新<flushed>到磁盤,你可以通過參數(shù)來進(jìn)行控制。簡單來說就是保存兩次提交之間的連續(xù)數(shù)據(jù)操作的記錄。盡管你只運(yùn)行了一個(gè)elasticsearch的服務(wù)節(jié)點(diǎn)〔可能暫時(shí)不需要分布式,trasncationlog也能夠使你的es即使被強(qiáng)制結(jié)束進(jìn)程〔"kill-9"也不會(huì)丟失任何數(shù)據(jù)。當(dāng)然,還不止這些!Transactionlog還有一個(gè)重要的功能就是可以保證當(dāng)你生成快照〔sharedgatewaysnapshot、分片恢復(fù)〔peershardrecovery或是分片熱遷移〔shard"Hot"relocation的時(shí)候,索引數(shù)據(jù)不會(huì)丟失。SharedGatewaySnapshot使用共享gateway時(shí),會(huì)周期性的生成數(shù)據(jù)改變<changes>的快照<snapshots>,并存儲(chǔ)到共享存儲(chǔ)中〔sharedstorage>,并且transactionlog也是持久化數(shù)據(jù)的一部分。PeerShardReovery當(dāng)分片從一個(gè)節(jié)點(diǎn)遷移到另一個(gè)節(jié)點(diǎn)或者需要分配更多的分片<比如你增加了副本數(shù)>的時(shí)候,數(shù)據(jù)會(huì)從某一個(gè)節(jié)點(diǎn)上取來進(jìn)行恢復(fù),而不是從gateway。遷移數(shù)據(jù)時(shí),首先我們保證不會(huì)刪除Lucene的段文件〔segmentfiles>,然后禁用flushing操作,這個(gè)時(shí)候保證不調(diào)用commit操作,然后開始遷移這些段文件,這個(gè)時(shí)候產(chǎn)生的索引改變,我們存放到transactionlog中,一旦這個(gè)步驟結(jié)束〔ie:索引索引文件拷貝完畢,我們開始對(duì)transactionlog里面的日志在replica分片上進(jìn)行重放操作〔replay,完畢之后,我們就可以進(jìn)行切換了,數(shù)據(jù)遷移成功!遷移操作進(jìn)行時(shí),你仍然可以進(jìn)行索引,仍然可以進(jìn)行搜索,只有索引切換的時(shí)候會(huì)有一段很短的時(shí)間阻塞〔blocking,但是直到切換前,遷移對(duì)你來說是完全透明的。服務(wù)器搭建先到/download/下載最新版的elasticsearch運(yùn)行包,本文寫時(shí)最新的是,作者是個(gè)很勤快的人,es的更新很頻繁,bug修復(fù)得很快。下載完解開有三個(gè)包:bin是運(yùn)行的腳本,config是設(shè)置文件,lib是放依賴的包。如果你要裝插件的話就要多新建一個(gè)plugins的文件夾,把插件放到這個(gè)文件夾中。單機(jī)環(huán)境單機(jī)版的elasticsearch運(yùn)行很簡單,linux下直接bin/elasticsearch就運(yùn)行了,windows運(yùn)行bin/elasticsearch.bat。如果是在局域網(wǎng)中運(yùn)行elasticsearch集群也是很簡單的,只要設(shè)置一致,并且機(jī)器在同一網(wǎng)段下,啟動(dòng)的es會(huì)自動(dòng)發(fā)現(xiàn)對(duì)方,組成集群。服務(wù)器環(huán)境如果是在服務(wù)器上就可以使用elasticsearch-servicewrapper這個(gè)es插件,它支持通過參數(shù),指定是在后臺(tái)或前臺(tái)運(yùn)行es,并且支持啟動(dòng),停止,重啟es服務(wù)〔默認(rèn)es腳本只能通過ctrl+c關(guān)閉es。使用方法是到/elasticsearch/elasticsearch-servicewrapper下載service文件夾,放到es的bin目錄下。下面是命令集合:bin/service/elasticsearch+console在前臺(tái)運(yùn)行esstart在后臺(tái)運(yùn)行esstop停止esinstall使es作為服務(wù)在服務(wù)器啟動(dòng)時(shí)自動(dòng)啟動(dòng)remove取消啟動(dòng)時(shí)自動(dòng)啟動(dòng)在service目錄下有個(gè)elasticsearch.conf配置文件,主要是設(shè)置一些java運(yùn)行環(huán)境參數(shù),其中比較重要的是下面的參數(shù):#es的home路徑,不用用默認(rèn)值就可以set.default.ES_HOME=<PathtoElasticSearchHome>#分配給es的最小內(nèi)存set.default.ES_MIN_MEM=256#分配給es的最大內(nèi)存set.default.ES_MAX_MEM=1024#啟動(dòng)等待超時(shí)時(shí)間〔以秒為單位wrapper.startup.timeout=300#關(guān)閉等待超時(shí)時(shí)間〔以秒為單位wrapper.shutdown.timeout=300#ping超時(shí)時(shí)間<以秒為單位>wrapper.ping.timeout=300中文分詞集成elasticsearch官方只提供smartcn這個(gè)中文分詞插件,效果不是很好,好在國內(nèi)有medcl大神〔國內(nèi)最早研究es的人之一寫的兩個(gè)中文分詞插件,一個(gè)是ik的,一個(gè)是mmseg的,下面分別介紹下兩者的用法,其實(shí)都差不多的,先安裝插件,命令行:安裝ik插件:或者手動(dòng)通過下載包安裝,在github上有個(gè)最新的〔直接用plugin--install//方式安裝,這個(gè)真看人品,反正我是沒裝上。下載后用plugin--urlfile://path/to/plugin--installplugin-name方式安裝,沒問題,安裝成功。下載ik相關(guān)配置詞典文件到config目錄cdconfigwget/downloads/medcl/elasticsearch-analysis-ik/ik.zip--no-check-certificateunzipik.ziprmik.zip安裝mmseg插件:bin/plugin-installmedcl/elasticsearch-analysis-mmseg/1.1.0下載相關(guān)配置詞典文件到config目錄cdconfigwget/downloads/medcl/elasticsearch-analysis-mmseg/mmseg.zip--no-check-certificateunzipmmseg.ziprmmmseg.zip分詞配置ik分詞配置,在elasticsearch.yml文件中加上index:analysis:analyzer:ik:alias:[ik_analyzer]或index.analysis.analyzer.ik.type:"ik"這兩句的意義相同mmseg分詞配置,也是在在elasticsearch.yml文件中index:analysis:analyzer:mmseg:alias:[news_analyzer,mmseg_analyzer]type:org.elasticsearch.index.analysis.MMsegAnalyzerProvider或index.analysis.analyzer.default.type:"mmseg"mmseg分詞還有些更加個(gè)性化的參數(shù)設(shè)置如下index:analysis:tokenizer:mmseg_maxword:type:mmsegseg_type:"max_word"mmseg_complex:type:mmsegseg_type:"complex"mmseg_simple:type:mmsegseg_type:"simple"這樣配置完后插件安裝完成,啟動(dòng)es就會(huì)加載插件。定義mapping在添加索引的mapping時(shí)就可以這樣定義分詞器{"page":{"properties":{"title":{"type":"string","indexAnalyzer":"ik","searchAnalyzer":"ik"},"content":{"type":"string","indexAnalyzer":"ik","searchAnalyzer":"ik"}}}}indexAnalyzer為索引時(shí)使用的分詞器,searchAnalyzer為搜索時(shí)使用的分詞器。javamapping代碼如下:XContentBuildercontent=XContentFactory.jsonBuilder<>.startObject<>.startObject<"page">.startObject<"properties">.startObject<"title">.field<"type","string">.field<"indexAnalyzer","ik">.field<"searchAnalyzer","ik">.endObject<>.startObject<"code">.field<"type","string">.field<"indexAnalyzer","ik">.field<"searchAnalyzer","ik">.endObject<>.endObject<>.endObject<>.endObject<>定義完后操作索引就會(huì)以指定的分詞器來進(jìn)行分詞。測試分詞可用調(diào)用下面api,注意indexname為索引名,隨便指定一個(gè)索引就行了http://localhost:9200/indexname/_analyze?analyzer=ik&text=測試elasticsearch分詞器附:ik分詞插件項(xiàng)目地址:/medcl/elasticsearch-analysis-ikmmseg分詞插件項(xiàng)目地址:/medcl/elasticsearch-analysis-mmseg如果覺得配置麻煩,也可以下載個(gè)配置好的es版本,地址如下:/medcl/elasticsearch-rtf配置詳解elasticsearch的config文件夾里面有兩個(gè)配置文件:elasticsearch.yml和logging.yml,第一個(gè)是es的基本配置文件,第二個(gè)是日志配置文件,es也是使用log4j來記錄日志的,所以logging.yml里的設(shè)置按普通log4j配置文件來設(shè)置就行了。下面主要講解下elasticsearch.yml這個(gè)文件中可配置的東西。:elasticsearch配置es的集群名稱,默認(rèn)是elasticsearch,es會(huì)自動(dòng)發(fā)現(xiàn)在同一網(wǎng)段下的es,如果在同一網(wǎng)段下有多個(gè)集群,就可以用這個(gè)屬性來區(qū)分不同的集群。:"FranzKafka"節(jié)點(diǎn)名,默認(rèn)隨機(jī)指定一個(gè)name列表中名字,該列表在es的jar包中config文件夾里name.txt文件中,其中有很多作者添加的有趣名字。node.master:true指定該節(jié)點(diǎn)是否有資格被選舉成為node,默認(rèn)是true,es是默認(rèn)集群中的第一臺(tái)機(jī)器為master,如果這臺(tái)機(jī)掛了就會(huì)重新選舉master。node.data:true指定該節(jié)點(diǎn)是否存儲(chǔ)索引數(shù)據(jù),默認(rèn)為true。index.number_of_shards:5設(shè)置默認(rèn)索引分片個(gè)數(shù),默認(rèn)為5片。index.number_of_replicas:1設(shè)置默認(rèn)索引副本個(gè)數(shù),默認(rèn)為1個(gè)副本。path.conf:/path/to/conf設(shè)置配置文件的存儲(chǔ)路徑,默認(rèn)是es根目錄下的config文件夾。path.data:/path/to/data設(shè)置索引數(shù)據(jù)的存儲(chǔ)路徑,默認(rèn)是es根目錄下的data文件夾,可以設(shè)置多個(gè)存儲(chǔ)路徑,用逗號(hào)隔開,例:path.data:/path/to/data1,/path/to/data2path.work:/path/to/work設(shè)置臨時(shí)文件的存儲(chǔ)路徑,默認(rèn)是es根目錄下的work文件夾。path.logs:/path/to/logs設(shè)置日志文件的存儲(chǔ)路徑,默認(rèn)是es根目錄下的logs文件夾path.plugins:/path/to/plugins設(shè)置插件的存放路徑,默認(rèn)是es根目錄下的plugins文件夾bootstrap.mlockall:true設(shè)置為true來鎖住內(nèi)存。因?yàn)楫?dāng)jvm開始swapping時(shí)es的效率會(huì)降低,所以要保證它不swap,可以把ES_MIN_MEM和ES_MAX_MEM兩個(gè)環(huán)境變量設(shè)置成同一個(gè)值,并且保證機(jī)器有足夠的內(nèi)存分配給es。同時(shí)也要允許elasticsearch的進(jìn)程可以鎖住內(nèi)存,linux下可以通過`ulimit-lunlimited`命令。設(shè)置綁定的ip地址,可以是ipv4或ipv6的,默認(rèn)為。設(shè)置其它節(jié)點(diǎn)和該節(jié)點(diǎn)交互的ip地址,如果不設(shè)置它會(huì)自動(dòng)判斷,值必須是個(gè)真實(shí)的ip地址。這個(gè)參數(shù)是用來同時(shí)設(shè)置bind_host和publish_host上面兩個(gè)參數(shù)。transport.tcp.port:9300設(shè)置節(jié)點(diǎn)間交互的tcp端口,默認(rèn)是9300。press:true設(shè)置是否壓縮tcp傳輸時(shí)的數(shù)據(jù),默認(rèn)為false,不壓縮。http.port:9200設(shè)置對(duì)外服務(wù)的http端口,默認(rèn)為9200。http.max_content_length:100mb設(shè)置內(nèi)容的最大容量,默認(rèn)100mbhttp.enabled:false是否使用http協(xié)議對(duì)外提供服務(wù),默認(rèn)為true,開啟。gateway.type:localgateway的類型,默認(rèn)為local即為本地文件系統(tǒng),可以設(shè)置為本地文件系統(tǒng),分布式文件系統(tǒng),hadoop的HDFS,和amazon的s3服務(wù)器,其它文件系統(tǒng)的設(shè)置方法下次再詳細(xì)說。gateway.recover_after_nodes:1設(shè)置集群中N個(gè)節(jié)點(diǎn)啟動(dòng)時(shí)進(jìn)行數(shù)據(jù)恢復(fù),默認(rèn)為1。gateway.recover_after_time:5m設(shè)置初始化數(shù)據(jù)恢復(fù)進(jìn)程的超時(shí)時(shí)間,默認(rèn)是5分鐘。gateway.expected_nodes:2設(shè)置這個(gè)集群中節(jié)點(diǎn)的數(shù)量,默認(rèn)為2,一旦這N個(gè)節(jié)點(diǎn)啟動(dòng),就會(huì)立即進(jìn)行數(shù)據(jù)恢復(fù)。cluster.routing.allocation.node_initial_primaries_recoveries:4初始化數(shù)據(jù)恢復(fù)時(shí),并發(fā)恢復(fù)線程的個(gè)數(shù),默認(rèn)為4。cluster.routing.allocation.node_concurrent_recoveries:2添加刪除節(jié)點(diǎn)或負(fù)載均衡時(shí)并發(fā)恢復(fù)線程的個(gè)數(shù),默認(rèn)為4。indices.recovery.max_size_per_sec:0設(shè)置數(shù)據(jù)恢復(fù)時(shí)限制的帶寬,如入100mb,默認(rèn)為0,即無限制。indices.recovery.concurrent_streams:5設(shè)置這個(gè)參數(shù)來限制從其它分片恢復(fù)數(shù)據(jù)時(shí)最XX時(shí)打開并發(fā)流的個(gè)數(shù),默認(rèn)為5。discovery.zen.minimum_master_nodes:1設(shè)置這個(gè)參數(shù)來保證集群中的節(jié)點(diǎn)可以知道其它N個(gè)有master資格的節(jié)點(diǎn)。默認(rèn)為1,對(duì)于大的集群來說,可以設(shè)置大一點(diǎn)的值〔2-4discovery.zen.ping.timeout:3s設(shè)置集群中自動(dòng)發(fā)現(xiàn)其它節(jié)點(diǎn)時(shí)ping連接超時(shí)時(shí)間,默認(rèn)為3秒,對(duì)于比較差的網(wǎng)絡(luò)環(huán)境可以高點(diǎn)的值來防止自動(dòng)發(fā)現(xiàn)時(shí)出錯(cuò)。discovery.zen.ping.multicast.enabled:false設(shè)置是否打開多播發(fā)現(xiàn)節(jié)點(diǎn),默認(rèn)是true。discovery.zen.ping.unicast.hosts:["host1","host2:port","host3[portX-portY]"]設(shè)置集群中master節(jié)點(diǎn)的初始列表,可以通過這些節(jié)點(diǎn)來自動(dòng)發(fā)現(xiàn)新加入集群的節(jié)點(diǎn)。下面是一些查詢時(shí)的慢日志參數(shù)設(shè)置index.search.slowlog.level:TRACE
index.search.slowlog.threshold.query.warn:10s
:5s
index.search.slowlog.threshold.query.debug:2s
index.search.slowlog.threshold.query.trace:500msindex.search.slowlog.threshold.fetch.warn:1s
:800ms
index.search.slowlog.threshold.fetch.debug:500ms
index.search.slowlog.threshold.fetch.trace:200ms管理工具elasticsearch-headelasticsearch-head是一個(gè)elasticsearch的集群管理工具,它是完全由html5編寫的獨(dú)立網(wǎng)頁程序,你可以通過插件把它集成到es?;蛑苯酉螺d源碼,在本地打開index.html運(yùn)行它。該工具的git地址是:
/Aconex/elasticsearch-head插件安裝方法:1.elasticsearch/bin/plugin-installAconex/elasticsearch-head2.運(yùn)行es3.打開http://localhost:9200/_plugin/head/不想通過插件集成到es的話就可以直接在git上下載源碼到本地運(yùn)行。在地址欄輸入es服務(wù)器的ip地址和端口點(diǎn)connect就可以連接到集群。下面是連接后的視圖。這是主界面,在這里可以看到es集群的基本信息〔如:節(jié)點(diǎn)情況,索引情況。界面的右邊有些按鈕,如:nodestats,clusternodes,這些是直接請求es的相關(guān)狀態(tài)的api,返回結(jié)果為json,如下圖:在索引下面有info和action兩個(gè)按鈕。info是可以查看索引的狀態(tài)和mapping的定義。action是對(duì)索引進(jìn)行操作,如:添加別名、刷新、關(guān)閉索引,刪除索引等。browser瀏覽界面,這個(gè)界面可以同時(shí)查看多個(gè)索引的數(shù)據(jù),也可以查詢指定字段的數(shù)據(jù)。StructuredQuery查詢界面,這個(gè)界面可以對(duì)某個(gè)索引進(jìn)行一些復(fù)雜查詢,如下面這個(gè)例子是查詢product索引,構(gòu)造boolquery,title字段里查詢"產(chǎn)品"關(guān)鍵詞,price范圍為10到100的記錄。AnyRequest任意請求界面,這個(gè)界面可以說是個(gè)rest的客戶端,可以通過它來對(duì)es進(jìn)行一些請求操作或測試api接口,下面這個(gè)例子是把product索引的副本數(shù)設(shè)置為1,更多的api可以到es官網(wǎng)查詢。elasticsearch-bigdeskbigdesk是elasticsearch的一個(gè)集群監(jiān)控工具,可以通過它來查看es集群的各種狀態(tài),如:cpu、內(nèi)存使用情況,索引數(shù)據(jù)、搜索情況,http連接數(shù)等。項(xiàng)目git地址:
/lukas-vlcek/bigdesk。和head一樣,它也是個(gè)獨(dú)立的網(wǎng)頁程序,使用方式和head一樣。插件安裝運(yùn)行:1.bin/plugin
-installlukas-vlcek/bigdesk2.運(yùn)行es3.打開http://localhost:9200/_plugin/bigdesk/當(dāng)然,也可以直接下載源碼運(yùn)行index.html同樣是輸入ip地址和端口后連接,界面如下。加星的表示主節(jié)點(diǎn)。下面介紹下各個(gè)圖表。系統(tǒng)監(jiān)控:這里包含系統(tǒng)方面的一些狀態(tài),左起分別為:cpu,內(nèi)存,交換區(qū)和平均負(fù)載的情況jvm:顯示jvm的一些狀態(tài),左起分別為:jvmheap內(nèi)存使用情況,藍(lán)色的為已使用內(nèi)存;非heap使用內(nèi)存;線程數(shù);gc情況〔次數(shù)和時(shí)間;進(jìn)程:下面四張圖主要顯示es的進(jìn)程對(duì)系統(tǒng)資源的使用情況,左起分別為:進(jìn)程打開文件數(shù),內(nèi)存使用情況,cpu時(shí)間和進(jìn)程的cpu使用率ps:內(nèi)存使用情況中的Totalvirtual指linux下虛擬內(nèi)存,它包括virtualmemorymap中的所有數(shù)據(jù)量之和。包括:程序類+程序數(shù)據(jù)+jar包空間+jre占用空間等。residentmemory指程序?qū)嶋H占用的物理內(nèi)存。通訊:這里可以查看tcp和http鏈接的一些數(shù)據(jù)。索引:這里可以查看索引數(shù)據(jù)和搜索的一些情況。左上起:每秒索引請求,搜索時(shí)間,每秒取數(shù)據(jù)請求,取數(shù)據(jù)時(shí)間。左下起:緩存大小,緩存失效個(gè)數(shù),每秒索引請求,索引時(shí)間。文件系統(tǒng):顯示硬盤的讀寫情況ModulsCluster代表一個(gè)集群,集群中有多個(gè)節(jié)點(diǎn),其中有一個(gè)為主節(jié)點(diǎn),這個(gè)主節(jié)點(diǎn)是可以通過選舉產(chǎn)生的,主從節(jié)點(diǎn)是對(duì)于集群內(nèi)部來說的。es的一個(gè)概念就是去中心化,字面上理解就是無中心節(jié)點(diǎn),這是對(duì)于集群外部來說的,因?yàn)閺耐獠縼砜磂s集群,在邏輯上是個(gè)整體,你與任何一個(gè)節(jié)點(diǎn)的通信和與整個(gè)es集群通信是等價(jià)的。Shards代表索引分片,es可以把一個(gè)完整的索引分成多個(gè)分片,這樣的好處是可以把一個(gè)大的索引拆分成多個(gè),分布到不同的節(jié)點(diǎn)上。構(gòu)成分布式搜索。分片的數(shù)量只能在索引創(chuàng)建前指定,并且索引創(chuàng)建后不能更改。Replicas代表索引副本,es可以設(shè)置多個(gè)索引的副本,副本的作用一是提高系統(tǒng)的容錯(cuò)性,當(dāng)個(gè)某個(gè)節(jié)點(diǎn)某個(gè)分片損壞或丟失時(shí)可以從副本中恢復(fù)。二是提高es的查詢效率,es會(huì)自動(dòng)對(duì)搜索請求進(jìn)行負(fù)載均衡。Recovery代表數(shù)據(jù)恢復(fù)或叫數(shù)據(jù)重新分布,es在有節(jié)點(diǎn)加入或退出時(shí)會(huì)根據(jù)機(jī)器的負(fù)載對(duì)索引分片進(jìn)行重新分配,掛掉的節(jié)點(diǎn)重新啟動(dòng)時(shí)也會(huì)進(jìn)行數(shù)據(jù)恢復(fù)。River代表es的一個(gè)數(shù)據(jù)源,也是其它存儲(chǔ)方式〔如:數(shù)據(jù)庫同步數(shù)據(jù)到es的一個(gè)方法。它是以插件方式存在的一個(gè)es服務(wù),通過讀取river中的數(shù)據(jù)并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的,river這個(gè)功能將會(huì)在后面的文件中重點(diǎn)說到。Gateway代表es索引的持久化存儲(chǔ)方式,es默認(rèn)是先把索引存放到內(nèi)存中,當(dāng)內(nèi)存滿了時(shí)再持久化到硬盤。當(dāng)這個(gè)es集群關(guān)閉再重新啟動(dòng)時(shí)就會(huì)從gateway中讀取索引數(shù)據(jù)。es支持多種類型的gateway,有本地文件系統(tǒng)〔默認(rèn),分布式文件系統(tǒng),Hadoop的HDFS和amazon的s3云存儲(chǔ)服務(wù)。discovery.zen代表es的自動(dòng)發(fā)現(xiàn)節(jié)點(diǎn)機(jī)制,es是一個(gè)基于p2p的系統(tǒng),它先通過廣播尋找存在的節(jié)點(diǎn),再通過多播協(xié)議來進(jìn)行節(jié)點(diǎn)之間的通信,同時(shí)也支持點(diǎn)對(duì)點(diǎn)的交互。Transport代表es內(nèi)部節(jié)點(diǎn)或集群與客戶端的交互方式,默認(rèn)內(nèi)部是使用tcp協(xié)議進(jìn)行交互,同時(shí)它支持http協(xié)議〔json格式、thrift、servlet、memcached、zeroMQ等的傳輸協(xié)議〔通過插件方式集成。JavaAPI與集群交互可以通過兩種方式來連接到elasticsearch〔簡稱es集群,第一種是通過在你的程序中創(chuàng)建一個(gè)嵌入es節(jié)點(diǎn)〔Node,使之成為es集群的一部分,然后通過這個(gè)節(jié)點(diǎn)來與es集群通信。第二種方式是用TransportClient這個(gè)接口和es集群通信。Node方式創(chuàng)建嵌入節(jié)點(diǎn)的方式如下:r.*;//啟動(dòng)節(jié)點(diǎn)Nodenode=nodeBuilder<>.node<>;Clientclient=node.client<>;//關(guān)閉節(jié)點(diǎn)node.close<>;當(dāng)你啟動(dòng)一個(gè)節(jié)點(diǎn),它會(huì)自動(dòng)加入同網(wǎng)段的es集群,一個(gè)前提就是es的集群名〔這個(gè)參數(shù)要設(shè)置一致。默認(rèn)的話啟動(dòng)一個(gè)節(jié)點(diǎn),es集群會(huì)自動(dòng)給它分配一些索引的分片,如果你想這個(gè)節(jié)點(diǎn)僅僅作為一個(gè)客戶端而不去保存數(shù)據(jù),你就可以設(shè)置把node.data設(shè)置成false或node.client設(shè)置成true。下面是例子:Nodenode=nodeBuilder<>.clusterName<clusterName>.client<true>.node<>;還有一種情況是你并不想把節(jié)點(diǎn)加入集群,只想用它進(jìn)行單元測試時(shí),就要啟動(dòng)一個(gè)"本地"的es,這里"本地"指的是在jvm的級(jí)別下運(yùn)行,即兩個(gè)不同的es節(jié)點(diǎn)運(yùn)行在同一個(gè)JVM中時(shí)會(huì)組成一個(gè)集群。它需要把節(jié)點(diǎn)的local參數(shù)設(shè)置成true,下面是例子:Nodenode=nodeBuilder<>.local<true>.node<>;TransportClient方式通過TransportClient這個(gè)接口,我們可以不啟動(dòng)節(jié)點(diǎn)就可以和es集群進(jìn)行通信,它需要指定es集群中其中一臺(tái)或多臺(tái)機(jī)的ip地址和端口,例子如下:Clientclient=newTransportClient<>.addTransportAddress<newInetSocketTransportAddress<"host1",9300>>.addTransportAddress<newInetSocketTransportAddress<"host2",9300>>;client.close<>;如果你需要更改集群名〔默認(rèn)是elasticsearch,需要如下設(shè)置:Settingssettings=ImmutableSettings.settingsBuilder<>.put<"","myClusterName">.build<>;Clientclient=newTransportClient<settings>;你可以設(shè)置client.transport.sniff為true來使客戶端去嗅探整個(gè)集群的狀態(tài),把集群中其它機(jī)器的ip地址加到客戶端中,這樣做的好處是一般你不用手動(dòng)設(shè)置集群里所有集群的ip到連接客戶端,它會(huì)自動(dòng)幫你添加,并且自動(dòng)發(fā)現(xiàn)新加入集群的機(jī)器。代碼實(shí)例如下:Settingssettings=ImmutableSettings.settingsBuilder<>.put<"client.transport.sniff",true>.build<>;TransportClientclient=newTransportClient<settings>;putMapping定義索引字段屬性Mapping,就是對(duì)索引庫中索引的字段名及其數(shù)據(jù)類型進(jìn)行定義,類似于關(guān)系數(shù)據(jù)庫中表建立時(shí)要定義字段名及其數(shù)據(jù)類型那樣,不過es的mapping比數(shù)據(jù)庫靈活很多,它可以動(dòng)態(tài)添加字段。一般不需要要指定mapping都可以,因?yàn)閑s會(huì)自動(dòng)根據(jù)數(shù)據(jù)格式定義它的類型,如果你需要對(duì)某些字段添加特殊屬性〔如:定義使用其它分詞器、是否分詞、是否存儲(chǔ)等,就必須手動(dòng)添加mapping。有兩種添加mapping的方法,一種是定義在配置文件中,一種是運(yùn)行時(shí)手動(dòng)提交mapping,兩種選一種就行了。先介紹在配置文件中定義mapping,你可以把[mapping名].json文件放到config/mappings/[索引名]目錄下,這個(gè)目錄要自己創(chuàng)建,一個(gè)mapping和一個(gè)索引對(duì)應(yīng),你也可以定義一個(gè)默認(rèn)的mapping,把自己定義的default-mapping.json放到config目錄下就行。json格式如下:{"mappings":{"properties":{"title":{"type":"string","store":"yes"},"description":{"type":"string","index":"not_analyzed"},"price":{"type":"double"},"onSale":{"type":"boolean"},"type":{"type":"integer"},"createDate":{"type":"date"}}}}接下來介紹通過請求添加mapping,下面為一個(gè)添加productIndex索引庫的mapping的json格式請求。其中productIndex為索引類型,properties下面的為索引里面的字段,type為數(shù)據(jù)類型,store為是否存儲(chǔ),"index":"not_analyzed"為不對(duì)該字段進(jìn)行分詞。{"productIndex":{"properties":{"title":{"type":"string","store":"yes"},"description":{"type":"string","index":"not_analyzed"},"price":{"type":"double"},"onSale":{"type":"boolean"},"type":{"type":"integer"},"createDate":{"type":"date"}}}}用javaapi調(diào)用的代碼如下:先創(chuàng)建空索引庫client.admin<>.indices<>.prepareCreate<"productIndex">.execute<>.actionGet<>;putmapping:XContentBuildermapping=jsonBuilder<>.startObject<>.startObject<"productIndex">.startObject<"properties">.startObject<"title">.field<"type","string">.field<"store","yes">.endObject<>.startObject<"description">.field<"type","string">.field<"index","not_analyzed">.endObject<>.startObject<"price">.field<"type","double">.endObject<>.startObject<"onSale">.field<"type","boolean">.endObject<>.startObject<"type">.field<"type","integer">.endObject<>.startObject<"createDate">.field<"type","date">.endObject<>.endObject<>.endObject<>.endObject<>;PutMappingRequestmappingRequest=Requests.putMappingRequest<"productIndex">.type<"productIndex">.source<mapping>;client.admin<>.indices<>.putMapping<mappingRequest>.actionGet<>;索引數(shù)據(jù)es索引數(shù)據(jù)非常方便,只需構(gòu)建個(gè)json格式的數(shù)據(jù)提交到es就行,下面是個(gè)javaapi的例子XContentBuilderdoc=jsonBuilder<>.startObject<>.field<"title","thisisatitle!">.field<"description","descriptwhat?">.field<"price",100>.field<"onSale",true>.field<"type",1>.field<"createDate",newDate<>>.endObject<>;client.prepareIndex<"productIndex","productType">.setSource<doc>.execute<>.actionGet<>;其中productIndex為索引庫名,一個(gè)es集群中可以有多個(gè)索引庫。productType為索引類型,是用來區(qū)分同索引庫下不同類型的數(shù)據(jù)的,一個(gè)索引庫下可以有多個(gè)索引類型。刪除索引數(shù)據(jù)刪除api允許從特定索引通過id刪除json文檔。有兩種方法,一是通過id刪除,二是通過一個(gè)Query查詢條件刪除,符合這些條件的數(shù)據(jù)都會(huì)被刪除。一、通過id刪除下面的例子是刪除索引名為twitter,類型為tweet,id為1的文檔:DeleteResponseresponse=client.prepareDelete<"twitter","tweet","1">.execute<>.actionGet<>;二、通過Query刪除下面的例子是刪除索引名為productIndex,title中包含query的所有文檔:QueryBuilderquery=QueryBuilders.fieldQuery<"title","query">;client.prepareDeleteByQuery<"productIndex">.setQuery<query>.execute<>.actionGet<>;設(shè)置線程當(dāng)刪除api在同一個(gè)節(jié)點(diǎn)上執(zhí)行時(shí)〔在一個(gè)分片中執(zhí)行一個(gè)api會(huì)分配到同一個(gè)服務(wù)器上,刪除api允許執(zhí)行前設(shè)置線程模式〔operationThreaded選項(xiàng),operationThreaded這個(gè)選項(xiàng)是使這個(gè)操作在另外一個(gè)線程中執(zhí)行,或在一個(gè)正在請求的線程〔假設(shè)這個(gè)api仍是異步的中執(zhí)行。默認(rèn)的話operationThreaded會(huì)設(shè)置成true,這意味著這個(gè)操作將在一個(gè)不同的線程中執(zhí)行。下面是設(shè)置成false的方法:DeleteResponseresponse=client.prepareDelete<"twitter","tweet","1">.setOperationThreaded<false>.execute<>.actionGet<>;官方文檔:.html搜索elasticsearch的查詢是通過執(zhí)行json格式的查詢條件,在javaapi中就是構(gòu)造QueryBuilder對(duì)象,elasticsearch完全支持queryDSL風(fēng)格的查詢方式,QueryBuilder的構(gòu)建類是QueryBuilders,filter的構(gòu)建類是FilterBuilders。下面是構(gòu)造QueryBuilder的例子:importstaticorg.elasticsearch.index.query.FilterBuilders.*;importstaticorg.elasticsearch.index.query.QueryBuilders.*;QueryBuilderqb1=termQuery<"name","kimchy">;QueryBuilderqb2=boolQuery<>.must<termQuery<"content","test1">>.must<termQuery<"content","test4">>.mustNot<termQuery<"content","test2">>.should<termQuery<"content","test3">>;QueryBuilderqb3=filteredQuery<termQuery<"name.first","shay">,rangeFilter<"age">.from<23>.to<54>.includeLower<true>.includeUpper<false>>;其中qb1構(gòu)造了一個(gè)TermQuery,對(duì)name這個(gè)字段進(jìn)行項(xiàng)搜索,項(xiàng)是最小的索引片段,這個(gè)查詢對(duì)應(yīng)lucene本身的TermQuery。qb2構(gòu)造了一個(gè)組合查詢〔BoolQuery,其對(duì)應(yīng)lucene本身的BooleanQuery,可以通過must、should、mustNot方法對(duì)QueryBuilder進(jìn)行組合,形成多條件查詢。qb3構(gòu)造了一個(gè)過濾查詢,就是在TermQuery的基礎(chǔ)上添加一個(gè)過濾條件RangeFilter,這個(gè)范圍過濾器將限制查詢age字段大于等于23,小于等于54的結(jié)果。除了這三個(gè),elasticsearch還支持很多種類的查詢方式,遲點(diǎn)寫個(gè)介紹。構(gòu)造好了Query就要傳到elasticsearch里面進(jìn)行查詢,下面是例子:SearchResponseresponse=client.prepareSearch<"test">.setQuery<query>.setFrom<0>.setSize<60>.setExplain<true>.execute<>.actionGet<>;這句的意思是,查詢test索引,查詢條件為query,從第0條記錄開始,最多返回60條記錄。返回結(jié)果為SearchResponse,下面解析SearchResponse:SearchHitshits=searchResponse.hits<>;for<inti=0;i<60
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年外研版七年級(jí)歷史上冊階段測試試卷含答案
- 2024離婚協(xié)議書:財(cái)產(chǎn)分配與債務(wù)處理
- 2025年度金融風(fēng)控信息服務(wù)費(fèi)合同樣本2篇
- 2024設(shè)備租賃協(xié)議書范本
- 2025年冀少新版高一數(shù)學(xué)下冊階段測試試卷
- 2025年度石油天然氣開采化學(xué)品合同3篇
- 2025年教科新版七年級(jí)地理上冊月考試卷
- 2025年北師大版選修3地理下冊階段測試試卷含答案
- 2025年人教版(2024)選擇性必修3地理上冊階段測試試卷
- 2025年滬科版九年級(jí)科學(xué)下冊階段測試試卷含答案
- 安徽省合肥市2021-2022學(xué)年七年級(jí)上學(xué)期期末數(shù)學(xué)試題(含答案)3
- 教育專家報(bào)告合集:年度得到:沈祖蕓全球教育報(bào)告(2023-2024)
- 寒假小學(xué)生心理健康教育
- 健康體檢授權(quán)委托書
- 肝臟腫瘤護(hù)理查房
- 人工智能 法規(guī)
- 琴房租賃合同
- 護(hù)士工作壓力管理護(hù)理工作中的壓力應(yīng)對(duì)策略
- 皮帶拆除安全技術(shù)措施
- 中國石油青海油田公司員工壓力狀況調(diào)查及員工幫助計(jì)劃(EAP)實(shí)探的開題報(bào)告
- 《培訓(xùn)資料緊固》課件
評(píng)論
0/150
提交評(píng)論