我發現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索引?)
你可以嘗試'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
我'我發現這個分析器在較長的字段上速度很慢 – goalie7960 2012-07-26 23:38:02
嗨LB我會看一看!我上面發佈的字符串解析器運行得非常好,我不會將它用於超過5-6個字的字段,但對於名稱fi現場,這很好。我稍微修改它以在空間處拆分標記並簡單地存儲整個名稱,然後分析不存儲,名稱在其他「名稱」字段等中的標記化位 – 2012-07-27 08:34:59