天天看點

面試題:Lucene、Solr、ElasticSearch

1、Lucene和Solr和Elasticsearch的差別
  • Lucene

Lucene是apache下的一個子項目,是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。官網位址:https://lucene.apache.org/

  • Solr

Solr是一個高性能,采用Java5開發,基于Lucene的全文搜尋伺服器。同時對其進行了擴充,提供了比Lucene更為豐富的查詢語言,同時實作了可配置、可擴充并對查詢性能進行了優化,并且提供了一個完善的功能管理界面,是一款非常優秀的全文搜尋引擎。官網位址:http://lucene.apache.org/solr/

  • Elasticsearch

Elasticsearch跟Solr一樣,也是一個基于Lucene的搜尋伺服器,它提供了一個分布式多使用者能力的全文搜尋引擎,基于RESTful web接口。官網位址:https://www.elastic.co/products/elasticsearch

1、Elasticsearch的優缺點:
  • 優點:

1.Elasticsearch是分布式的。不需要其他元件,分發是實時的,被叫做"Push replication"。

2.Elasticsearch 完全支援 Apache Lucene 的接近實時的搜尋。

3.處理多租戶(multitenancy)不需要特殊配置,而Solr則需要更多的進階設定。

4.Elasticsearch 采用 Gateway 的概念,使得完備份更加簡單。

5.各節點組成對等的網絡結構,某些節點出現故障時會自動配置設定其他節點代替其進行工作。

  • 缺點:

1.隻有一名開發者(目前Elasticsearch GitHub組織已經不隻如此,已經有了相當活躍的維護者)

2.還不夠自動(不适合目前新的Index Warmup API)

2、Solr的優缺點:
  • 優點

1.Solr有一個更大、更成熟的使用者、開發和貢獻者社群。

2.支援添加多種格式的索引,如:HTML、PDF、微軟 Office 系列軟體格式以及 JSON、XML、CSV 等純文字格式。

3.Solr比較成熟、穩定。

4.不考慮建索引的同時進行搜尋,速度更快。

  • 缺點

1.建立索引時,搜尋效率下降,實時索引搜尋效率不高。

3、Elasticsearch 與 Solr 的比較:

1.二者安裝都很簡單;

2.Solr 利用 Zookeeper 進行分布式管理,而 Elasticsearch 自身帶有分布式協調管理功能;

3.Solr 支援更多格式的資料,而 Elasticsearch 僅支援json檔案格式;

4.Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,進階功能多有第三方插件提供;

5.Solr 在傳統的搜尋應用中表現好于 Elasticsearch,但在處理實時搜尋應用時效率明顯低于 Elasticsearch。

6.Solr 是傳統搜尋應用的有力解決方案,但 Elasticsearch 更适用于新興的實時搜尋應用。

使用案例:

1.維基百科使用Elasticsearch來進行全文搜做并高亮顯示關鍵詞,以及提供search-as-you-type、did-you-mean等搜尋建議功能。

2.英國衛報使用Elasticsearch來處理訪客日志,以便能将公衆對不同文章的反應實時地回報給各位編輯。

3.StackOverflow将全文搜尋與地理位置和相關資訊進行結合,以提供more-like-this相關問題的展現。

4.GitHub使用Elasticsearch來檢索超過1300億行代碼。

5.每天,Goldman Sachs使用它來處理5TB資料的索引,還有很多投行使用它來分析股票市場的變動。

2、相關面試題

solr如何實作搜尋的?

反向索引,先抽取文檔中詞,并建立詞與文檔id的映射關系,然後查詢的時候會根據詞去查詢文檔id,并查詢出文檔

Solr過濾器

Solr的過濾器對接收到的标記流(TokenStream )做額外的處理

過濾查詢,在查詢時設定

Solr原理

Solr是基于Lucene開發的全文檢索伺服器,而Lucene就是一套實作了全文檢索的api,其本質就是一個全文檢索的過程。全文檢索就是把原始文檔根據一定的規則拆分成若幹個關鍵詞,然後根據關鍵詞建立索引,當查詢時先查詢索引找到對應的關鍵詞,并根據關鍵詞找到對應的文檔,也就是查詢結果,最終把查詢結果展示給使用者的過程

  • Solr基于什麼

基于lucene搜尋庫的一個搜尋引擎架構,lucene是一個開放源碼的全文檢索引擎工具包

  • solr怎麼設定搜尋結果排名靠前

設定文檔中域的boost值,值越高相關性越高,排名就靠前

  • IK分詞器原理

本質上是詞典分詞,在記憶體中初始化一個詞典,然後在分詞過程中逐個讀取字元,和字典中的字元相比對,把文檔中的所有詞語拆分出來的過程

  • solr的索引查詢為什麼比資料庫要快

Solr使用的是Lucene API實作的全文檢索。全文檢索本質上是查詢的索引。而資料庫中并不是所有的字段都建立的索引,更何況如果使用like查詢時很大的可能是不使用索引,是以使用solr查詢時要比查資料庫快

  • solr索引庫個别資料索引丢失怎麼辦

首先Solr是不會丢失個别資料的。如果索引庫中缺少資料,那就向索引庫中添加

  • Lucene索引優化

直接使用Lucene實作全文檢索已經是過時的方案,推薦使用solr。Solr已經提供了完整的全文檢索解決方案

  • 多張表的資料導入solr(解決id沖突)

在schema.xml中添加uuid,然後solrconfig那邊修改update的部分,改為使用uuid生成

  • solr如何分詞,新增詞和禁用詞如何解決

schema.xml檔案中配置一個IK分詞器,然後域指定分詞器為IK

新增詞添加到詞典配置檔案中ext.dic,禁用詞添加到禁用詞典配置檔案中stopword.dic,然後在schema.xml檔案中配置禁用詞典:

  • solr多條件組合查詢

建立多個查詢對象,指定他們的組合關系,Occur.MUST(必須滿足and),Occur.SHOULD(應該滿足or),Occur.MUST_NOT(必須不滿足not)

  • elasticsearch 了解多少,說說你們公司 es 的叢集架構,索引資料大小,分片有多少,以及一些調優手段。elasticsearch 的反向索引是什麼。

ElasticSearch(簡稱ES)是一個分布式、Restful的搜尋及分析伺服器,設計用于分布式計算;能夠達到實時搜尋,穩定,可靠,快速。和Apache Solr一樣,它也是基于Lucence的索引伺服器,而ElasticSearch對比Solr的優點在于:

輕量級:安裝啟動友善,下載下傳檔案之後一條指令就可以啟動。

Schema free:可以向伺服器送出任意結構的JSON對象,Solr中使用schema.xml指定了索引結構。

多索引檔案支援:使用不同的index參數就能建立另一個索引檔案,Solr中需要另行配置。

分布式:Solr Cloud的配置比較複雜。

反向索引是實作"單詞-文檔矩陣"的一種具體存儲形式,通過反向索引,可以根據單詞快速擷取包含這個單詞的文檔清單。反向索引主要由兩個部分組成:"單詞詞典"和"倒排檔案"。

  • elasticsearch 索引資料多了怎麼辦,如何調優,部署。

使用bulk API

初次索引的時候,把 replica 設定為 0

增大 threadpool.index.queue_size

增大 indices.memory.indexbuffersize

增大 index.translog.flushthresholdops

增大 index.translog.sync_interval

增大 index.engine.robin.refresh_interval

http://www.jianshu.com/p/5eeeeb4375d4

  • lucence 内部結構是什麼

索引(Index):在Lucene中一個索引是放在一個檔案夾中的。如上圖,同一檔案夾中的所有的檔案構成一個Lucene索引。

段(Segment):一個索引可以包含多個段,段與段之間是獨立的,添加新文檔可以生成新的段,不同的段可以合并。

segments.gen和segments_X是段的中繼資料檔案,也即它們儲存了段的屬性資訊。

文檔(Document):文檔是我們建索引的基本機關,不同的文檔是儲存在不同的段中的,一個段可以包含多篇文檔。

新添加的文檔是單獨儲存在一個新生成的段中,随着段的合并,不同的文檔合并到同一個段中。

  • 域(Field):

一篇文檔包含不同類型的資訊,可以分開索引,比如标題,時間,正文,作者等,都可以儲存在不同的域裡。不同域的索引方式可以不同,在真正解析域的存儲的時候,我們會詳細解讀。

  • 詞(Term):

詞是索引的最小機關,是經過詞法分析和語言處理後的字元串。

solr和lucene的差別

Solr和Lucene的本質差別有以下三點:搜尋伺服器,企業級和管理。Lucene本質上是搜尋庫,不是獨立的應用程式,而Solr是。Lucene專注于搜尋底層的建設,而Solr專注于企業應用。Lucene不負責支撐搜尋服務所必須的管理,而Solr負責。是以說,一句話概括Solr: Solr是Lucene面向企業搜尋應用的擴充

Lucene: 是一個索引與搜尋類庫,而不是完整的程式。

Solr:是一個高性能,采用Java5開發,基于Lucene的一個獨立的企業級搜尋應用伺服器,它對外提供類似于Web-service的API接口。

solr 實作全文檢索

索引流程:用戶端---》solr 伺服器(發送post請求,xml文檔包含filed,solr實作對索引的維護)

搜尋流程:用戶端---》solr 伺服器(發送get 請求,伺服器傳回一個xml 文檔)

solr和lucene之間的差別

lucene全文檢索的工具包,jar包

solr全文檢索伺服器,單獨運作的servlet容器

作者:Ms_lang

繼續閱讀