在多个表中搜索优先级

时间:2014-01-05 20:25:10

标签: php mysql sql search full-text-search

我可以使用一些输入来开发以下搜索脚本的最佳方式:

  • 客户端拥有一个包含多个表(wiki,博客,文章等)的数据库
  • 维基和博客有一个带标签的单独表格。

如果用户搜索某个(或多个)关键字,则脚本首先必须检查这些标记是否存在完全匹配(其中wiki优先于博客)。这些匹配应首先显示在结果中。

然后它必须检查标题上是否匹配(wiki再次优先于博客,博客优先于文章等)。最后一步是检查表格内容的相关性。

目前我们只是对表格进行全文搜索,并对标题赋予优先级因素,但这并未考虑1)标记的优先级2)wiki优先于博客文章(等等)

有解决这个问题的有效方法吗?

2 个答案:

答案 0 :(得分:1)

从头顶开始,有几个起点:

链接查询

最简单的解决方案是进行大量查询(匹配wiki标签,然后匹配博客标签,然后匹配wiki标题,然后匹配博客标题,......)但这可能不会很高效。

根据您的表结构,您可以通过使用UNION语句将所有内容混合到单个查询并对其进行排序来加快速度,但我认为这在代码中看起来非常糟糕。

构建搜索索引

如果你想要的只是一个全字匹配(所以“和”匹配“在这里和那里”而不是“在我手中”)你也可以建立自己的搜索索引。

以最简单的形式,这将是另一个表,例如,那些列:

  • 关键字:这显然应该是一个索引(但不是唯一的索引)并保留搜索字词
  • 源类型:这表示这是什么类型的内容(博客文章,维基页面,...),它可以是字符串或整数(这将使订购更容易)
  • 来源ID :这是相应内容表中的主键,例如死博客文章ID或维基页面ID
  • 匹配类型:表示关键字的显示位置,例如0 =代码,1 =标题,2 =内容

现在,每当添加新内容时,您都必须对其进行剖析并使用它提供搜索索引。您可以将标题和内容拆分为单个单词,并将每个作为新行添加到搜索索引表中(分别为匹配类型= 1或2),并添加每个标记(作为匹配类型= 0)。更新内容也是如此,只需先删除旧的搜索索引条目。对于初始构建,如果出现问题,您还应该有一个“完全重建搜索索引”例程。

您的搜索引擎现在只需使用新的搜索表,该搜索表应该相当有效。您还可以通过将此表设置为内存表,使用其他数据库引擎或您提出的任何内容来进行进一步的优化。

使用Lucene

根据您的要求,您还可以查看Apache Lucene,这是一个很棒的搜索库,它有自己的查询语言,即使对于庞大的数据集也非常快。

还有这个(ZendSearch)的PHP实现,但是当我不久前尝试它时,它对我来说还不够快。

在我的上一个项目中,我使用了Lucene和Apache Solr,它是Lucene的REST前端。我让它在只监听127.0.0.1的Tomcat服务器上运行。使用Solr服务器有一个PECL扩展:http://pecl.php.net/package/solr

当然,这需要设置很多(需要一个完整的Java环境,一个占用内存的应用程序服务器和一个PHP扩展),还需要学习很多东西,但它是一个非常强大的解决方案,可以扩展最佳。< / p>

答案 1 :(得分:0)

你不知道这是什么类型的应用程序。
如果它是一个Web应用程序,异步地向服务器发送不同的查询可能是一个简单的解决方案。首先发送最重要的查询,它们很可能也是最快的查询。数据恢复时更新显示的结果。

缺点是您将拥有重叠的结果集。按ID过滤不是问题,但服务器发回的数据过多。只有你能说出(不)重要的是什么。