Lucene分析过程指南
本文是我們名為“ Apache Lucene基礎(chǔ)知識(shí) ”的學(xué)院課程的一部分。
在本課程中,您將了解Lucene。 您將了解為什么這樣的庫(kù)很重要,然后了解Lucene中搜索的工作方式。 此外,您將學(xué)習(xí)如何將Lucene Search集成到您自己的應(yīng)用程序中,以提供強(qiáng)大的搜索功能。 在這里查看 !
目錄
1.簡(jiǎn)介 2.使用分析儀1.簡(jiǎn)介
在Lucene中,分析是將字段文本轉(zhuǎn)換為其最基本的索引表示形式(術(shù)語(yǔ))的過(guò)程。 通常,將令牌稱(chēng)為分析器的單詞(我們僅在參考英語(yǔ)時(shí)討論該主題)。 但是,對(duì)于特殊的分析器,令牌可以帶有多個(gè)單詞,其中也包括空格。 這些術(shù)語(yǔ)用于確定在搜索過(guò)程中哪些文檔與查詢匹配。 例如,如果您在字段中為該句子編入索引,則術(shù)語(yǔ)可能以for和example開(kāi)頭,依此類(lèi)推,依次排列為單獨(dú)的術(shù)語(yǔ)。 分析器是分析過(guò)程的封裝。 分析器通過(guò)對(duì)文本執(zhí)行任意數(shù)量的操作來(lái)標(biāo)記文本,這些操作可能包括提取單詞,丟棄標(biāo)點(diǎn)符號(hào),從字符中刪除重音,小寫(xiě)(也稱(chēng)為規(guī)范化),刪除常用單詞,將單詞簡(jiǎn)化為詞根形式(詞干)或更改單詞變成基本形式(詞義化)。 此過(guò)程也稱(chēng)為標(biāo)記化,從文本流中提取的文本塊稱(chēng)為標(biāo)記。 標(biāo)記及其相關(guān)的字段名稱(chēng)是術(shù)語(yǔ)。
2.使用分析儀
Lucene的主要目標(biāo)是促進(jìn)信息檢索。 強(qiáng)調(diào)檢索很重要。 您想在Lucene上放置一小段文字,然后讓該文字中的各個(gè)單詞進(jìn)行豐富的搜索。 為了讓Lucene知道什么是“單詞”,它會(huì)在索引編制過(guò)程中分析文本并將其提取為術(shù)語(yǔ)。 這些術(shù)語(yǔ)是用于搜索的原始構(gòu)建塊。
選擇合適的分析儀是Lucene至關(guān)重要的開(kāi)發(fā)決定,而且一個(gè)尺寸絕對(duì)不能滿足所有需求。 語(yǔ)言是一個(gè)因素,因?yàn)槊糠N語(yǔ)言都有其獨(dú)特的功能。 要考慮的另一個(gè)因素是要分析的文本的范圍。 不同的行業(yè)可能會(huì)有不同的術(shù)語(yǔ),首字母縮寫(xiě)詞和縮寫(xiě),因此值得關(guān)注。 任何分析儀都無(wú)法滿足所有情況。 內(nèi)置分析選項(xiàng)可能無(wú)法滿足我們的需求,我們將不得不投資創(chuàng)建定制的分析解決方案。 幸運(yùn)的是,Lucene的構(gòu)建基塊使此操作非常容易。
通常,Lucene分析儀是按照以下步驟設(shè)計(jì)的:
實(shí)際文本–>基本令牌準(zhǔn)備–>小寫(xiě)過(guò)濾–>停用詞過(guò)濾(否定不太有用的詞,占內(nèi)容中40-50%的詞)–>通過(guò)自定義邏輯過(guò)濾–>最終令牌準(zhǔn)備用于在lucene中建立索引,這將在lucene的搜索中參考。
不同的分析器使用不同的標(biāo)記器,在此基礎(chǔ)上,輸出標(biāo)記流–文本組的順序?qū)⒂兴煌?
詞干用于獲取有問(wèn)題的單詞的詞根。 例如,對(duì)于單詞running,ran,run等,將運(yùn)行根詞。 在分析器中使用此功能可通過(guò)搜索api使搜索范圍的內(nèi)容更高。 如果在索引中引用了根詞,則可能是針對(duì)確切的詞,我們可以在索引中有多個(gè)選項(xiàng)進(jìn)行搜索,并且短語(yǔ)匹配的可能性可能更高。 因此,這一概念(稱(chēng)為詞干分析器)經(jīng)常用于分析儀設(shè)計(jì)中。
停用詞是書(shū)面語(yǔ)言中常用但不太有用的詞。 對(duì)于英語(yǔ),這些單詞是“ a”,“ the”,“ I”等。
在不同的分析器中,將從停止詞中清除令牌流,以使索引對(duì)搜索結(jié)果更有用。
Lucene分析儀的工作過(guò)程
分析過(guò)程分為三個(gè)部分。 為了幫助說(shuō)明該過(guò)程,我們將使用以下原始文本作為示例。 (處理HTML或PDF文檔以獲得標(biāo)題,主要文本和其他要分析的字段稱(chēng)為解析,這超出了分析范圍。我們假設(shè)解析器已經(jīng)從較大的文檔中提取了此文本。)
<h1>Building a <em>top-notch</em> search engine</h1>首先,字符過(guò)濾器對(duì)要分析的原始文本進(jìn)行預(yù)處理。 例如,HTML Strip字符過(guò)濾器將刪除HTML。 我們現(xiàn)在剩下的是這個(gè)文本:
Building a top-notch search engine接下來(lái),令牌生成器將預(yù)處理的文本分解為令牌。 令牌通常是單詞,但是不同的令牌生成器處理特殊情況(例如“ top-notch”)的方式有所不同。 一些令牌生成器(例如標(biāo)準(zhǔn)令牌生成器)將破折號(hào)視為單詞邊界,因此“ top-notch”將是兩個(gè)令牌(“ top”和“ notch”)。 其他令牌生成器(如Whitespace令牌生成器)僅將空格視為單詞邊界,因此“ top-notch”將是單個(gè)令牌。 還有一些不尋常的令牌生成器,例如NGram令牌生成器,它會(huì)生成部分單詞的令牌。
假設(shè)破折號(hào)被認(rèn)為是單詞邊界,我們現(xiàn)在有:
[Building] [a] [top] [notch] [search] [engine]最后,令牌過(guò)濾器對(duì)令牌執(zhí)行其他處理,例如刪除后綴(稱(chēng)為詞干)并將字符轉(zhuǎn)換為小寫(xiě)。 令牌的最終序列可能看起來(lái)像這樣:
[build] [a] [top] [notch] [search] [engine]分詞器和零個(gè)或多個(gè)過(guò)濾器的組合構(gòu)成了一個(gè)分析器。 默認(rèn)情況下,使用標(biāo)準(zhǔn)分析器,該分析器由標(biāo)準(zhǔn)標(biāo)記器和標(biāo)準(zhǔn),小寫(xiě)和停止標(biāo)記過(guò)濾器組成。
分析儀可以執(zhí)行更復(fù)雜的操作以獲得更好的結(jié)果。 例如,分析人員可能會(huì)使用令牌過(guò)濾器來(lái)拼寫(xiě)檢查詞或引入同義詞,以便搜索“ saerch”或“ find”都將返回包含“ Searching”的文檔。 也有類(lèi)似功能的不同實(shí)現(xiàn)方式可供選擇。
除了在包括的分析器之間進(jìn)行選擇之外,我們還可以通過(guò)將現(xiàn)有令牌生成器和零個(gè)或多個(gè)過(guò)濾器鏈接在一起來(lái)創(chuàng)建自己的自定義分析器。 標(biāo)準(zhǔn)分析器不執(zhí)行詞干分析,因此您可能需要?jiǎng)?chuàng)建一個(gè)包含詞干標(biāo)記過(guò)濾器的自定義分析器。
有這么多的可能性,我們可以測(cè)試不同的組合,看看哪種方法最適合我們的情況。
3.分析儀的類(lèi)型
在Lucene中,一些不同的分析器是:
一個(gè)。 空白分析儀
空格分析器根據(jù)空格將文本處理為令牌。 空格之間的所有字符均已編制索引。 在此,停用詞不用于分析,并且大小寫(xiě)不變。 Whitespace分析器是使用Whitespace Tokenizer(Whitespace標(biāo)記生成器)(Whitespace類(lèi)型的標(biāo)記生成器,將空白分隔文本)構(gòu)建的。
b。 簡(jiǎn)單分析器
SimpleAnalyser使用字母標(biāo)記器和小寫(xiě)過(guò)濾從內(nèi)容中提取標(biāo)記,并將其放入Lucene索引中。 簡(jiǎn)單的分析器是使用小寫(xiě)標(biāo)記器構(gòu)建的。 小寫(xiě)令牌生成器一起執(zhí)行字母令牌生成器和小寫(xiě)令牌過(guò)濾器的功能。 它以非字母分隔文本并將其轉(zhuǎn)換為小寫(xiě)。 盡管它在功能上等同于Letter令牌生成器和小寫(xiě)令牌過(guò)濾器的組合,但同時(shí)執(zhí)行兩個(gè)任務(wù)具有性能優(yōu)勢(shì),因此是這種(冗余的)實(shí)現(xiàn)。
C。 停止分析器
StopAnalyser刪除對(duì)索引不太有用的常見(jiàn)英語(yǔ)單詞。 這些是通過(guò)為分析器提供STOP_WORDS列表的列表來(lái)完成的。
Stop分析器是使用帶有Stop令牌過(guò)濾器的小寫(xiě)令牌生成器構(gòu)建的(Stop類(lèi)型的令牌過(guò)濾器可從令牌流中刪除停用詞)
以下是可以為停止分析器類(lèi)型設(shè)置的設(shè)置:
- 停用詞->用來(lái)停用過(guò)濾器的停用詞列表。 默認(rèn)為英語(yǔ)停用詞。
- stopwords_path->停用詞文件配置的路徑(相對(duì)于配置位置或絕對(duì)路徑)。
d。 標(biāo)準(zhǔn)分析儀
StandardAnalyser是通用分析器。 它通常在標(biāo)準(zhǔn)停用詞的幫助下將標(biāo)記轉(zhuǎn)換為小寫(xiě)字母以分析文本,并且還受其他規(guī)則約束。 StandardAnalyzer是通過(guò)將標(biāo)準(zhǔn)令牌生成器與標(biāo)準(zhǔn)令牌過(guò)濾器(標(biāo)準(zhǔn)類(lèi)型的令牌過(guò)濾器,對(duì)使用標(biāo)準(zhǔn)令牌生成器提取的令牌進(jìn)行歸一化處理),小寫(xiě)令牌過(guò)濾器和停止令牌過(guò)濾器構(gòu)建而成。
e。 經(jīng)典分析儀
使用英語(yǔ)停用詞列表通過(guò)ClassicFilter,LowerCaseFilter和StopFilter過(guò)濾ClassicTokenizer的分析器。
F。 UAX29URLEmailAnalyzer
分析器使用英語(yǔ)停用詞列表,通過(guò)StandardFilter,LowerCaseFilter和StopFilter過(guò)濾UAX29URLEmailTokenizer。
G。 關(guān)鍵字分析器
類(lèi)型為關(guān)鍵字的分析器,可將整個(gè)流“標(biāo)記為”單個(gè)標(biāo)記。 這對(duì)于諸如郵政編碼,ID等數(shù)據(jù)很有用。 注意,使用映射定義時(shí),將字段簡(jiǎn)單標(biāo)記為not_analyzed可能更有意義。
H。 雪球分析儀
使用標(biāo)準(zhǔn)標(biāo)記器,標(biāo)準(zhǔn)過(guò)濾器,小寫(xiě)過(guò)濾器,停止過(guò)濾器和雪球過(guò)濾器的雪球分析器。
Snowball Analyzer是Lucene的詞干分析器,其最初基于snowball.tartarus.org的snowball項(xiàng)目。
用法示例:
{"index" : {"analysis" : {"analyzer" : {"my_analyzer" : {"type" : "snowball","language" : "English"}}}}}一世。 模式分析儀
類(lèi)型模式分析器,可以通過(guò)正則表達(dá)式靈活地將文本分成術(shù)語(yǔ)。 接受以下設(shè)置:
模式分析器示例:
空白令牌生成器:
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"非單詞字符標(biāo)記器:
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"駝峰標(biāo)記器:
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"上面的正則表達(dá)式更容易理解為:
| ([^ \\ p {L} \\ d] +) | #吞下非字母和數(shù)字, |
| | (?<= \\ D)(?= \\ d) | #或非數(shù)字后跟數(shù)字, |
| | (?<= \\ d)(?= \\ D) | #或數(shù)字后跟非數(shù)字, |
| | (?<= [\\ p {L} && [^ \\ p {Lu}]]) | #或小寫(xiě) |
| (?= \\ p {Lu}) | #后跟大寫(xiě)字母, |
| | (?<= \\ p {Lu}) | #或大寫(xiě) |
| (?= \\ p {Lu} | #后跟大寫(xiě) |
| [\\ p {L} && [^ \\ p {Lu}]] | #然后小寫(xiě) |
表格1
j。 定制分析儀
一種自定義類(lèi)型的分析器,它允許將令牌生成器與零個(gè)或多個(gè)令牌過(guò)濾器以及零個(gè)或多個(gè)字符過(guò)濾器組合。 定制分析器接受要使用的標(biāo)記器的邏輯/注冊(cè)名稱(chēng),以及標(biāo)記過(guò)濾器的邏輯/注冊(cè)名稱(chēng)的列表。
這是自定義分析器的示例:
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語(yǔ)言參數(shù)可以與雪球過(guò)濾器具有相同的值,并且默認(rèn)為英語(yǔ)。 請(qǐng)注意,并非所有語(yǔ)言分析器都提供默認(rèn)的停用詞集。
stopwords參數(shù)可用于為沒(méi)有默認(rèn)語(yǔ)言的語(yǔ)言提供停用詞,或僅用您的自定義列表替換默認(rèn)設(shè)置。 檢查Stop Analyzer以獲取更多詳細(xì)信息。 例如,此處和此處都提供了其中許多語(yǔ)言的默認(rèn)停用詞集。
一個(gè)配置示例(YAML格式),指定瑞典語(yǔ)并帶有停用詞:
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"這是一個(gè)自定義字符串分析器的示例,該示例是通過(guò)擴(kuò)展Lucene的抽象Analyzer類(lèi)而構(gòu)建的。 下面的清單顯示了實(shí)現(xiàn)了tokenStream(String,Reader)方法的SampleStringAnalyzer。 SampleStringAnalyzer定義了一組停用詞,可以使用Lucene提供的StopFilter在索引過(guò)程中將其丟棄。 tokenStream方法檢查正在建立索引的字段。 如果該字段是注釋,它將首先使用LowerCaseTokenizer對(duì)輸入進(jìn)行標(biāo)記和小寫(xiě),使用StopFilter消除英語(yǔ)的停用詞(一組有限的英語(yǔ)停用詞),然后使用PorterStemFilter除去常見(jiàn)的詞尾變化形式。 如果要索引的內(nèi)容不是注釋,則分析器使用LowerCaseTokenizer對(duì)輸入進(jìn)行標(biāo)記化和小寫(xiě),并使用StopFilter消除Java關(guān)鍵字。
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);}}}分析儀內(nèi)部是什么?
分析人員需要返回TokenStream
圖1
將文本分析為令牌:
在文本字段上進(jìn)行搜索和建立索引需要將文本數(shù)據(jù)處理為令牌。 軟件包oal.analysis包含用于對(duì)文本進(jìn)行標(biāo)記和索引的基類(lèi)。 處理可以由一系列轉(zhuǎn)換組成,例如,空格標(biāo)記化,大小寫(xiě)規(guī)范化,停止列表和詞干。
抽象類(lèi)oal.analysis.TokenStream將輸入的文本分成一系列標(biāo)記,這些標(biāo)記使用類(lèi)似迭代器的模式進(jìn)行檢索。 TokenStream有兩個(gè)子類(lèi): oal.analysis.Tokenizer和oal.analysis.TokenFilter 。 Tokenizer將java.io.Reader作為輸入,而TokenFilter將另一個(gè)oal.analysis.TokenStream作為輸入。 這使我們可以將令牌生成器鏈接在一起,以便初始令牌生成器從讀取器獲取其輸入,其他令牌生成器則對(duì)鏈中先前TokenStream中的令牌進(jìn)行操作。
oal.analysis.Analyzer在每個(gè)字段上為oal.analysis.Analyzer提供索引和搜索過(guò)程。 它將字段名稱(chēng)映射到令牌生成器,還可以為未知字段名稱(chēng)提供默認(rèn)分析器。 Lucene包括許多分析模塊,這些模塊提供了各種分析儀的具體實(shí)現(xiàn)。 從Lucene 4開(kāi)始,這些模塊被捆綁到單獨(dú)的jar文件中。 有幾個(gè)特定語(yǔ)言的十幾分析軟件包,從oal.analysis.ar為阿拉伯語(yǔ)oal.analysis.tr土耳其。 軟件包oal.analysis.core提供了幾個(gè)通用分析器,令牌生成器和令牌生成器工廠類(lèi)。
抽象類(lèi)oal.analysis.Analyzer包含用于從輸入文本中提取術(shù)語(yǔ)的方法。 Analyzer的具體子類(lèi)必須重寫(xiě)createComponents方法,該方法返回嵌套類(lèi)TokenStreamComponents的對(duì)象,該對(duì)象定義令牌化過(guò)程并提供對(duì)處理管道的初始和文件組件的訪問(wèn)。 初始組件是處理輸入源的Tokenizer。 最后一個(gè)組件是TokenFilter的一個(gè)實(shí)例,它是方法Analyzer.tokenStream(String,Reader)返回的TokenStream。 這是一個(gè)自定義分析器的示例,該分析器將其輸入標(biāo)記為單個(gè)單詞(所有字母均小寫(xiě))。
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對(duì)象的構(gòu)造函數(shù)需要一個(gè)Version參數(shù)。 還要注意,軟件包oal.analysis.standard分布在jarfile lucene-analyzers-common-4.xyjar中,其中x和y是次要版本和發(fā)行版號(hào)。
我們應(yīng)該使用哪個(gè)核心分析儀?
現(xiàn)在,我們已經(jīng)看到了四個(gè)核心Lucene分析儀在工作方式上的實(shí)質(zhì)性差異。 為我們的應(yīng)用程序選擇合適的分析儀會(huì)讓我們感到驚訝:大多數(shù)應(yīng)用程序不使用任何內(nèi)置分析儀,而是選擇創(chuàng)建自己的分析儀鏈。 對(duì)于那些確實(shí)使用核心分析器的應(yīng)用程序,StandardAnalyzer可能是最常見(jiàn)的選擇。 對(duì)于大多數(shù)應(yīng)用程序而言,其余的核心分析儀通常過(guò)于簡(jiǎn)單,除非特定的用例(例如,包含零件編號(hào)列表的字段可能使用Whitespace-Analyzer)。 但是這些分析儀非常適合測(cè)試用例,并且確實(shí)被Lucene的單元測(cè)試大量使用。
通常,應(yīng)用程序具有特定的需求,例如自定義停用詞列表,對(duì)諸如零件號(hào)或同義詞擴(kuò)展之類(lèi)的特定于應(yīng)用程序的標(biāo)記執(zhí)行特殊的標(biāo)記化,保留某些標(biāo)記的大小寫(xiě)或選擇特定的詞干算法。
翻譯自: https://www.javacodegeeks.com/2015/09/lucene-analysis-process-guide.html
總結(jié)
以上是生活随笔為你收集整理的Lucene分析过程指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 苏姿丰:AMD 将成为台积电亚利桑那厂首
- 下一篇: Redis教程:NoSQL键值存储