【问题标题】:MySQL Match Against for exact Phrase working partiallyMySQL Match Against 精确短语部分工作
【发布时间】:2021-07-22 11:11:29
【问题描述】:

我有一个表,在该表中,我在名为 item_desc 的列中创建了全文索引。

假设表包含三个记录,其中 item_desc 列包含“氯化钠”,如下所示:

  1. 氯化钠标准溶液
  2. 5425氯化钠100u
  3. 氯化钠溶液数量

我有一个以下 (Match, Against) 查询,它应该通过精确匹配记录来返回行,但它只返回前两行与 氯化钠 并且不考虑短语 if它与 QtySodium Chloride 等另一个词连接。

SELECT * FROM tblhugedata WHERE MATCH(Item_desc) AGAINST('"*Sodium Chloride*"' IN BOOLEAN MODE);

以下 LIKE 查询返回预期结果,但我只想使用全文索引。

SELECT * FROM tblhugedata WHERE Item_desc like '%SODIUM CHLORIDE%';

有没有办法通过匹配提取这样的结果,反对方式。

【问题讨论】:

  • 去掉星号。 FULLTEXT 不允许使用前导通配符。

标签: mysql full-text-search innodb mysql-5.7 exact-match


【解决方案1】:

去掉星号。 FULLTEXT not 允许 leading 通配符。也就是说,没有办法让MATCH 匹配QtySodiumSodium

我会认为“QtySodium”是“垃圾”并向数据提供者投诉。

这是一个适用于某些情况的组合:

WHERE WHERE MATCH(Item_desc) AGAINST('Sodium Chloride' IN BOOLEAN MODE)
  AND Item_desc LIKE '%SODIUM CHLORIDE%'

这样,它将有效地过滤到具有“Sodium”或“Chloride”的行,然后检查这些行的子字符串“Sodium Chloride”。这将与您的 3 个示例匹配,但可能与其他示例不匹配。

【讨论】:

  • 谢谢。这个解决方案对我来说几乎没有什么变化。例如它正在搜索QtySodium,但没有搜索123Sodium,所以当我将* 放入Against 时,它会同时搜索:WHERE MATCH(Item_desc) AGAINST('*Sodium Chloride*' IN BOOLEAN MODE) AND Item_desc LIKE '%SODIUM CHLORIDE%'。但我仍然不明白MySQL 如何使用全文索引,即使使用LIKE 查询!
【解决方案2】:

SELECT * FROM tblhugedata WHERE MATCH(Item_desc) AGAINST(自然语言模式下的“氯化钠”);

InnoDB 全文搜索不支持对单个搜索词使用多个运算符。

【讨论】:

    猜你喜欢
    • 2012-03-15
    • 2013-01-24
    • 2014-05-04
    • 2020-10-31
    • 2012-05-22
    • 1970-01-01
    • 2011-11-10
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多