【发布时间】:2016-10-09 05:53:15
【问题描述】:
我已经多次重温这个问题,但我从未真正找到正确的答案。
是否可以执行 MySQL 搜索,返回按相关性准确排序的实际结果?
我正在尝试创建一个 ajax 搜索表单,它会在用户输入输入字段时提出建议,并且仅使用纯 MySQL 查询没有找到合适的解决方案。我知道有可用的搜索服务器,例如 ElasticSearch,我想知道如何仅使用原始 MySQL 查询来做到这一点。
我有一张学校科目表。少于 1200 行,这永远不会改变。让我们执行一个基本的 FULLTEXT 搜索,用户开始输入“Bio”。
查询(“Bio...”) - FULLTEXT BOOLEAN MODE
SELECT name, MATCH(name) AGAINST('bio*' IN BOOLEAN MODE) AS relevance
FROM subjects
WHERE MATCH(name) AGAINST('bio*' IN BOOLEAN MODE)
ORDER BY relevance DESC
LIMIT 10
结果
name | relevance
--------------------------------------------------------
Biomechanics, Biomaterials and Prosthetics | 1
Applied Biology | 1
Behavioural Biology | 1
Cell Biology | 1
Applied Cell Biology | 1
Developmental/Reproductive Biology | 1
Developmental Biology | 1
Reproductive Biology | 1
Environmental Biology | 1
Marine/Freshwater Biology | 1
为了显示这些结果有多糟糕,这里是一个简单的LIKE 查询的比较,它显示了所有未显示的更相关的结果:
查询(“生物...”) - LIKE
SELECT id, name
WHERE name LIKE 'bio%'
ORDER BY name
结果
name | relevance
--------------------------------------------------------
Bio-organic Chemistry | 1
Biochemical Engineering | 1
Biodiversity | 1
Bioengineering | 1
Biogeography | 1
Biological Chemistry | 1
Biological Sciences | 1
Biology | 1
Biomechanics, Biomaterials and Prosthetics | 1
Biometry | 1
您已经看到有多少主题没有被推荐,尽管这些主题更有可能是用户正在寻找的。p>
然而,使用LIKE 的问题是如何在多个单词之间进行搜索,并且像FULLTEXT 那样在单词中间进行搜索。
我想要实现的基本排序是这样的:
- 以搜索词开头的第一个词
- 以搜索词开头的第二个词
- 词条不在词首的词
- 如果没有进一步相关,所有内容通常按字母顺序排列
所以我的问题是,如何通过 MySQL 搜索多个单词来为用户获取合理排序的建议列表?
【问题讨论】: