我已经多次重新考虑了这个问题,但我从未真正找到一个合适的答案。
是否可能执行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
查询做比较,该查询显示了所有更相关但未被显示的结果:查询 ("Bio...") - 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
你可能已经注意到,有很多主题并没有被建议出来,尽管这些更有可能是用户正在寻找的内容。
然而,使用 LIKE
的问题在于如何像 FULLTEXT
一样搜索跨多个单词和单词中间的内容。
我想要实现的基本排序如下:
- 以搜索词开始的第一个单词
- 以搜索词开始的第二个单词
- 术语不在单词开头的单词
- 如果没有进一步的相关性,则按字母顺序排列
所以我的问题是,如何通过 MySQL 搜索跨多个单词得到一个合理排序的建议列表?
sizeof()
,因为它是一个很少使用的别名,在大多数其他编程语言中具有不同的含义。 - BadHorsie