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