狮身人面像和一对多的联想

时间:2009-11-14 09:39:18

标签: mysql search sphinx

我在sphinx搜索中看到的例子并没有真正使用连接。如果我有这样的架构(一本书有多个评论),

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
);

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

2 个答案:

答案 0 :(得分:2)

您需要使用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

我建议使用外部联接,以便仍然可以返回没有评论的图书。

答案 1 :(得分:1)

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