【问题标题】:Many-to-Many searching with Sphinx使用 Sphinx 进行多对多搜索
【发布时间】:2023-12-28 09:24:01
【问题描述】:

我想使用 Sphinx 进行多对多匹配。我拿了 * 中的问题和标签案例进行说明。

一个问题可以与许多标签相关联,反之亦然。

所以在 mysql 中,我有 3 个表:question、tag、question_tag。

我想在集合“java”、“sphinx”、“mysql”、“hibernate”中搜索包含尽可能多标签的问题。所以结果可能会出现 3 个匹配、2 个匹配或 1 个匹配的问题。

目前,我创建了一个字段,它将所有这些标签与空格连接起来,并让 sphinx 搜索该字段。但这听起来很傻,并且在添加和删除标签时会产生很多开销。会有一些更聪明的方法,对吧?

【问题讨论】:

    标签: sphinx


    【解决方案1】:

    查看文档MVA 中的 MVA - Multi Value Attributes 和 sql_attr_multi.

    我过去曾使用它来针对“人”搜索“兴趣”。所以我可能喜欢摇滚音乐和看橄榄球。 Sphinx 可以在数组中对其进行索引,您可以使用 OR 或 AND 匹配来搜索它们。

    【讨论】:

      【解决方案2】:

      最简单的方法应该是加入表格并按问题 ID 分组。 Sphinx 为您完成剩下的工作:

      source src_questions{
        select question_id, question_subject, question_body, tag_value from question \
        JOIN question_tag on question.question_id = question_tag.question_id \
        JOIN tag on question_tag.tag_id = tag.tag_id
        GROUP BY question_id 
      }
      

      假设您的表格中有以下列

      问题表:

      question_id INT
      question_subject VARCHAR or TEXT
      question_body VARCHAR or TEXT
      

      标签表:

      tag_id INT
      tag_value VARCHAR or TEXT
      

      question_tag_table:

      question_id INT
      tag_id INT
      

      【讨论】:

      • 由于是many2many案例,您将为相同的问题创建许多记录。另一个更严重的问题是,如果问题遇到了你搜索阶段的多个关键词,那么评分仍然很低。