当前位置: 首页 > 面试题库 >

MySQL-如何获得准确相关的搜索结果

楚浩然
2023-03-14
问题内容

我已经多次重温了这个问题,但我从未真正找到合适的答案。

是否可以执行MySQL搜索,以按相关性返回ACTUAL准确排序的结果?

我试图创建一个ajax搜索表单,当用户在输入字段中键入内容时提出建议,并且仅使用纯MySQL查询还没有找到合适的解决方案。我知道有可用的搜索服务器,例如ElasticSearch,我想知道如何仅使用原始MySQL查询来实现。

我有一张学校科目表。少于1200行,这将永远不会改变。让我们执行一个基本的FULLTEXT搜索,其中用户开始键入“ Bio”。

查询(“生物…”)-全文布尔模式

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查询的比较,该查询显示了所有未显示的更相关的结果:

查询(“生物…”)-喜欢

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

我想要实现的基本排序如下:

  1. 以搜索词开头的第一个单词
  2. 以搜索词开头的第二个单词
  3. 单词不在单词开头的单词
  4. 一切都按字母顺序排列,如果没有进一步相关的话

所以我的问题是,如何通过多个单词的MySQL搜索为用户获得合理排序的建议列表?


问题答案:

您可以使用字符串函数,例如:

select id, name
from subjects
where name like concat('%', @search, '%')
order by 
  name like concat(@search, '%') desc,
  ifnull(nullif(instr(name, concat(' ', @search)), 0), 99999),
  ifnull(nullif(instr(name, @search), 0), 99999),
  name;

这将使您获得所有包含@search的条目。首先是那些在开始处具有它的对象,然后是那些在空白处具有它的对象,然后是出现位置,然后是字母顺序。

name like concat(@search, '%') desc顺便说一下,使用MySQL的布尔逻辑。1 = true,0 =
false,因此按降序排列将使您先获得true。

SQL提琴:http ://sqlfiddle.com/#!9/
c6321a/1



 类似资料:
  • 我正在构建/训练Tesseract从捕获的照片中识别护照MRZ代码。在将照片/图像发送到Tesseract引擎之前,我将应用以下图像预处理技术: 二值化 正常化 取样 去噪 细化(可选) 此外,我已经用正确的字体(OCR-B)训练了Tesseract引擎,方法是创建大量的框文件(来自大约35个示例,其中包含从OCR-B字体的文本示例中获取的照片),修复框文件中的任何错误,创建训练文件,最后用我的所

  • 首先,对不起我的英语不好! 我是Lucene图书馆的新人(从上周三开始),我试图了解如何根据找到的术语获得匹配文档的最佳相关性级别。 我使用Lucene 4.10。0(无Solr) 我能够索引/搜索英语/阿拉伯语文本,以及支持这些文本的点击突出显示。 现在我有一个问题与搜索结果的相关性。 如果我在三个文档中搜索“穆罕默德·奥马尔”: 我得到同样的分数为这3文档。 看起来Lucene忽略了单词顺序,

  • 问题内容: 我对MYSQL相对较新,遇到了困扰我一段时间的问题。我已经尝试在所有地方使用Google搜索来寻找答案,但到目前为止仍无法找到可接受的解决方案。 这是我当前正在运行的查询,用于查找给定搜索词的最佳匹配项: 它返回的结果是全面的,因为它们包括所有相关的行。但是,它们没有按照任何特定的顺序排序,我希望在用PHP打印结果时首先显示完全匹配的匹配项。像这样: 1 | 字<精确匹配 2 | 填字

  • 所以我试图在搜索一个名字后,点击该表,然后在其他表中编辑它,问题是我没有得到正确的id,而是只得到了前面的id。 JTable 行动中的搜索 Id错误 编辑代码 搜索代码

  • 在Elasticsearch中,您可以执行返回点击的搜索,同时在一个响应中返回与点击分开的聚合结果。这是非常强大和有效的,因为您可以运行查询和多个聚合,并一次获得两个(或其中一个)操作的结果,避免使用简洁和简化的API进行网络往返。 我想执行搜索,当我对聚合有查询时返回点击。但我不确定如何才能做到以上几点? 我正在使用以下查询:

  • 怎么搜索我的数据? 怎么使用周边搜索? 怎么高级筛选来找相关数据?