目前我正試圖增強我的搜索算法。如何實現類似「語音」的搜索
爲了更好地理解,下面是它背後的當前邏輯:
我們有在db中連接n個關鍵字的對象。在數據庫中,這通過2個表(Object
,Keyword
)解決,其中Keyword
-table具有FK到Object
。當我構建搜索樹時,我創建了一個對象所有關鍵字的行值(ad:remove umlauts,轉換爲小寫,...)。搜索模式完成相同的轉換程序(NormalizeSearchPattern()
)。我支持AND
- 搜索和關鍵字的最小長度只有2個字符!
的搜索算法是目前fast-reverse-search
(這個例子不是優化)的變體:
bool IsMatch(string source, string searchPattern)
{
// example:
// source: "hello world"
// searchPattern: "hello you freaky funky world"
// patterns[]: { "hello", "you", "freaky", "funky", "world" }
searchPattern = NormalizeSearchPattern(searchPattern);
var patterns = MagicMethodToSplitPatternIntoPatterns(searchPattern);
foreach (var pattern in patterns)
{
var success = false;
var patternLength = pattern.Length;
var firstChar = pattern[0];
var secondChar = pattern[1];
var lengthDifference = input.Length - patternLength;
while (lengthDifference >= 0)
{
if (source[lengthDifference--] != firstChar)
{
continue;
}
if (source[lengthDifference + 2] != secondChar)
{
continue;
}
var l = lengthDifference + 3;
var m = 2;
while (m < patternLength)
{
if (input[l] != pattern[m])
{
break;
}
l++;
m++;
}
if (m == patternLength)
{
success = true;
}
}
if (!success)
{
return false;
}
}
return true;
}
標準化與完成(這個例子是不是優化)
string RemoveTooShortKeywords(string keywords)
{
while (Regex.IsMatch(keywords, TooShortKeywordPattern, RegexOptions.Compiled | RegexOptions.Singleline))
{
keywords = Regex.Replace(keywords, TooShortKeywordPattern, " ", RegexOptions.Compiled | RegexOptions.Singleline);
}
return keywords;
}
string RemoveNonAlphaDigits(string value)
{
value = value.ToLower();
value = value.Replace("ä", "ae");
value = value.Replace("ö", "oe");
value = value.Replace("ü", "ue");
value = value.Replace("ß", "ss");
return Regex.Replace(value, "[^a-z 0-9]", " ", RegexOptions.Compiled | RegexOptions.Singleline);
}
string NormalizeSearchPattern(string searchPattern)
{
var resultNonAlphaDigits = RemoveNonAlphaDigits(searchPattern);
var resultTrimmed = RemoveTooShortKeywords(resultNonAlphaDigits);
return resultTrimmed;
}
因此,這是相當直接的,因此很明顯,我只能用我在NormalizeSearchPattern()
已經實現的source
和searchPattern
應對變種(如上面提到的:變音符號,大小寫區別,...)。
但是我應該如何提升算法(或NormalizeSearchPattern()
)是不敏感的,當它歸結爲:
- 單數/複數
- misstyping(如 「hauserr」 < - >「豪瑟。 「)
- ...
只是爲了更多地瞭解設計:
這個應用程序是用C#實現,它存儲的搜索樹和對象放在一個靜態變量中(在init中只查詢一次數據庫),性能必須非常好(目前500.000行值在300毫秒以內查詢)。
absolut nogo!這些算法正在創建一個散列 - 如何搜索散列?例如。 `source =「你好,你可愛的世界」,`patterns []:{「ell」}`。這應該是匹配的,因爲`ell`是`hello`的一部分... – 2010-11-30 13:14:57
我對你的問題的理解還在於,它像你所需要的soundex一樣。按照您的要求,還有什麼能解決錯誤輸入和複數? (你的例子更多地暗示一種以上的語言)。也許重新工作你的問題? – smirkingman 2010-11-30 13:45:17