Php 在多个具有优先级的表中搜索

Php 在多个具有优先级的表中搜索,php,mysql,sql,search,full-text-search,Php,Mysql,Sql,Search,Full Text Search,我可以使用一些关于开发以下搜索脚本的最佳方法的输入: 客户端获得了一个包含多个表(wiki、博客、文章等)的数据库 维基和博客有一个单独的带有标签的表格 如果用户搜索某个(或多个)关键字,脚本首先必须检查这些标记是否完全匹配(wiki优先于博客)。这些匹配项应首先显示在结果中 然后它必须检查标题是否匹配(wiki优先于博客,博客优先于文章等)。最后一步是检查表内容的相关性 目前,我们只是在表格上进行全文搜索,并为标题设置一个优先级因子,但这并没有考虑1)标记的优先级2)wiki相对于博客文章

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

  • 客户端获得了一个包含多个表(wiki、博客、文章等)的数据库
  • 维基和博客有一个单独的带有标签的表格
如果用户搜索某个(或多个)关键字,脚本首先必须检查这些标记是否完全匹配(wiki优先于博客)。这些匹配项应首先显示在结果中

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

目前,我们只是在表格上进行全文搜索,并为标题设置一个优先级因子,但这并没有考虑1)标记的优先级2)wiki相对于博客文章的优先级(等等)


有没有有效的方法来解决这个问题

在我的脑海中,有几个起点:

链接查询 最简单的解决方案是只进行大量查询(匹配wiki标记,然后匹配博客标记,然后匹配wiki标题,然后匹配博客标题,…),但这可能不是很有效

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

建立搜索索引 如果你想要的只是一个完整的单词匹配(所以“和”匹配“在这里和那里”,但不是“在我手里”),你也可以建立自己的搜索索引

在其最简单的形式中,这将是另一个表,例如,包含以下列:

  • 关键字:这显然应该是一个索引(但不是唯一的索引)并保存搜索项
  • 源类型:这表示这是什么类型的内容(博客文章、wiki页面等),它可以是字符串或整数(这将使排序更容易)
  • 源ID:这是相应内容表中的主键,例如die blog article ID或wiki页面ID
  • 匹配类型:指示关键字出现的位置,例如0=标记,1=标题,2=内容
现在,无论何时添加新内容,都必须对其进行剖析,并将其提供给搜索索引。您可以将标题和内容拆分为单个单词,并将它们作为新行添加到搜索索引表中(分别使用match type=1或2),还可以添加每个标记(使用match type=0)。更新内容也是如此,只是您必须先删除其旧的搜索索引项。对于初始构建,如果出现问题,还应该有一个“完全重建搜索索引”例程

您的搜索引擎现在只需要使用新的搜索表,这应该是合理有效的。您还可以通过将该表设置为内存中的表、使用另一个数据库引擎或任何您想到的方法来进行进一步的优化

使用Lucene 根据您的需求,您还可以查看,这是一个很好的搜索库,它有自己的查询语言,即使对于大型数据集也非常快速

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

在我的上一个项目中,我使用了Lucene,它作为Lucene的REST前端。我让它在只听127.0.0.1的Tomcat服务器上运行。有一个用于使用Solr服务器的PECL扩展:


当然,这需要设置很多(需要一个完整的Java环境、一个占用内存的应用服务器和一个PHP扩展),也需要学习很多东西,但这是一个功能强大的解决方案,具有最佳的可扩展性。

你不知道这是哪种应用。
如果是一个web应用程序,异步向服务器发送不同的查询可能是一个简单的解决方案。首先发送最重要的查询,它们很可能也是最快的查询。当数据返回时更新显示的结果


缺点是结果集重叠。按ID过滤不是问题,但服务器发回的数据太多。只有你才能知道这有多重要。

你的问题的答案可能是“是”。您能否显示当前用于全文搜索的查询?非常感谢您的建议。Lucene选项可能是未来的一个好选项。我想我们会选择搜索索引表。再次感谢。