2011-08-10 18 views
0

我在lucene.net中進行全文搜索時遇到問題,其中搜索結果包含特殊的lucene字符。Lucene.net中帶有特殊字符的確切短語

我在我的Lucene文檔中有一個名爲「content」的字段。這個字段創建如下,幷包含索引文件的內容:

document.Add(new Field("content", fulltext, Field.Store.YES, Field.Index.ANALYZED)); 

爲了創建索引我使用的是Standardanalyzer。

對於查詢索引我使用以下代碼:

var queryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "content", analayzer); 
queryParser.SetAllowLeadingWildcard(true); 
queryParser.SetMultiTermRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE); 
Query fullTextQuery = queryParser.Parse(queryString); 

查詢然後被添加到一個BooleanQuery其用於獲得從IndexSearcher的結果。我認爲其餘的代碼並不那麼重要,因爲代碼的工作原理應該是99%的查詢。我還使用StandardAnalyzer查詢索引。

現在是這個問題。 有時文檔的「內容」字段包含文本分開使用「 - 」

一些文本一些文本選擇槓桿一些文本一些文本

現在,當我做了充分的使用「選檔杆」進行文本搜索(精確短語)。查詢看起來是這樣的:

內容:「換檔桿」

這裏的問題是,還包含上述文本文件被發現,但它不應該被發現,因爲2個字使用「 - 」分隔,而不是空白。

我認爲它與分析器有關,而且「 - 」是lucene中的一個特殊字符。

也許有人可以幫助我解決這個問題。

在此先感謝 馬丁

回答

0

你是正確的思維,問題是,你正在使用在索引時間分析儀。

Lucene javadocs

一種基於語法的分詞與JFlex的

建造這應該是大多數歐洲語言的文檔良好的標記生成器:在標點符號

  • 把詞,去除標點符號。然而,一個沒有被空白後面的點被認爲是令牌的一部分。
  • 在連字符處拆分單詞,除非令牌中有數字,在這種情況下,整個令牌被解釋爲產品編號並且不會被拆分
  • 將電子郵件地址和互聯網主機名識別爲一個令牌。

許多應用程序都有特定的分詞器需求。如果此標記器不適合您的應用程序,請考慮將此源代碼目錄複製到您的項目並維護您自己的基於語法的標記器。

因此,在您的情況下,您需要使用更嚴格的分析器來索引您的文檔,例如WhitespaceAnalyzer,它僅在空白處分割。

+0

4年後的一個問題。當標準分析器刪除標點符號時,當涉及到搜索時,查詢解析器也會刪除標點符號。這導致熒光筆,標記忽略單詞的最後/第一個標點符號的詞。我不想使用WhitespaceAnalyzer,因爲它限制了搜索結果。關於如何克服單詞未被突出顯示的最後一個標點符號的任何想法? – JenonD

+0

@JenonD我覺得我不能幫你的時間太長了。如果你願意,我建議發佈一個新問題並引用這個問題。 – smerchek