lucene自动补全_使用自动机的Lucene新的邻近查询
lucene自動(dòng)補(bǔ)全
最簡(jiǎn)單的Apache Lucene查詢TermQuery匹配包含指定術(shù)語的任何文檔,無論該術(shù)語出現(xiàn)在每個(gè)文檔中的何處 。 使用BooleanQuery可以將多個(gè)TermQuery組合在一起,并完全控制哪些術(shù)語是可選的( SHOULD )和哪些是必需的( MUST )或不應(yīng)該存在( MUST_NOT ),但是匹配仍然忽略了每個(gè)術(shù)語在。文件。
有時(shí)您確實(shí)在乎術(shù)語的位置,在這種情況下,Lucene具有各種所謂的鄰近查詢。
 最簡(jiǎn)單的鄰近查詢是PhraseQuery ,以匹配特定的令牌序列,例如“ Barack Obama”。 如圖所示, PhraseQuery是一條簡(jiǎn)單的線性鏈: 
默認(rèn)情況下,短語必須精確匹配,但是如果您設(shè)置非零傾斜系數(shù) ,則即使標(biāo)記不完全按順序排列,只要編輯距離在指定的傾斜范圍內(nèi),文檔仍然可以匹配。 例如,傾斜系數(shù)為1的“巴拉克·奧巴馬”還將與包含“巴拉克·侯賽因·奧巴馬”或“巴拉克·H·奧巴馬”的文檔匹配。 如下圖所示:
現(xiàn)在,圖中有多個(gè)路徑,包括任意 ( * )轉(zhuǎn)換以匹配任意標(biāo)記。 (注意:雖然圖形無法正確表達(dá)它,但此查詢還將匹配一個(gè)將令牌Barack和Obama放在同一位置的文檔,這有點(diǎn)奇怪!)
通常,鄰近查詢?cè)贑PU和IO資源上的開銷都更大,因?yàn)閷?duì)于每個(gè)潛在的文檔命中而言,鄰近查詢必須加載,解碼并訪問另一個(gè)維度(位置)。 也就是說,對(duì)于精確的匹配(無斜率),使用通用語法,帶狀皰疹和ngram來索引索引中的其他“接近項(xiàng)”可以在某些情況下提供巨大的性能改進(jìn),但要以增加索引大小為代價(jià)。
MultiPhraseQuery是另一個(gè)鄰近查詢。 它通過在每個(gè)位置允許多個(gè)令牌來概括PhraseQuery ,例如:
這與包含domain name system或domain name service任何文檔匹配。 MultiPhraseQuery還接受坡度因子,以允許進(jìn)行非精確匹配。
最后,范圍查詢(例如SpanNearQuery , SpanFirstQuery )走得更遠(yuǎn),允許您基于每個(gè)子句匹配的位置來構(gòu)建復(fù)雜的復(fù)合查詢。 它們的獨(dú)特之處在于您可以任意嵌套它們。 例如,您可以先構(gòu)建一個(gè)與SpanNearQuery = 1的巴拉克·奧巴馬(Barack Obama)匹配的SpanNearQuery ,然后再匹配一個(gè)與喬治·布什(George Bush)匹配的對(duì)象,然后再創(chuàng)建一個(gè)SpanNearQuery ,將這兩個(gè)都作為子條款,如果它們?cè)?0個(gè)詞條之內(nèi)出現(xiàn)則匹配。
TermAutomatonQuery簡(jiǎn)介
從Lucene 4.10開始,將有一個(gè)新的鄰近查詢,以進(jìn)一步概括MultiPhraseQuery和span查詢:它使您可以直接構(gòu)建一個(gè)任意自動(dòng)機(jī),表達(dá)術(shù)語必須按順序出現(xiàn)的方式,包括處理斜率的任何過渡。 這是一個(gè)例子:
這是一個(gè)非常專業(yè)的查詢,可讓您精確控制組成匹配的令牌順序。 您將按狀態(tài)和按過渡構(gòu)建自動(dòng)機(jī),包括顯式添加任何過渡(對(duì)不起,尚無QueryParser支持,歡迎使用補(bǔ)丁!)。 一旦完成,查詢將確定自動(dòng)機(jī),然后使用與諸如FuzzyQuery之類的查詢用于快速術(shù)語匹配的相同基礎(chǔ)結(jié)構(gòu)(例如CompiledAutomaton ),但將其應(yīng)用于術(shù)語位置而不是術(shù)語字節(jié)。 該查詢像短語查詢一樣天真的得分,在某些情況下可能不理想。
除了此新查詢之外,還有一個(gè)簡(jiǎn)單的實(shí)用程序類TokenStreamToTermAutomatonQuery ,該類可將任何圖TokenStream轉(zhuǎn)換為等效的TermAutomatonQuery 。 這很強(qiáng)大,因?yàn)樗馕吨词故侨我饬钆屏鲌D也可以在搜索時(shí)正確表示,并保留了某些令牌化程序現(xiàn)在設(shè)置的PositionLengthAttribute 。
盡管這意味著您最終可以在查詢時(shí)正確地應(yīng)用任意令牌流圖同義詞,因?yàn)樗饕晕创鎯?chǔ)PositionLengthAttribute ,索引時(shí)同義詞仍不完全正確 。 這就是說,它是簡(jiǎn)單的建立一個(gè)TokenFilter寫入位置長(zhǎng)度為有效載荷,然后延長(zhǎng)新TermAutomatonQuery從有效載荷讀取和匹配過程中采用的是長(zhǎng)度(補(bǔ)丁歡迎!)。
該查詢可能相當(dāng)慢,因?yàn)樗俣總€(gè)術(shù)語都是可選的。 在許多情況下,確定所需條件(例如上例中的奧巴馬)并優(yōu)化此類情況將很容易。 如果查詢是從令牌流派生的,因此它沒有周期并且不使用任何轉(zhuǎn)換,則枚舉自動(dòng)機(jī)接受的所有短語可能會(huì)更快(Lucene已經(jīng)具有g(shù)etFiniteStrings API可以對(duì)任何自動(dòng)機(jī)),然后根據(jù)這些詞組查詢構(gòu)造布爾查詢。 這將匹配同一組文檔,也將正確保留PositionLengthAttribute ,但是將分配不同的分?jǐn)?shù)。
該代碼是非常新的,肯定有一些令人興奮的錯(cuò)誤! 但這對(duì)于任何需要精確控制術(shù)語在文檔中出現(xiàn)位置的應(yīng)用程序來說都是一個(gè)不錯(cuò)的開始。
翻譯自: https://www.javacodegeeks.com/2014/08/a-new-proximity-query-for-lucene-using-automatons.html
lucene自動(dòng)補(bǔ)全
總結(jié)
以上是生活随笔為你收集整理的lucene自动补全_使用自动机的Lucene新的邻近查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 如何在CircleCI上构建支持Graa
- 下一篇: 使用Java和JSF构建一个简单的CRU
