【问题标题】:MySQL Fulltext in Binary Mode doesn't match phrases二进制模式下的 MySQL 全文不匹配短语
【发布时间】:2022-11-17 01:44:04
【问题描述】:

实施简单的全文搜索我遇到了组合的问题布尔模式短语.另外值得注意的是,该列有一个二进制排序规则 (utf8_bin) 而表中没有这个。

给定以下设置:

CREATE TABLE `test` (
  `test_id` int(11) NOT NULL AUTO_INCREMENT,
  `text_bin` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`test_id`),
  FULLTEXT KEY `text_bin` (`text_bin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `test` (`test_id`, `text_bin`) VALUES
(1, 'Lorem Ipsum Dolor Sit Amet.'),
(2, 'Consectetuer Adipiscing Elit.'),
(3, 'Amet Sit Dolor Ipsum Lorem.')
;

然后运行此查询:

SELECT t.test_id, t.text_bin,
  MATCH(t.text_bin) AGAINST ('Lorem Ipsum' IN BOOLEAN MODE) as m_Words,
  MATCH(t.text_bin) AGAINST ('"Lorem Ipsum"' IN BOOLEAN MODE) as m_Phrase,
  MATCH(t.text_bin) AGAINST ('Lorem' IN BOOLEAN MODE) as m_Lorem,
  MATCH(t.text_bin) AGAINST ('Ipsum' IN BOOLEAN MODE) as m_Ipsum
FROM test t
;

这会产生以下结果:

test_id text_bin m_Words m_Phrase m_Lorem m_Ipsum
1 Lorem Ipsum Dolor Sit Amet. 0.0620 0 0.0310 0.0310
2 Consectetuer Adipiscing Elit. 0 0 0 0
3 Amet Sit Dolor Ipsum Lorem. 0.0620 0 0.0310 0.0310

(注意:为了更好的可读性,我将数字缩短为小数点后 4 位。)

对于 m_Phrase 列,我希望第一行的值大于 0。这是一个错误还是有人可以解释为什么结果为 0?

数据库小提琴:https://www.db-fiddle.com/f/8qxR3SiPVtESU3saebhgBG/0

【问题讨论】:

  • 是的,我肯定会期望那里的价值> 0。事实上,这应该是最高值,因为该短语出现在 3 行中的 1 行中,而不是 3 行中的 2 行。

标签: mysql full-text-search phrase


【解决方案1】:

我的直觉是,这与 space 分隔符有关。 utf8_unicode_ci 也会发生同样的情况

例如,在这个小提琴中,不同的排序规则会给出不同的结果,包括区分大小写和空格匹配作为文字的一部分 - https://www.db-fiddle.com/f/pi78uuA1RCFeToaRH9skcK/0

除了使用不同的排序规则之外,我不知道您的问题的解决方案 - 只需使用utf8_general_ci

了解您的用例甚至您面临的(可能)促使您使用utf8_bin的性能考虑因素会很有趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2020-08-13
    • 2014-03-07
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多