繁体   English   中英

使用布尔全文搜索按相关性排序

[英]Order by relevance using boolean fulltext search

我在使用MySQL的全文搜索并按相关性按顺序返回结果时遇到问题。 我必须使用布尔全文搜索,该搜索不会按相关性顺序返回结果。 但是,我需要按相关顺序排列这些结果。 如果我尝试在查询末尾添加order by子句,则查询结果将导致使用文件排序,这使查询速度极其慢(比不使用时慢1000倍)。 我不确定该怎么办。

这是我的查询:

SELECT g.id, MATCH(g.searchable_name) AGAINST ('test*' IN BOOLEAN MODE) AS relevance
 FROM games g
 WHERE MATCH(g.searchable_name) AGAINST ('test*' IN BOOLEAN MODE)
 ORDER BY relevance DESC
 LIMIT 0, 31

提前致谢。

首先,您应该考虑IN BOOLEAN MODE 不返回score ,而是返回二进制(1 =找到,0 =未找到):

mysql>SELECT
        topic_id,
        MATCH(topic_text) AGAINST('+tuning' IN BOOLEAN MODE) AS binary
    FROM
        topics_search
    LIMIT 10
+----------+----------+
| topic_id | binary   |
+----------+----------+
| 2        | 0        |
| 4        | 0        |
| 5        | 0        |
| 6        | 1        |
| 7        | 0        |
| 8        | 0        |
| 11       | 0        |
| 12       | 0        |
| 13       | 0        |
| 14       | 0        |
+----------+----------+
10 rows in set (9 ms)

只有自然的全文本搜索才能够生成分数(未提供IN NATURAL LANGUAGE MODE修饰符,因为它是默认模式):

mysql>SELECT SQL_NO_CACHE
        topic_id,
        MATCH(topic_text) AGAINST('tuning') AS score
    FROM
        topics_search
    WHERE
        host_id = 1
    ORDER BY
        score DESC
    LIMIT 10
+--------------------+--------------------+
| topic_id           | score              |
+--------------------+--------------------+
| 153257             | 5.161948204040527  |
| 17925              | 4.781417369842529  |
| 66459              | 4.648380279541016  |
| 373176             | 4.570812702178955  |
| 117173             | 4.55166482925415   |
| 167016             | 4.462575912475586  |
| 183286             | 4.4519267082214355 |
| 366132             | 4.348565101623535  |
| 95502              | 4.293642520904541  |
| 29615              | 4.178250789642334  |
+--------------------+--------------------+
10 rows in set (478 ms)

旁注:令人难以置信的缓慢,因为score没有索引。

因此,您需要自然搜索以按分数排序。 但是自然搜索不支持*通配符之类的运算符。 现在,我们陷入了困境,因为在BOOLEAN搜索tunin*和使用键tuninNATURAL进行并行搜索没有用,因为没有文本会包含该部分单词。

mysql>SELECT SQL_NO_CACHE
        topic_id,
        MATCH(topic_text) AGAINST('tunin') AS score
    FROM
        topics_search
    WHERE
        MATCH(topic_text) AGAINST('tunin*' IN BOOLEAN MODE)
    AND
        MATCH(topic_text) AGAINST('tunin') > 0
    ORDER BY
        score DESC
    LIMIT 10
Empty set (170 ms)

结论
无法使用通配符运算符进行搜索并按相关性对结果进行排序。

除了找到一种方法以获取通配符搜索击中的全文索引中的所有单词并在第二次查询中使用它们以外,或者根据LIKE建立自己的得分并计算结果行中单词的数量,这是一种方法。 有趣足以提出一个新问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM