【问题标题】:sphinx and one-to-many associationssphinx 和一对多关联
【发布时间】:2010-12-16 13:41:09
【问题描述】:

我见过的狮身人面像搜索示例并没有真正使用连接。如果我有这样的架构(一本书有多个评论),

create table book ( id int auto_increment, title varchar(200), summary longtext );
create table reviews ( id int auto_increment, book_id int, review longtext );

我应该给 sphinx 什么样的查询,以便我可以搜索评论中的单词,它会返回相应的书。如果我使用常规的内部连接,则每个评论将是一个文档,并且与网站上可见的内容不对应(单页包含书籍信息和所有评论)。

你有什么建议?我应该为搜索文档创建一个非规范化表并使用呈现的页面作为输入,例如:

create table sphinx_input ( 
   id int, -- corresponds 1..1 to book.id
   contents longtext -- everything on the page
);

并针对书籍和评论的每次更改进行修改?

【问题讨论】:

    标签: mysql search sphinx


    【解决方案1】:

    您需要使用GROUP_CONCAT,将您的所有评论数据收集到 Sphinx 的 sql_query 中的单个结果中。可能类似于以下内容:

    SELECT books.id, books.title, books.summary,
      GROUP_CONCAT(reviews.review SEPARATOR ' ') AS reviews
    FROM books LEFT OUTER JOIN reviews ON reviews.book_id = books.id
    WHERE books.id >= $start AND books.id <= $end
    GROUP BY books.id, books.title, books.summary
    

    我建议使用外连接,这样即使没有评论的书籍也会被退回。

    【讨论】:

    • 谢谢!我为 rails 安装了 Thinking Sphinx 插件,看看它是如何做到的,实际上它是通过 GROUP_CONCAT 做到的。
    • 我写的,所以上面的建议是一样的;)
    【解决方案2】:

    你可以让它像往常一样索引评论,然后在结果回来后在 mysql 中执行从评论 id 到 book id 的连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2015-01-26
      相关资源
      最近更新 更多