1. 程式人生 > >Lucene&Solr&ElasticSearch-面試題

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檔案中配置禁用詞典:<filter class="solr.StopFilterFactory" ignore="true" words="/禁止詞檔案目錄"/>

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.index_buffer_size

增大 index.translog.flush_threshold_ops

增大 index.translog.sync_interval

增大 index.engine.robin.refresh_interval

lucence 內部結構是什麼

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

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

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

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

新新增的文件是單獨儲存在一個新生成的段中,隨著段的合併,不同的文件合併到同一個段中。

域(Field):

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

詞(Term):

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

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容器

solr安裝

     solr 的jar包分析:

     bin :命令  ;                  .sh   .bat  .cmd

 contrib: 增強功能;         

 dist:build產生的jar包    dist當中solr-4.10.3.war 全文檢索服務

          example:兩個比較重要的資料夾  

example--->sorl 為solr的home 目錄

example--->sorl---->collection1 目錄為  solr的core目錄

                            webapps

執行環境

jdk:1.7以上(lucene為1.7的版本),solr,mysql,web伺服器(tomcat7) 

solr 安裝配置

6.1.安裝tomcat

  6.2.copy檔案

6.2.1.solr.war,copy---》tomcat的webapps

  6.2.2 執行tomcat進行解壓縮(同時copy一份(防止消失),並將war 刪除掉)

6.2.3 新增日誌檔案   

       (1) solr--->example--->lib--->ext 的日誌檔案

copy 

solr--->web-Inf--->lib 目錄下

 (2)新增log4j.property

solr--->example--->resource--->log4j.properties

copy

solr--->web-Inf--->classes 目錄下(如果沒有自行建立)

     6.3在web.xml指定solrhome 目錄

apache--->webapps---->solr--->web-inf 修改web.xml檔案

                將41行的註釋幹掉,同時指定solr中的home檔案

<env-entry-value></env-entry-value>

solrcore的安裝

solrhome是solr服務執行的主目錄,solrhome包含多個solrcore,一個solrcore目錄裡面solr 例項執行時的配置檔案和資料檔案

  安裝很簡單就是將example 下面的solr目錄,拷貝到自己建立的solrhome 資料夾

solrcore 配置

     solrhome--->collection1--->conf 當中solrconfig.xml檔案當中配置lib標籤,datadir 標籤,

requestHandler 標籤:solr.install.dir : solr的安裝目錄,將檔案contrib,dist進行copy到相應的目錄下,同時solrcore的安裝目錄發生所以對應修改相應的配置。

datadir標籤:索引檔案的目錄

      requestHandler標籤:請求處理器。/update  新增,修改,刪除 ;       /select   搜尋