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

如何在MySQL中按相似度进行匹配和排序?

刁璞
2023-03-14
问题内容

目前,我正在执行搜索功能。可以说在我的数据库中,我有以下数据:

  • 关键字1
  • 关键字2
  • 关键字3
  • 关键的东西
  • 钥匙

然后用户输入:“ Key”作为要搜索的关键字。这是我当前的查询:

SELECT * FROM data WHERE (
  data_string LIKE '$key%' OR 
  data_string LIKE '%$key%' OR
  data_string LIKE '%$key'
)

基本上,我有2个问题:

  1. 如何按相似性排序(排序)。从上面的示例中,我希望“ Key”作为我的第一个结果。我当前的结果是:Keyword1,Keyword2,Keyword3,Keysomething和Key

  2. 我的SQL查询仅按“ data_string”列进行搜索,如果我想查找其他列怎么办?我需要做这样的事情吗?

    SELECT * FROM data WHERE (
    data_string LIKE ‘$key%’ OR
    data_string LIKE ‘%$key%’ OR
    data_string LIKE ‘%$key’
    ) OR (
    data_other LIKE ‘$key%’ OR
    data_other LIKE ‘%$key%’ OR
    data_other LIKE ‘%$key’
    ) – …

是否有比第二季度更好/更快的查询?


问题答案:

我不确定LIKE这样做是否正确。如果您需要在文本中搜索关键字并按相关性得分对结果进行排序,则应使用MySQL全文索引和MySQL全文搜索功能。抱歉,如果这使您偏离了实际尝试执行的操作,但是我建议您先看看它。MySQL参考手册中的一些引号:

1)如何在表的多列上创建全文本索引

mysql> CREATE TABLE articles (
    ->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->   title VARCHAR(200),
    ->   body TEXT,
    ->   FULLTEXT (title,body)
    -> );

2)样本数据

mysql> INSERT INTO articles (title,body) VALUES
    -> ('MySQL Tutorial','DBMS stands for DataBase ...'),
    -> ('How To Use MySQL Well','After you went through a ...'),
    -> ('Optimizing MySQL','In this tutorial we will show ...'),
    -> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
    -> ('MySQL vs. YourSQL','In the following database comparison ...'),
    -> ('MySQL Security','When configured properly, MySQL ...');

3)示例查询,该查询在多列中搜索关键字并显示结果+得分:

mysql> SELECT id, body, MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root') AS score
    -> FROM articles WHERE MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root');
+----+-------------------------------------+-----------------+
| id | body                                | score           |
+----+-------------------------------------+-----------------+
|  4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
|  6 | When configured properly, MySQL ... | 1.3114095926285 |
+----+-------------------------------------+-----------------+


 类似资料:
  • 问题内容: 我有一个包含单词的表和一个输入字段,可使用实时搜索来搜索该表。当前,我使用以下查询来搜索表: 有没有一种方法可以对结果进行排序,以使在单词开头找到字符串的字符串排在最前面,而在单词后面出现字符串的字符串排在最后呢? 例如:搜索“ hab ”当前返回 一个 lphabet ^ h 升技 [R EHAB 但我想这样: 赞 一下(首先是因为“赞”是开始) alp hab et(第二个原因是’

  • 问题内容: 如何查询相似度排序的记录? 例如。搜索“库存溢出”将返回 堆栈溢出 SharePoint溢出 数学溢出 政治溢出 视觉特效溢出 例如。搜索“ LO”将返回: 巴勃罗毕加索 米开朗基罗 杰克逊·波洛克 我需要什么帮助: 使用搜索引擎索引和搜索MySQL表,以获得更好的结果 使用Sphinx搜索引擎和PHP 在PHP中使用Lucene引擎 使用全文索引,查找相似/包含的字符串 什么不好 L

  • 问题内容: 如何匹配MySQL中单词的变体,例如,对会计的搜索应与会计,会计,会计等匹配。我在共享主机上,因此不能向levenshtein等MySQL添加任何功能。 我想类似谷歌如何匹配“的东西 会计课程 ”和“ 会计课程 ”的“搜索时, 会计师课程 ”。例子。 我的服务器语言是php,如果只能在其中实现而不是在SQL中实现。 当前语句如下。 问题答案: MySQL在全文搜索方面不是很好,您可能想

  • 问题内容: 我有一张桌子:“ ID名称c_counts f_counts” 我想按顺序排序所有记录, 但这不起作用: 问题答案: 别忘了,如果要混合使用分组(即SUM)字段和非分组字段,则需要对非分组字段之一进行GROUP BY。 尝试这个: 或这个: 而且,您始终可以执行以下派生查询: 许多可能性!

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

  • 问题内容: 我有一个类似于http://drive.google.com的链接,并且我想在该链接之外匹配“ google”。 我有: 但这仅在整个文本为“ google”时才匹配(不区分大小写,因此也匹配Google或GooGlE等)。如何匹配另一个字符串中的“ google”? 问题答案: 关键是您使用的ElasticSearch正则表达式需要 完整的字符串匹配 : Lucene的模式总是锚定的