最接近的全文搜索匹配

时间:2009-01-15 22:18:41

标签: asp.net sql-server-2005 full-text-search design-patterns string-matching

我正在尝试对我的网站实施内部搜索,可以指出用户正确的方向,以防错误输入一个单词,类似于你的意思:在谷歌搜索中。

有人知道如何进行这样的搜索吗?我们如何确定单词或我们假设用户想要搜索的短语的相关性?

  • 我使用带有FTS(fullTextSearch)的asp.net和sql server 2005

谢谢

5 个答案:

答案 0 :(得分:4)

您可以使用算法来确定字符串相似度,然后从搜索索引中建议其他字符串,直到达到某个差异。

其中一种算法是Levenshtein distance

但是,不要忘记搜索现有的解决方案。我想,例如Lucene能够搜索类似的字符串。

顺便说一句,这是关于这个主题的相关文章:How does the Google “Did you mean?” Algorithm work?

答案 1 :(得分:2)

这是通过正则表达式查询与该短语匹配的最接近的关键字。

Here是一篇很有帮助的文章。

答案 2 :(得分:0)

我能想到的最简单的方法是编写一个返回两个单词之间不匹配程度的函数,然后循环遍历所有单词并找到最佳单词。

我使用分支定界方法完成了这项工作。让我挖掘代码:

bool matchWithinBound(char* a, char* b, int bound){
  // skip over matching characters
  while(*a && *b && *a == *b){a++; b++;}
  if (*a==0 && *b==0) return true;
  // if bound too low, quit
  if (bound <= 0) return false;
  // try assuming a has an extra character
  if (*a && matchWithinBound(a+1, b, bound-1)) return true;
  // try assuming a had a letter deleted
  if (*b && matchWithinBound(a, b+1, bound-1)) return true;
  // try assuming a had a letter replaced
  if (*a && *b && matchWithinBound(a+1, b+1, bound-1)) return true;
  // try assuming a had two adjacent letters swapped
  if (a[0] && a[1]){
    char temp;
    int success;
    temp = a[0]; a[0] = a[1]; a[1] = temp;
    success = matchWithinBounds(a, b, bound-1);
    temp = a[0]; a[0] = a[1]; a[1] = temp;
    if (success) return true;
  }
  // can try other modifications
  return false;
}

int DistanceBetweenWords(char* a, char* b){
  int bound = 0;
  for (bound = 0; bound < 10; bound++){
    if (matchWithinBounds(a, b, bound)) return bound;
  }
  return 1000;
}

答案 3 :(得分:0)

使用T-SQL您可以使用SOUNDEX功能以语音方式比较单词。

如果您接受用户输入,然后通过soundex代码将其与数据库中的其他单词进行比较,您应该能够找到“你是说”的列表吗?词语的

E.g。

select SOUNDEX('andrew')
select SOUNDEX('androo')

将产生相同的输出(A536)。

现在有更好的算法,但soundex内置于sql server。

答案 4 :(得分:0)

为什么不使用google power?,你可以使用他们的推荐服务

here是c#

的示例