我目前正在数据库中的“页面”上执行全文搜索。当用户得到他们想要的结果时,我无法向他们提供相关信息,说明为什么世界上出现的结果出现了。
我正在寻找的规格:
<b>here is some test</b> page
。我应该能够突出显示该术语而不会对页面上的html代码产生负面影响。我不确定做这两件事的最佳方法是什么。我确实知道一个很容易被忽视的问题,需要加以考虑:
一个。如果你不小心,在随机点截取html数据可能会完全破坏页面,例如,不关闭div标签可以抛弃我的整个布局。有什么最好的解决方案?
实现上述搜索系统的最佳方法是什么?
答案 0 :(得分:1)
由于您使用的是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)
将返回一个数值,表示通过以下方式计算的相关性:
$sentence
中搜索整个查询字符串。对于每次出现,相关数将增加2 ^ n;其中n是查询字符串中的单词数。$sentence
中移除,因此不会多次计算。另一种策略可能是扫描搜索词的整个文本,记录每场比赛的位置。然后使用简单的算法,你可以找到最紧密的搜索关键词集群,并选择你那样的摘录,截断单词边界或句子边界。
答案 1 :(得分:0)
try preg_match(); with preg_replace();