数据库搜索术语突出显示和结果截断

时间:2009-05-01 02:22:48

标签: php mysql full-text-search

我目前正在数据库中的“页面”上执行全文搜索。当用户得到他们想要的结果时,我无法向他们提供相关信息,说明为什么世界上出现的结果出现了。

我正在寻找的规格:

  1. 我有HTML数据,这意味着如果您搜索“test”等术语并且包含结果页面<b>here is some test</b> page。我应该能够突出显示该术语而不会对页面上的html代码产生负面影响。
  2. 我只想返回文档的一部分,就像谷歌一样;返回的部分包含我搜索条件的很大一部分。如何确定哪个部分包含最多的术语?最好确定哪个部分返回总体最多的术语,或者具有大多数单个搜索术语的部分,或两者的组合?或者应该包含多个信息片段?
  3. 我想做这个服务器端,如果这是一个可行的选择?
  4. 我不确定做这两件事的最佳方法是什么。我确实知道一个很容易被忽视的问题,需要加以考虑:

    一个。如果你不小心,在随机点截取html数据可能会完全破坏页面,例如,不关闭div标签可以抛弃我的整个布局。有什么最好的解决方案?

    实现上述搜索系统的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

  1. 我不会在搜索结果中保留HTML格式。这会使你的结果页面非常混乱。在结果描述中包含标题,换行符,图像,段落边距等是没有意义的 - 特别是如果您只打印截断内容的简短摘录。
  2. 我认为在大多数情况下,一次匹配100%搜索字词的结果比只匹配50%重复两次的搜索字词的结果更具相关性。但这也取决于查询。
  3. 这是唯一可行的选择,除非您想立即向客户发送所有结果页面。
  4. 由于您使用的是MySQL内置的全文搜索功能,因此您无法真正向用户显示为什么结果就是这样 - 不是没有详细了解全文搜索确定相关性。您可以做的是向每个页面显示可能与其搜索相关的用户摘录,并可帮助他们对要查看的结果进行有用的确定。

    我首先使用strip_tags()删除任何标记的页面内容,然后将explode()内容放入单个句子的数组中。然后,您可以遍历数组以确定每个句子的相关性,然后简单地向用户显示最相关的句子。如果最相关的句子太长,则在字边界处截断它。

    $text = strip_slashes($content);
    $sentences = explode('.  ', $text);
    $relevance = array();
    foreach ($sentences as $i=>$sentence) {
        $rel = 0;
        $relevance[$i] = calcRel($sentence);
    }
    arsort($relevance);
    list($i, $j) = array_keys($relevance);
    $ellips = (abs($i-$j)>1?'...':'');
    if ($i < $j) {
        $description = $sentences[i].$ellips.$sentences[j];
    } else {
        $description = $sentences[j].$ellips.$sentences[i];
    }
    

    calcRel($sentence)将返回一个数值,表示通过以下方式计算的相关性:

    1. $sentence中搜索整个查询字符串。对于每次出现,相关数将增加2 ^ n;其中n是查询字符串中的单词数。
    2. 搜索部分匹配 - 再次加权2 ^ n; n是匹配的单词数。
    3. 搜索单个查询字词,为每个匹配项提供1的权重。
    4. 最后,在上述每项搜索中,匹配的字词/短语都应从$sentence中移除,因此不会多次计算。
    5. 另一种策略可能是扫描搜索词的整个文本,记录每场比赛的位置。然后使用简单的算法,你可以找到最紧密的搜索关键词集群,并选择你那样的摘录,截断单词边界或句子边界。

答案 1 :(得分:0)

try preg_match(); with preg_replace();