gpt4 book ai didi

php - 数据库搜索词突出显示和结果截断

转载 作者:行者123 更新时间:2023-11-30 21:24:26 26 4
gpt4 key购买 nike

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

我正在寻找的规范:

  1. 我有 HTML 数据,这意味着如果您搜索诸如“测试”之类的术语并且包含结果页面,<b>here is some test</b> page .我应该能够突出显示该术语而不会对页面上的 html 代码产生不利影响。
  2. 我只想返回文档的一部分,就像谷歌所做的那样;返回的部分包含我搜索词的很大一部分。如何确定哪个部分包含最多的术语?最好确定哪个部分返回的总体术语最多,或者哪个部分具有最多的单个搜索术语,或者两者的组合?还是应该包含多个信息片段?
  3. 我想做这个服务器端,如果这是一个可行的选择?

我不确定做这两件事的最佳方式是什么。我确实知道一个很容易被忽视但需要考虑的问题:

一个。如果您不小心,随机截断 html 数据可能会完全破坏页面,例如,不关闭 div 标签可能会破坏我的整个布局。这方面的最佳解决方案是什么?

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

最佳答案

  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^n;其中 n 是查询字符串中的单词数。
  2. 搜索部分匹配项——再次按 2^n 加权; n 是匹配的单词数。
  3. 搜索单个查询词,为每个匹配赋予权重 1。
  4. 最后,在上述每个搜索中,匹配的单词/短语应该从 $sentence 中删除,这样它们就不会被多次计算。

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

关于php - 数据库搜索词突出显示和结果截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/809950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com