代码之家  ›  专栏  ›  技术社区  ›  Brian

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

  •  1
  • Brian  · 技术社区  · 16 年前

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

    1. 我有HTML数据,意思是如果你搜索一个术语,比如“test”和包含的结果页面, <b>here is some test</b> page
    2. 我只想返回文档的一部分,就像google一样;返回的部分包含了我搜索词的一大部分。如何确定哪个部分包含的术语最多?最好确定哪个部分返回的搜索词最多,或者哪个部分包含的单个搜索词最多,或者两者的组合?还是应该包括多个信息狙击手?
    3. 我想做这个服务器端,如果这是一个可行的选择?

    a、 如果你不小心的话,随意剪下html数据会完全破坏页面,例如,不关闭div标签会把我的整个布局都打乱。围绕这一点最好的解决方案是什么?

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

    2 回复  |  直到 16 年前
        1
  •  1
  •   Calvin    16 年前
    1. 我不会在搜索结果中保留HTML格式。那会让你的结果页面很混乱。在结果描述中包含标题、换行符、图像、段落边距等内容是没有意义的,尤其是当您只打印被截断内容的简短摘录时。
    2. 我认为在大多数情况下,一次匹配100%搜索词的结果要比两次只匹配50%搜索词的结果更相关。但这也取决于查询。
    3. 这是唯一可行的选择,除非您希望一次向客户端发送所有结果页。

    由于您使用的是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. 搜索部分匹配——再次按2^n加权;n是匹配的字数。
    3. 搜索单个查询词,使每个匹配项的权重为1。
    4. 最后,在上述每个搜索中,匹配的单词/短语都应该从 所以它们不会被计算超过一次。

    另一种策略是扫描整个文本中的搜索词,记录每个匹配项的位置。然后使用简单的算法,你可以找到最紧密的搜索关键字,并选择你的摘录那样,在词边界或句子边界截断。

        2
  •  0
  •   MEK MEK    16 年前
    try preg_match(); with preg_replace();
    
    推荐文章