2009-10-21 48 views
6

我如何確保當我的輸入字符串包含像C++這樣的術語時,lucene會將相關搜索結果返回給我? Lucene似乎忽略了++字符。在Lucene搜索中處理+作爲特殊字符

代碼詳細信息: 當我執行這一行時,我得到一個空白的搜索查詢。

queryField = multiFieldQueryParser.Parse(inpKeywords); 

keywordsQuery.Add(queryField, BooleanClause.Occur.SHOULD); 

這裏是我的自定義分析:

public class CustomAnalyzer : Analyzer 
    { 
     private static readonly WhitespaceAnalyzer whitespaceAnalyzer = new WhitespaceAnalyzer(); 
    public override TokenStream TokenStream(String fieldName, System.IO.TextReader reader) 
     { 
      TokenStream result = whitespaceAnalyzer.TokenStream(fieldName, reader); 
      result = new StandardTokenizer(reader); 
      result = new LowerCaseFilter(result); 
      result = new StopFilter(result, stop_words); 
      return result; 
     } 
} 

而且我執行的搜索查詢是這樣的:

indexSearcher.Search(searchQuery, collector); 

我曾嘗試QUERYFIELD = multiFieldQueryParser.Parse(QueryParser.Escape (inpKeywords)),但它仍然不起作用。這是查詢得到執行並返回零命中。 「+(())」

謝謝。

回答

3

描述,因爲,+是一個特殊字符,它需要被轉義您可以啓用此。需要轉義的所有字符的列表是here(請參閱頁面底部)。

您還需要注意在編制索引時使用的分析器。例如,StandardAnalyzer將跳過+。您可能需要在編制索引和搜索時使用類似WhiteSpaceAnalyzer的東西,這會保留令牌流中的特殊字符。請記住,您需要在索引和搜索時使用相同的分析儀。

+0

現在用WhiteSpaceAnalyzer只有...但仍然+字符將被忽略 – 2009-10-27 08:33:41

0

嘗試使用UTF-8編碼您的搜索查詢。

this article

+0

鏈接無法使用.... – Nirmal 2011-12-27 05:49:10

1

除了選擇合適的分析儀外,您還可以使用QueryParser.Escape(string s)確保所有特殊字符都能正確轉義。

因爲這是一個靜態函數,即使使用MultiFieldQueryParser,也可以使用它。

例如,你可以嘗試這樣的事:

queryField = multiFieldQueryParser.Parse(QueryParser.Escape(inpKeywords)); 
+0

感謝UR answer.Please參考到我更新的問題。 – 2009-10-23 16:23:37

+0

再次感謝Jesse.I確實嘗試了queryField = multiFieldQueryParser.Parse(QueryParser.Escape(inpKeywords)),但它仍然不起作用。 這是查詢得到執行並返回零點。 「+(())」 – 2009-10-24 03:21:52

+0

嘿愛德,它是否適用於簡單的關鍵字,沒有Escape功能?如果是這樣,可能會發布更多與您的Searcher和QueryParser對象相關的代碼。另外請記住,您必須使用您用於索引編制的相同分析器進行搜索。 – Jesse 2009-10-24 16:21:06