我在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
);
并对书籍和评论的每次更改进行修改?
答案 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的连接。