【问题标题】:Search in multiple tables with priority [closed]优先在多个表中搜索[关闭]
【发布时间】:2014-01-05 20:25:10
【问题描述】:

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

  • 客户获得了一个包含多个表(wiki、博客、文章等)的数据库
  • wiki 和博客有一个带有标签的单独表格。

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

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

目前我们只是对具有标题优先级因素的表格进行全文搜索,但这没有考虑 1)标签的优先级 2)wiki 优先于博客文章(等等) .

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

【问题讨论】:

  • 您的问题的答案可能是“是”。能否显示当前用于全文搜索的查询?

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


【解决方案1】:

从我的头顶,几个起点:

链接查询

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

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

建立搜索索引

如果您想要的只是全字匹配(所以“and”匹配“here and there”而不是“in my hands”),您还可以构建自己的搜索索引。

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

  • 关键字:这显然应该是一个索引(但不是唯一的)并包含搜索词
  • 来源类型:这表明这是什么类型的内容(博客文章、wiki 页面等),它可以是字符串或整数(这将使排序更容易)
  • 来源 ID:这是相应内容表中的主键,例如die 博客文章 ID 或 wiki 页面 ID
  • 匹配类型:表示关键字出现的位置,例如 0 = 标签,1 = 标题,2 = 内容

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

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

使用 Lucene

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

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

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

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

【讨论】:

  • 非常感谢您的建议。 Lucene 选项可能是未来的一个不错的选择。我想我们会去搜索索引表。再次感谢。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多