2013-02-22 56 views
6

標準分析儀不工作。從我能理解,它改變了這一爲cnet如何自定義Lucene.NET來搜索不區分大小寫的符號的單詞(例如「C#」或「.net」)?

WhitespaceAnalyzer會的工作搜索,但它是區分大小寫的。

的一般規則是搜索應該像谷歌這樣希望這是考慮.net配置的事情,c#已經出來有一段時間還是有一個辦法解決這個。

根據以下建議,我嘗試了自定義WhitespaceAnalyzer,但是如果關鍵字之間用逗號分隔,並且沒有正確處理沒有空格,例如

java,.net,c#,oracle 

將不會返回,而搜索哪些是不正確的。

我遇到了PatternAnalyzer這是用來拆分令牌,但無法弄清楚在這種情況下如何使用它。

我使用Lucene.Net 3.0.3.NET 4.0

+0

是你的域名源代碼?或者那些僅僅是例子? – phani 2013-03-03 02:43:05

+0

@phani這些僅僅是示例 – Kumar 2013-03-07 16:28:24

回答

-2

爲別人誰可能是尋找一個答案,以及

最後的答案竟然是創建一個自定義TokenFilter,並在所有使用 與Whitespacetokenizer,lowercasefilter等一起令牌過濾器,所有的自定義分析大約30行代碼,我會創建一篇博文並在此處發佈鏈接,首先需要創建博客!

+0

嗨有什麼機會可以在Gist上發佈它?這聽起來非常有用 – mcintyre321 2013-07-02 13:01:21

7

Lucene.Net – Custom Synonym Analyzer類似SynonymAnalyzer自己的自定義分析類。您覆蓋TokenStream可以通過使用WhitespaceTokenizerLowerCaseFilter流水線來解決此問題。

請記住,您的索引器和搜索器需要使用相同的分析器。

更新:處理多用逗號分隔的關鍵字

如果你只需要處理unspaced逗號分隔的關鍵字搜索,不是索引那麼你可以轉換爲下面的搜索表達式expr

expr = expr.Replace(',', ' '); 

然後通過exprQueryParser。如果您想支持其他分隔符,如';'你可以做這樣的:

var terms = expr.Split(new char[] { ',', ';'}); 
expr = String.Join(" ", terms); 

但你還需要檢查對於喜歡「SYBASE,C#.NET,神諭」一語表達(表達包括引號「字符),它不應該被轉換(在用戶正在尋找一個精確匹配):

expr = expr.Trim(); 
if (!(expr.StartsWith("\"") && expr.EndsWith("\""))) 
{ 
    expr = expr.Replace(',', ' '); 
} 

的表達可能包括一個短語,一些關鍵字,像這樣:

"sybase,c#,.net,oracle" server,c#,.net,sybase 

然後,你需要解析和轉換搜索表達式如下:

"sybase,c#,.net,oracle" server c# .net sybase 

如果您還需要處理unspaced逗號分隔的關鍵字索引那麼你需要解析的unspaced逗號分隔關鍵字的文本,並將它們存儲在不同的領域如。 Keywords(必須與您的自定義分析器關聯)。那麼您的搜索處理程序需要搜索表達式轉換是這樣的:

server,c#,.net,sybase 

這樣:

Keywords:server Keywords:c# Keywords:.net, Keywords:sybase 

或者更簡單地說:

Keywords:(server, c#, .net, sybase) 
+0

嘗試過,但它不能識別由谷歌完成的關鍵字(如oracle,.net,c#,sybase等) - 我們的用戶的黃金標準,因爲它會看起來更多的信息也許定製分詞器如果可能的話 – Kumar 2013-02-24 06:34:26

+0

增加Ques的詳細信息 – Kumar 2013-02-24 07:46:33

+0

這是搜索和索引需要的,關於解析到一個單獨的字段有趣的想法,但考慮到我們必須處理.net4/.net4.5等。而不是一個.net *(無聲)搜索等。如果我不能找出一種方法來定製tokenizer然後將不得不做這樣的事情 – Kumar 2013-02-25 04:04:29

4

使用WhitespacerAnalyzer並用LowerCaseFilter IT連鎖。

在搜索和索引時間使用相同的鏈。通過將所有內容轉換爲小寫字母,實際上使其不區分大小寫。

根據你的問題描述,這應該工作,並且很容易實現。