2011-09-30 46 views
1

我正在嘗試構建一個查詢來搜索具有名稱變體的名稱的Lucene索引。 索引是用Lucene.NET 2.9.2版建立的Lucene使用多個詞的接近搜索

用戶輸入例如「瑪格麗特白」。 沒有名稱變體選項,我的查詢變成「瑪格麗特白」〜1,它的工作原理。

現在,我可以查找名字變體對名字和姓氏來產生擴展列表。 例如。在這種情況下,(我只包括一些爲例,由於該表可以是100或更多,有時),我們可以有

瑪格麗特/ Margrett白/懷特

查詢「margrett白」〜1 OR「瑪格麗特白「〜1 OR」margrett whyte「〜1或」margaret whyte「〜1

給我正確的結果,但給出了100 x 100的變體組合,查詢字符串woudl很麻煩。

我試過各種方式來實現更緊湊的查詢,但似乎沒有任何工作。

任何人都可以給我任何指針或替代方法。我控制了索引創建過程,並想知道在那個階段我能做些什麼?

感謝您尋找 羅傑

+0

至於到這個後續,我已根據[鏈接](HTTP現在實現了自定義分析: //www.codeproject.com/KB/cs/lucene_custom_analyzer.aspx),它將額外的名稱變體標記插入到標記流中。所以現在我的搜索會找到所有的變體。 我現在正在尋找方法,只添加同義詞,如果它在文檔上存在,以減少排列。我可以從自定義過濾器中訪問原始文本的唯一方法是訪問傳入分析器的TextReader - 讀取它以獲取文本將其帶到文本的末尾,無法「倒帶」然後讀取標記。 – RogerDodge

回答

4

執行代名詞過濾器在你的索引過程,而不是在查詢時。只需將「白色」,「爲什麼」......映射到某個單詞;說「白色」。 「瑪格麗特」也一樣。

然後將查詢將只是"margaret white"~1

+0

感謝您的輸入 - 我遵循同樣的想法 - 我很好地創建了一個自定義分析器,它將在創建索引期間查找同義詞,併爲替代方法構建額外的標記,並指向相同的位置。正如你所指出的,這很好。 我現在不得不努力解決的其餘問題是,突出顯示結果。 我不太清楚如何處理這個問題 - 我可能會嘗試使用explain函數的結果來構建可能的備選方案列表,以嘗試突出顯示。 – RogerDodge

+0

@RogerDodge:你爲什麼會突出顯示問題?只需在查詢和索引時間進行翻譯,那麼術語將完全匹配。 – Xodarap

+0

問題是當我搜索「margaret white」並且文檔包含「margrett white」時。我不知道哪個組合造成了這次襲擊。我正在使用FastVectorHighlighter,它可以突出顯示每個單詞。這對我來說是不正確的,因爲如果與托馬斯懷特相鄰,我就不會有一個突出的術語「白色」。我現在正在重寫熒光筆中的FieldQuery.flatten方法,以構建由兩個名字/姓氏字詞的所有排列組成的新短語。該列表可能相當大,並影響性能,所以我正在尋找方法來減少這種情況。 – RogerDodge

1

我遇到了類似的問題,並通過寫我自己的查詢分析器和手動實例查詢元解決了這個問題。編寫你自己的查詢解析器並不一定容易,但它給了你很大的靈活性。在我的新查詢語言中,我使用/ N來指定接近查詢。有了它,下面的複雜查詢成爲可能:

margaret within/3 white 
margaret within/3 (white or whyte) 

甚至更​​複雜的查詢

("first name" within/3 margaret) within/10 ("last name" within/3 (white or whyte)) 
+0

這很有趣。你可以在這裏發佈你的查詢解析器嗎? – Alphaaa

+0

它在生產中使用(請參閱https://www.docketalarm.com/search/),但它尚未處於準備在開放網絡上共享的狀態。如果您對此感興趣,請在我的個人資料上向我發送電子郵件。 – speedplane

+0

謝謝,但在最後我發現我正在尋找這個答案:http://stackoverflow.com/a/10983841/2091700 – Alphaaa