【问题标题】:how to use Fuzzy look up to find the sentence in SQL?如何使用模糊查找在 SQL 中查找句子?
【发布时间】:2016-10-03 08:51:55
【问题描述】:

搜索词=['网站上的 ISBN 号'] 变量(列):语句,在 MySQL 表中。它由许多不同的句子组成。

我要查找的句子是 “自动链接功能带有 Google 最新的工具栏,如果它在网站上找到一本书的 ISBN 号,它会在网页中提供指向 Amazon.com 的链接。”

但是,当我使用以下语句时:

SELECT * FROM testtable
where Sentence like "%ISBN number on site%" ;

我无法得到结果。这是因为搜索词(“ISBN number on site”)与句子相比缺少一个词(“the”)。

如何改变我的陈述以获得我想要的句子?谢谢。 假设我们不更改搜索词=['ISBN number on site']

【问题讨论】:

  • 您可能想研究在 MySQL 中使用全文搜索。

标签: mysql sql


【解决方案1】:

这不是一个简单的问题。您最好的选择是使用某种类型的fulltext search。全文搜索可以配置为包含停用词(从搜索中省略的词 - 例如词 the),并且还可以具有最小词长限制(长度小于某些字符的词也会从搜索中省略。

但是,如果你只是使用

SELECT * FROM testtable
WHERE MATCH (sentence)
AGAINST ('ISBN number on site');

那么 MySQL 将不仅返回具有您要查找的值的记录,而且返回仅包含某些单词的记录,并且以不同的顺序返回。您展示的那张可能是排名最高的一张,但不能保证它一定是排名最高的一张。

您可能希望使用Boolean fulltext search 并在每个搜索词前添加+,以强制 MySQL 仅返回包含所有搜索词的记录:

SELECT * FROM testtable
WHERE MATCH (sentence)
AGAINST ('+ISBN +number +on +site' IN BOOLEAN MODE);

但是,on 应该是一个停用词(它在默认的 stipword 列表中)或者应该比最小词长短,所以应该从搜索表达式中省略(你不会得到任何结果):

SELECT * FROM testtable
WHERE MATCH (sentence)
AGAINST ('+ISBN +number +site' IN BOOLEAN MODE);

我知道这需要更改搜索表达式,但是这将使用 MySQL 的内置功能为您提供最佳结果。

替代方法是使用其他全文搜索引擎,例如sphinx 为您执行搜索。

【讨论】:

  • 如果有人需要答案。更改表testtable 添加全文(sentence); SELECT * FROM testtable WHERE MATCH (sentence) AGAINST ('+ISBN +number +site' IN BOOLEAN MODE);
【解决方案2】:

试试:

SELECT * FROM testtable where Sentence like '%ISBN number on%site%' ;

通配符也可以放在字符串的中间。

【讨论】:

  • 您如何知道在一般搜索表达式中放置通配符的位置?
  • 非常感谢。有没有其他方法可以做到这一点?因为我们假设我们不更改搜索词=['ISBN number on site']。这是因为我使用搜索词作为变量,所以如果我硬编码搜索词很难做到
  • @Shadow 你可以用一个替换每个空格。我猜这会让你走得很远。直到订单开始转移。那么也许您必须根据空格拆分字符串并将每个单词添加为单独的类似语句(WHERE ... AND ... AND ...)
  • 这会非常慢,因为 MySQL 将无法使用任何索引来加速查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 2021-11-02
  • 2016-07-16
  • 1970-01-01
相关资源
最近更新 更多