【问题标题】:Fulltext match search in natural language mode自然语言模式下的全文匹配搜索
【发布时间】:2020-08-13 02:51:53
【问题描述】:

我正在尝试在 mysql 中进行全文搜索。我希望当我传入一个字符串时,当我使用 [自然语言模式]mysql - fulltext index - what is natural language mode 时,我会收到按相关性排名。

这是我创建索引的方式:CREATE FULLTEXT INDEX item_name ON list_items(name);

当我使用 LIKE 时,我会收到结果,但我想按相关性对它们进行排序。因此,全文搜索。

这是我使用 LIKE 的查询:SELECT name FROM list_items WHERE name LIKE "%carro%"; 这导致Carrots, Carrots, Carrots 等。

这是我尝试 MATCH 搜索的查询:SELECT name FROM list_items WHERE MATCH(name) AGAINST('carro' IN NATURAL LANGUAGE MODE); 没有返回任何结果。

我的查询基于此帖子的选定答案:Order SQL by strongest LIKE? 还有这个页面:https://www.w3resource.com/mysql/mysql-full-text-search-functions.php

即使我在没有自然语言模式或布尔模式的情况下运行查询,我也没有得到任何结果。我错过了什么?

【问题讨论】:

  • 全文搜索默认搜索完整的单词。要查找以文本开头的单词,请使用通配符 ('carro*')。这无法在单词中间找到文本(就像您可以使用 like '%carro%' 一样)。还要注意相关性意味着什么,并且您几乎无法控制 MySQL 认为相关的内容。它是根据一个单词的稀有程度来计算的。如果您的列包含 3 次“Carrot”和 1 次“Carrotcake”,那么即使您认为“carrot”看起来更类似于“carro*”,carrotcake 比 carrot 更相关。对其进行测试,但请检查全文索引是否适合您的要求。
  • 那么在这里使用LIKE 会更好吗?
  • 由于您没有指定您的要求(例如,如果您想在单词中间搜索,或者您认为相关的内容),我无法告诉您 like 是否是更好的选择.我只是想评论一下,您应该测试和检查(或详细说明)您的要求,如果它们符合全文搜索可以(和不能)做的事情(如果不能,我们可能会指导您寻找替代解决方案)。跨度>

标签: mysql sql


【解决方案1】:

您似乎想使用* 作为通配符。为此,您需要使用“布尔”模式而不是“自然语言”。所以,这可能会做你想做的事:

SELECT name
FROM list_items
WHERE MATCH(name) AGAINST('carro*' IN BOOLEAN MODE)

这仍然会产生相关性排名,尽管它可能与自然语言模式不完全相同。

另请注意,这将获得诸如“carrouse”之类的匹配项。

我认为 MySQL 不支持全文搜索的同义词列表,因此很难避免(尽管 like 过滤和全文过滤可能就足够了)。

【讨论】:

  • 当我按原样运行您的答案时,我收到此错误:Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LANGUAGE MODE)' at line 1
猜你喜欢
  • 2013-02-27
  • 2019-08-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2019-09-22
  • 2012-08-22
相关资源
最近更新 更多