【问题标题】:PHP Search Title and TagsPHP 搜索标题和标签
【发布时间】:2009-09-13 05:36:57
【问题描述】:

您好, 我正在考虑在我的网站上实施搜索的最佳方式。我知道 Sphinx 和 MySQL 全文搜索,但我不只是搜索单个字段。

我有两件事要搜索:文章的标题和与该文章关联的标签。

我想做的是在我的文章表中定义另一列,其中包含标题中的关键字,以及附加到此字符串末尾的每个标签。

例如,如果文章标题是“如何构建家庭影院”,并且带有“DIY”标签,则“技术”这个字段将是“构建家庭影院 DIY 技术”。然后我可以在这个字段上执行搜索。

我看到这种方法的唯一缺点是,如果更新了标签,我也必须更新这个字段,这可能导致这个字段不准确或过时。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: php search full-text-search tags


    【解决方案1】:

    Sphinx 可以基于多列进行搜索。它甚至允许为每一列定义“权重”。我认为你应该坚持下去。

    【讨论】:

    • 问题是,标签与文章是多对多的关系。 Sphinx 可以使用它吗?
    【解决方案2】:

    您可以在 MyISAM 中对 MySQL 中表的多个列进行全文搜索。

    见:

    $search = 'how to do short circuit evaluation?';
    $q = 'SELECT * FROM `table` WHERE MATCH(tags, title, description) AGAINST ('.mysql_real_escape_string($search).' IN BOOLEAN MODE)';
    $r = mysql_query($q);
    //.. so on
    

    做另一个表需要不断同步,这对您的系统来说相当乏味。

    由于您的标签是多对多关系,您可以获取它们并组合到查询中

    $q = 'SELECT * FROM `table` WHERE'.
      ' MATCH(tags, title, '.
      '(SELECT  GROUP_CONCAT(`tag`) FROM `tags`'.
      'WHERE `ArticleID`='.(int)$ArticleID.')'.
      ') AGAINST ('.mysql_real_escape_string($search).' IN BOOLEAN MODE)';
    

    【讨论】:

      【解决方案3】:

      为您的标签使用 Sphinx 中的多值属性:

      MVA 或多值属性是 Sphinx 中一种重要的特殊类型的每个文档属性。 MVA 可以将值列表附加到每个文档。它们对于文章标签、产品类别等很有用。支持对 MVA 属性进行过滤和分组(但不排序)。

      http://www.sphinxsearch.com/docs/current.html#mva

      【讨论】:

      • 是的,起初看起来很像,但 MVA 只是整数。
      • 不一定。这个想法是用一个整数 id 来表示每个唯一的标签。为此,您可以创建一个将整数 id 映射到每个唯一标记的 SQL 表。例如,标记“Java”的 tag_id 为 1,标记“C++”的 tag_id 为 2。标记“Java”的后续使用将重复使用相同的 tag_id。
      【解决方案4】:

      Sphinx、Lucene 和几乎所有的全文搜索都不限于单个字段。实际上,默认是搜索所有字段,然后过滤指定的字段。我认为内部 MySQL 搜索不是很好,Sphinx 和 Lucene 插件要好得多。

      【讨论】:

        猜你喜欢
        • 2012-08-24
        • 2014-12-17
        • 1970-01-01
        • 2012-12-06
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多