lucene 源码分析_Lucene分析过程指南
lucene 源碼分析
本文是我們名為“ Apache Lucene基礎知識 ”的學院課程的一部分。
在本課程中,您將了解Lucene。 您將了解為什么這樣的庫很重要,然后了解Lucene中搜索的工作方式。 此外,您將學習如何將Lucene Search集成到您自己的應用程序中,以提供強大的搜索功能。 在這里查看 !
目錄
1.簡介 2.使用分析儀1.簡介
在Lucene中,分析是將字段文本轉換為其最基本的索引表示形式(術語)的過程。 通常,將令牌稱為分析器的單詞(我們僅在參考英語時討論該主題)。 但是,對于特殊的分析器,令牌可以帶有多個單詞,其中也包括空格。 這些術語用于確定在搜索過程中哪些文檔與查詢匹配。 例如,如果您在字段中為該句子編入索引,則術語可能以for和example開頭,依此類推,依次排列為單獨的術語。 分析器是分析過程的封裝。 分析器通過對文本執行任何數量的操作來標記文本,這些操作可能包括提取單詞,丟棄標點符號,從字符中刪除重音,小寫(也稱為規范化),刪除常用單詞,將單詞簡化為詞根形式(詞干)或更改單詞變成基本形式(詞義化)。 此過程也稱為標記化,從文本流中提取的文本塊稱為標記。 標記及其相關的字段名稱是術語。
2.使用分析儀
Lucene的主要目標是促進信息檢索。 強調檢索很重要。 您想在Lucene上放置一小段文字,然后讓該文字中的各個單詞進行豐富的搜索。 為了讓Lucene知道什么是“單詞”,它會在索引編制過程中分析文本并將其提取為術語。 這些術語是用于搜索的原始構建塊。
對于Lucene,選擇合適的分析儀是一項至關重要的開發決定,而且一個尺寸絕對不能滿足所有需求。 語言是一個因素,因為每種語言都有其獨特的功能。 要考慮的另一個因素是要分析的文本的范圍。 不同行業的術語,首字母縮寫詞和縮寫詞可能會引起注意。 任何分析儀都無法滿足所有情況。 內置的分析選項可能無法滿足我們的需求,因此我們必須投資創建定制的分析解決方案。 幸運的是,Lucene的構建基塊使此操作非常容易。
通常,Lucene分析儀的設計遵循以下步驟:
實際文本–>基本令牌準備–>小寫過濾–>停用詞過濾(否定不太有用的詞,占內容中40-50%的詞的否定)–>通過自定義邏輯過濾–>最終令牌準備用于在lucene中建立索引,這將在lucene的搜索中參考。
不同的分析器使用不同的標記器,在此基礎上,輸出標記流–文本組的順序將有所不同。
詞干用于獲取相關詞的詞根。 例如,對于單詞running,ran,run等,將運行根詞。 在分析器中使用此功能可通過搜索api使搜索范圍的內容更高。 如果在索引中引用了根詞,則可能是針對確切的單詞,我們可以在索引中有多個選項進行搜索,并且短語匹配的可能性可能更高。 因此,這種概念(稱為詞干分析器)經常用于分析儀設計中。
停用詞是書面語言中常用但不太有用的詞。 對于英語,這些單詞是“ a”,“ the”,“ I”等。
在不同的分析器中,將從停止詞中清除令牌流,以使索引對搜索結果更有用。
Lucene分析儀的工作過程
分析過程分為三個部分。 為了幫助說明該過程,我們將使用以下原始文本作為示例。 (處理HTML或PDF文檔以獲得標題,主要文本和其他要分析的字段稱為解析,這超出了分析的范圍。假設解析器已經從較大的文檔中提取了此文本。)
<h1>Building a <em>top-notch</em> search engine</h1>首先,字符過濾器對要分析的原始文本進行預處理。 例如,HTML Strip字符過濾器將刪除HTML。 現在,我們剩下了以下文本:
Building a top-notch search engine接下來,令牌生成器將預處理的文本分解為令牌。 令牌通常是單詞,但是不同的令牌生成器處理特殊情況(例如“ top-notch”)的方式有所不同。 一些令牌生成器(例如標準令牌生成器)將破折號視為單詞邊界,因此“ top-notch”將是兩個令牌(“ top”和“ notch”)。 其他令牌生成器(例如,空白令牌生成器)僅將空白視為單詞邊界,因此“ top-notch”將是單個令牌。 還有一些不尋常的令牌生成器,例如NGram令牌生成器,它會生成部分單詞的令牌。
假設破折號被認為是單詞邊界,我們現在有:
[Building] [a] [top] [notch] [search] [engine]最后,令牌過濾器對令牌執行其他處理,例如刪除后綴(稱為詞干)并將字符轉換為小寫。 令牌的最終序列可能看起來像這樣:
[build] [a] [top] [notch] [search] [engine]分詞器和零個或多個過濾器的組合構成了一個分析器。 默認情況下,使用標準分析器,該分析器由標準標記器和標準,小寫和停止標記過濾器組成。
分析儀可以執行更復雜的操作以獲得更好的結果。 例如,分析人員可能會使用令牌過濾器來拼寫檢查詞或引入同義詞,以便搜索“ saerch”或“ find”都將返回包含“ Searching”的文檔。 也有類似功能的不同實現方式可供選擇。
除了在包括的分析器之間進行選擇之外,我們還可以通過將現有的標記器和零個或多個過濾器鏈接在一起來創建自己的自定義分析器。 標準分析器不執行詞干分析,因此您可能需要創建一個包含詞干標記過濾器的自定義分析器。
有這么多的可能性,我們可以測試不同的組合,看看哪種方法最適合我們的情況。
3.分析儀的類型
在Lucene中,一些不同的分析器是:
一個。 空白分析儀
空格分析器根據空格將文本處理為令牌。 空白之間的所有字符均已建立索引。 在此,停用詞不用于分析,并且大小寫不變。 Whitespace分析器是使用Whitespace Tokenizer(Whitespace標記生成器)(Whitespace類型的標記生成器,用于在空白處分割文本)構建的。
b。 簡單分析器
SimpleAnalyser使用字母標記器和小寫過濾從內容中提取標記并將其放入Lucene索引中。 簡單的分析器是使用小寫標記器構建的。 小寫的標記符執行字母標記符和小寫標記過濾器的功能。 它以非字母分隔文本并將其轉換為小寫。 盡管它在功能上等同于Letter令牌生成器和小寫令牌過濾器的組合,但同時執行兩個任務具有性能優勢,因此是這種(冗余的)實現。
C。 停止分析器
StopAnalyser刪除了對索引不太有用的常見英語單詞。 這些是通過向分析器提供STOP_WORDS列表的列表來完成的。
Stop分析器是使用帶有Stop令牌過濾器的小寫令牌生成器構建的(Stop類型的令牌過濾器可從令牌流中刪除停用詞)
以下是可以為停止分析器類型設置的設置:
- 停用詞->用來停用過濾器的停用詞列表。 默認為英語停用詞。
- stopwords_path->停用詞文件配置的路徑(相對于配置位置或絕對路徑)。
d。 標準分析儀
StandardAnalyser是通用分析器。 它通常在標準停用詞的幫助下將標記轉換為小寫字母以分析文本,并且還受其他規則約束。 StandardAnalyzer是將標準令牌生成器與標準令牌過濾器(標準類型的令牌過濾器,對使用標準令牌生成器提取的令牌進行歸一化處理),小寫令牌過濾器和停止令牌過濾器一起構建的。
e。 經典分析儀
使用英語停用詞列表通過ClassicFilter,LowerCaseFilter和StopFilter過濾ClassicTokenizer的分析器。
F。 UAX29URLEmailAnalyzer
使用英語停用詞列表,使用StandardFilter,LowerCaseFilter和StopFilter過濾UAX29URLEmailTokenizer的分析器。
G。 關鍵字分析器
類型為關鍵字的分析器,可將整個流“標記為”單個標記。 這對于諸如郵政編碼,ID之類的數據很有用。 注意,使用映射定義時,將字段簡單標記為not_analyzed可能更有意義。
H。 雪球分析儀
使用標準標記器,標準過濾器,小寫過濾器,停止過濾器和雪球過濾器的雪球分析器。
Snowball Analyzer是Lucene的詞干分析器,其最初基于snowball.tartarus.org的snowball項目。
用法示例:
{"index" : {"analysis" : {"analyzer" : {"my_analyzer" : {"type" : "snowball","language" : "English"}}}}}一世。 模式分析儀
類型模式分析器,可以通過正則表達式靈活地將文本分成術語。 接受以下設置:
模式分析器示例:
空白令牌生成器:
curl -XPUT 'localhost:9200/test' -d '{"settings":{"analysis": {"analyzer": {"whitespace":{"type": "pattern","pattern":"\\\\\\\\s+"}}}}}curl 'localhost:9200/test/_analyze?pretty=1&analyzer=whitespace' -d 'foo,bar baz'# "foo,bar", "baz"非單詞字符標記器:
curl -XPUT 'localhost:9200/test' -d '{"settings":{"analysis": {"analyzer": {"nonword":{"type": "pattern","pattern":"[^\\\\\\\\w]+"}}}}}curl 'localhost:9200/test/_analyze?pretty=1&analyzer=nonword' -d 'foo,bar baz'</strong># "foo,bar baz" becomes "foo", "bar", "baz"curl 'localhost:9200/test/_analyze?pretty=1&analyzer=nonword' -d 'type_1-type_4'</strong># "type_1","type_4"駝峰標記器:
curl -XPUT 'localhost:9200/test?pretty=1' -d '{"settings":{"analysis": {"analyzer": {"camel":{"type": "pattern","pattern":"([^\\\\\\\\p{L}\\\\\\\\d]+)|(?<=\\\\\\\\D)(?=\\\\\\\\d)|(?<=\\\\\\\\d)(?=\\\\\\\\D)|(?<=[\\\\\\\\p{L}&&[^\\\\\\\\p{Lu}]])(?=\\\\\\\\p{Lu})|(?<=\\\\\\\\p{Lu})(?=\\\\\\\\p{Lu}[\\\\\\\\p{L}&&[^\\\\\\\\p{Lu}]])"}}}}}curl 'localhost:9200/test/_analyze?pretty=1&analyzer=camel' -d 'MooseX::FTPClass2_beta'# "moose","x","ftp","class","2","beta"上面的正則表達式更容易理解為:
| ([^ \\ p {L} \\ d] +) | #吞下非字母和數字, |
| | (?<= \\ D)(?= \\ d) | #或非數字后跟數字, |
| | (?<= \\ d)(?= \\ D) | #或數字后跟非數字, |
| | (?<= [\\ p {L} && [^ \\ p {Lu}]]) | #或小寫 |
| (?= \\ p {Lu}) | #后跟大寫字母, |
| | (?<= \\ p {Lu}) | #或大寫 |
| (?= \\ p {Lu} | #后跟大寫 |
| [\\ p {L} && [^ \\ p {Lu}]] | #然后小寫 |
表格1
j。 定制分析儀
一種自定義類型的分析器,允許將令牌生成器與零個或多個令牌過濾器以及零個或多個字符過濾器組合。 定制分析器接受要使用的標記器的邏輯/注冊名稱,以及標記過濾器的邏輯/注冊名稱的列表。
這是自定義分析器的示例:
index :analysis :analyzer :myAnalyzer2 :type : customtokenizer : myTokenizer1filter : [myTokenFilter1, myTokenFilter2]char_filter : [my_html]tokenizer :myTokenizer1 :type : standardmax_token_length : 900filter :myTokenFilter1 :type : stopstopwords : [stop1, stop2, stop3, stop4]myTokenFilter2 :type : lengthmin : 0max : 2000char_filter :my_html :type : html_stripescaped_tags : [xxx, yyy]read_ahead : 1024語言參數可以與雪球過濾器具有相同的值,并且默認為英語。 請注意,并非所有語言分析器都提供默認的停用詞集。
stopwords參數可用于為沒有默認語言的語言提供停用詞,或僅用您的自定義列表替換默認設置。 檢查Stop Analyzer以獲取更多詳細信息。 例如,此處和此處都提供了其中許多語言的默認停用詞集。
一個配置示例(YAML格式),指定瑞典語并帶有停用詞:
index :analysis :analyzer :my_analyzer:type: snowballlanguage: Swedishstopwords: "och,det,att,i,en,jag,hon,som,han,p?,den,med,var,sig,f?r,s?,till,?r,men,ett,om,hade,de,av,icke,mig,du,henne,d?,sin,nu,har,inte,hans,honom,skulle,hennes,d?r,min,man,ej,vid,kunde,n?got,fr?n,ut,n?r,efter,upp,vi,dem,vara,vad,?ver,?n,dig,kan,sina,h?r,ha,mot,alla,under,n?gon,allt,mycket,sedan,ju,denna,sj?lv,detta,?t,utan,varit,hur,ingen,mitt,ni,bli,blev,oss,din,dessa,n?gra,deras,blir,mina,samma,vilken,er,s?dan,v?r,blivit,dess,inom,mellan,s?dant,varf?r,varje,vilka,ditt,vem,vilket,sitta,s?dana,vart,dina,vars,v?rt,v?ra,ert,era,vilkas"這是一個自定義字符串分析器的示例,該示例是通過擴展Lucene的抽象Analyzer類而構建的。 以下清單顯示了實現了tokenStream(String,Reader)方法的SampleStringAnalyzer。 SampleStringAnalyzer定義了一組停用詞,可以使用Lucene提供的StopFilter在索引過程中將其丟棄。 tokenStream方法檢查正在建立索引的字段。 如果該字段是注釋,它將首先使用LowerCaseTokenizer對輸入進行標記和小寫,使用StopFilter消除英語的停用詞(一組有限的英語停用詞),并使用PorterStemFilter除去常見的詞尾變化形式。 如果要索引的內容不是注釋,則分析器使用LowerCaseTokenizer對輸入進行標記化和小寫,并使用StopFilter消除Java關鍵字。
public class SampleStringAnalyzer extends Analyzer {private Set specialStopSet;private Set englishStopSet;private static final String[] SPECIALWORD_STOP_WORDS = {"abstract","implements","extends","null""new","switch","case", "default" ,"synchronized" ,"do", "if", "else", "break","continue","this","assert" ,"for", "transient","final", "static","catch","try","throws","throw","class", "finally","return","const" , "native", "super","while", "import","package" ,"true", "false" };private static final String[] ENGLISH_STOP_WORDS ={"a", "an", "and", "are","as","at","be" "but","by", "for", "if", "in", "into", "is", "it","no", "not", "of", "on", "or", "s", "such","that", "the", "their", "then", "there","these","they", "this", "to", "was", "will", "with" };public SourceCodeAnalyzer(){super();specialStopSet = StopFilter.makeStopSet(SPECIALWORD_STOP_WORDS);englishStopSet = StopFilter.makeStopSet(ENGLISH_STOP_WORDS);}public TokenStream tokenStream(String fieldName,Reader reader) {if (fieldName.equals("comment"))return new PorterStemFilter(new StopFilter(new LowerCaseTokenizer(reader),englishStopSet));elsereturn new StopFilter(new LowerCaseTokenizer(reader),specialStopSet);}}}分析儀內部是什么?
分析人員需要返回TokenStream
圖1
將文本分析為令牌:
在文本字段上進行搜索和建立索引需要將文本數據處理為令牌。 軟件包oal.analysis包含用于對文本進行標記和索引的基類。 處理可以由一系列轉換組成,例如,空白標記化,大小寫規范化,停止列表和詞干。
抽象類oal.analysis.TokenStream將輸入的文本分成一系列標記,這些標記使用類似迭代器的模式進行檢索。 TokenStream有兩個子類: oal.analysis.Tokenizer和oal.analysis.TokenFilter 。 Tokenizer將java.io.Reader作為輸入,而TokenFilter將另一個oal.analysis.TokenStream作為輸入。 這使我們可以將令牌生成器鏈接在一起,以便初始令牌生成器從讀取器獲取其輸入,其他令牌生成器則對鏈中先前TokenStream中的令牌進行操作。
oal.analysis.Analyzer在每個字段上為oal.analysis.Analyzer提供索引和搜索過程。 它將字段名稱映射到令牌生成器,還可以為未知字段名稱提供默認分析器。 Lucene包含許多分析模塊,這些模塊提供了各種分析儀的具體實現。 從Lucene 4開始,這些模塊被捆綁到單獨的jar文件中。 有幾個特定語言的十幾分析軟件包,從oal.analysis.ar為阿拉伯語oal.analysis.tr土耳其。 軟件包oal.analysis.core提供了幾個通用分析器,令牌生成器和令牌生成器工廠類。
抽象類oal.analysis.Analyzer包含用于從輸入文本中提取術語的方法。 Analyzer的具體子類必須重寫方法createComponents ,該方法返回嵌套類TokenStreamComponents的對象,該對象定義令牌化過程并提供對處理管道的初始組件和文件組件的訪問。 初始組件是處理輸入源的Tokenizer。 最后一個組件是TokenFilter的一個實例,它是方法Analyzer.tokenStream(String,Reader)返回的TokenStream。 這是一個自定義分析器的示例,該分析器將其輸入標記為單個單詞(所有字母均小寫)。
Analyzer analyzer = new Analyzer() {@Overrideprotected TokenStreamComponents createComponents(String fieldName, Reader reader) {Tokenizer source =new StandardTokenizer(VERSION,reader);TokenStream filter =new LowerCaseFilter(VERSION,source);return new TokenStreamComponents(source, filter);} };oal.analysis.standard.StandardTokenizer和oal.analysis.core.LowerCaseFilter對象的構造函數需要一個Version參數。 還要注意,軟件包oal.analysis.standard分布在jarfile lucene-analyzers-common-4.xyjar中,其中x和y是次要版本和發行版號。
我們應該使用哪個核心分析儀?
現在,我們已經看到了四個核心Lucene分析儀在工作方式上的實質性差異。 為我們的應用程序選擇合適的分析儀會讓我們感到驚訝:大多數應用程序不使用任何內置分析儀,而是選擇創建自己的分析儀鏈。 對于那些確實使用核心分析器的應用程序,StandardAnalyzer可能是最常見的選擇。 對于大多數應用程序而言,其余的核心分析器通常過于簡單,除非特定的用例(例如,包含零件號列表的字段可能使用Whitespace-Analyzer)。 但是這些分析儀非常適合測試用例,并且確實被Lucene的單元測試大量使用。
通常,應用程序具有特定的需求,例如自定義停用詞列表,對諸如零件號或同義詞擴展之類的特定于應用程序的標記執行特殊的標記化,保留某些標記的大小寫或選擇特定的詞干算法。
翻譯自: https://www.javacodegeeks.com/2015/09/lucene-analysis-process-guide.html
lucene 源碼分析
總結
以上是生活随笔為你收集整理的lucene 源码分析_Lucene分析过程指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 延时一微秒_让我们暂停一微秒
- 下一篇: javaone_JavaOne和OOW