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