2012-07-25 52 views
1

我發現Lucene迄今爲止是非常棒的,但我在重複LIKE等效搜索時遇到了一些問題。Lucene.net parse創建一個LIKE等效搜索的字段

在我正在處理的應用程序中,我需要「簡化」(LIKE)搜索和高級(全文搜索)選項。數據是基於用戶的(名稱,位置等),所以不是大量的文本。

在過去,我只是簡單地創建一個SQL查詢連接數據庫字段名稱,周圍的條款與通配符。我可以在我的應用程序中做到這一點,繞過lucene簡單搜索用戶數據 - 但使用lucene會很好。

我已經試過正則表達式搜索

var query = QueryParser.Escape(_query); 
var search = new RegexQuery(new Term("name",string.Concat(".*", _query, ".*"))); 

,但他們只在一列工作。

我有一個想法是tokenise每場產生類似於全文搜索如東西:

名字:保羅

,所以我創建了以下名稱字段...

保羅 保羅 霸 錐子 UL AU

這會打敗使用Lucene在LIKE SQ點L搜索?它真的會產生我想要的結果嗎?

什麼是解決此問題的最佳方法?

編輯:

稍微修改這個問題的代碼:

Elegant way to split string into 2 strings on word boundaries to minimize length difference

產生這種tokeniser:

private IEnumerable<string> Tokeniser(string _item) 
    { 
     string s = _item; 

     const int maxPrefixLength = 10; 
     const int maxSuffixLength = 10; 
     const int minStemLength = 1; 

     var tokens = new List<string>(); 


     for (int prefixLength = 0; (prefixLength + minStemLength <= s.Length) && (prefixLength <= maxPrefixLength); prefixLength++) 
      for (int suffixLength = 0; (suffixLength + prefixLength + minStemLength <= s.Length) && (suffixLength <= maxSuffixLength); suffixLength++) 
      { 
       string prefix = s.Substring(0, prefixLength); 
       string suffix = s.Substring(s.Length - suffixLength); 
       string stem = s.Substring(prefixLength, s.Length - suffixLength - prefixLength); 

       if (prefix.Length > 1) 
        if (!tokens.Contains(prefix)) 
         tokens.Add(prefix); 

       if (suffix.Length > 1) 
        if (!tokens.Contains(suffix)) 
         tokens.Add(suffix); 

       if (stem.Length > 1) 
        if (!tokens.Contains(stem)) 
         tokens.Add(stem); 
      } 

     return tokens; 
    } 

搜索結果做給的等效像搜索一樣。我的「用戶」表將只有9000個實體大小 - 至少對我來說,這可能適合我的需要。

是否有這樣做的任何挫折(除了更大的Lucene索引?)

+1

你可以嘗試'SingleCharTokenAnalyzer'在https://svn.apache.org/repos/asf/incubator/lucene.net/branches/Lucene.Net_2_9_4g/src/contrib/Core/Analysis/Ext/Analysis.Ext.cs – 2012-07-26 20:11:19

+0

我'我發現這個分析器在較長的字段上速度很慢 – goalie7960 2012-07-26 23:38:02

+0

嗨LB我會看一看!我上面發佈的字符串解析器運行得非常好,我不會將它用於超過5-6個字的字段,但對於名稱fi現場,這很好。我稍微修改它以在空間處拆分標記並簡單地存儲整個名稱,然後分析不存儲,名稱在其他「名稱」字段等中的標記化位 – 2012-07-27 08:34:59

回答

1

基於字符的正克(NGramTokenizer,NGramTokenFilter,EdgeNGramTokenizer和EdgeNGramTokenFilter應提供您需要的功能。