多个表上的mysql全文

keu*_*une 19 mysql full-text-search

我正在尝试在三个单独的表中进行全文搜索,并按相关性对结果进行排序.在我搜索答案期间,我发现我无法在多个表格中使用全文搜索.所以我为每个要搜索的列添加了单独的全文索引.现在的问题是我可以进行搜索,但我无法按照自己的意愿进行排序.

这是我的桌子

CREATE TABLE books (
 bookID int(11) NOT NULL AUTO_INCREMENT,
 title varchar(300) NOT NULL,
 authorID int(11) NOT NULL,
 FULLTEXT KEY title (title)
)

CREATE TABLE IF NOT EXISTS authors (
 authorID int(11) NOT NULL AUTO_INCREMENT,
 authorNamevarchar(200) NOT NULL,
 FULLTEXT KEY authorName(authorName)
);

CREATE TABLE IF NOT EXISTS chapters (
 chapterID int(11) NOT NULL AUTO_INCREMENT,
 bookID int(11) NOT NULL,
 content longtext NOT NULL,
 FULLTEXT KEY content (content)
);
Run Code Online (Sandbox Code Playgroud)

和我的SQL查询.这就是我被困住的地方.

SELECT *, 
 MATCH(books.title) AGAINST('$q') as tscore,
 MATCH(authors.authorName) AGAINST('$q') as ascore
 MATCH(chapters.content) AGAINST('$q') as cscore
FROM books 
LEFT JOIN authors ON books.authorID = authors.authorID 
LEFT JOIN chapters ON books.bookID = chapters.bookID 
WHERE 
 MATCH(books.title) AGAINST('$q')
 OR MATCH(authors.authorName) AGAINST('$q')
 OR MATCH(chapters.content) AGAINST('$q')
ORDER BY ???? DESC
Run Code Online (Sandbox Code Playgroud)

现在有了这个查询,我可以按标题,作者或内容进行排序.我想要做的是,将所有三列的相关性放在一起,然后按顺序排列结果.

并且,是的我知道其他搜索引擎,如lucene或sphinx,但我现在不打算使用它们.

提前致谢.

Ike*_*ker 37

您应该能够在ORDER BY子句中添加tscore,ascore和cscore值.

试试这个:

SELECT *, 
 MATCH(books.title) AGAINST('$q') as tscore,
 MATCH(authors.authorName) AGAINST('$q') as ascore,
 MATCH(chapters.content) AGAINST('$q') as cscore
FROM books 
LEFT JOIN authors ON books.authorID = authors.authorID 
LEFT JOIN chapters ON books.bookID = chapters.bookID 
WHERE 
 MATCH(books.title) AGAINST('$q')
 OR MATCH(authors.authorName) AGAINST('$q')
 OR MATCH(chapters.content) AGAINST('$q')
ORDER BY (tscore + ascore + cscore) DESC
Run Code Online (Sandbox Code Playgroud)

  • 非常好,我的项目需要什么! (2认同)
  • 您可以通过将它们相乘来为排序中的每个字段赋予权重,例如:ORDER BY (tscore*3 + ascore*2 + cscore) DESC (2认同)

Jus*_*ent 9

@Ike Walker 的解决方案很棒,但是在我的情况下,我想将一对多的结果汇总到每个搜索结果的一行中。在@Ike Walker 的解决方案中,我是如何完成工作的:

架构:

T1: Articles
T2: Comments (many comments to one article)
Run Code Online (Sandbox Code Playgroud)

索引:

ALTER TABLE articles ADD FULLTEXT title_index (title)
ALTER TABLE articles ADD FULLTEXT body_index (body)
ALTER TABLE comments ADD FULLTEXT comment_index (comment)
Run Code Online (Sandbox Code Playgroud)

查询语句:

SELECT 
    articles.title, 
    SUM(MATCH(articles.title) AGAINST('$q') + 
    MATCH(articles.body) AGAINST('$q') + 
    MATCH(comments.comment) AGAINST('$q')) as relevance 
FROM 
    articles 
LEFT JOIN 
    comments ON articles.id = comments.article_id 
WHERE 
    MATCH(articles.title) AGAINST('$q') 
    OR MATCH(articles.body) AGAINST('$q') 
    OR MATCH(comments.comment) AGAINST('$q') 
GROUP BY 
    articles.id 
ORDER BY 
    relevance DESC
Run Code Online (Sandbox Code Playgroud)

注意:如果您想为每个字段添加权重,您可以执行类似的操作。

SUM((MATCH(articles.title) AGAINST('$q')*3) + 
        (MATCH(articles.body) AGAINST('$q')*2) + 
        MATCH(comments.comment) AGAINST('$q')) as relevance 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,标题将是评论中匹配值的 3 倍,正文是 2 倍。

  • 你得到了赞成票。一件是我的!您的代码是一个很好的工作示例。原帖已经快11岁了!!!但 2021 年查询仍然有效! (3认同)