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)
@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 倍。
| 归档时间: |
|
| 查看次数: |
11537 次 |
| 最近记录: |