【问题标题】:MySQL disable stopwords for one columnMySQL禁用一列的停用词
【发布时间】:2017-02-07 17:49:18
【问题描述】:

是否可以只禁用一张表甚至一列的停用词?我知道有一些选项可以全局禁用它。我需要这个来使用两种类型的搜索:

a) 标准布尔模式搜索(此处忽略所有停用词)
b)自动完成搜索(这里我不想忽略任何单词,因为如果用户输入“the”,我不知道它是整个单词还是前 3 个字母。我可以有两列具有相同的数据,例如: title 和 title_autocomplete,但我怎样才能只为一列禁用停用词机制?

示例:

a) 用户类型“The”不返回任何内容,因为“the”是停用词
b) 用户类型“The”返回所有以“the”开头或仅包含“The”字样的“Thermal..”或“The most important..”

我希望这两个选项使用一个 MySQL 服务器实例。

【问题讨论】:

  • 如果用户在自动补全字段中输入“the”,您是否希望它显示“指环王”、“哈利波特与凤凰社”和“热力学”?如果您在第一次搜索模式中使用它,您只想获得“热力学”?
  • @Solarflare 检查更新。在自动完成中,我希望全部以“the”开头或仅包含“the”。在标准搜索中,将“the”视为停用词。
  • 我的问题实际上是您是否想要以“the”开头的结果(例如,正如您提到的,“Thermal..”或“The most important”),或者还包含包含以“the”开头的单词的结果在标题中的任何位置使用“the”(例如“在夏天......”或“热动力学指南”),因为我想确保您确实需要在那里使用全文搜索。
  • @Solarflare 是的,我需要,单词顺序不重要。

标签: mysql full-text-search


【解决方案1】:

MySQL 不支持不同列的不同停止列表,您也不能,例如在您进行搜索之前暂时禁用或启用停止列表(不重建索引)。但这里有一些想法可以解决这个问题:

  • 如果您的标准搜索真的应该只查找您的示例所暗示的完整单词,例如"the word" 的用户输入会产生类似match(title) against ('+the +word' in boolean mode) 的查询,而相应的自动完成搜索会产生match(title) against ('+the* +word*' in boolean mode),您可以直接在应用程序中模拟此行为。在 MySQL 中禁用停用词列表,但在应用程序中维护您自己的内部停用词列表;检查用户输入,不要将这些字词添加到您的搜索查询中(当您没有任何字词时,不要执行任何操作)。

  • 您可以添加一个仅包含主键和 title 列的 MyISAM 表,并通过触发器使它们保持同步。 InnoDB 和 MyISAM 都有自己的停止列表,因此这听起来可能与您正在寻找的内容很接近。但是这种方法存在一些主要问题: MyISAM 不支持事务,因此如果您在 InnoDB 表中回滚更改,它们将不会在 MyISAM 中回滚。如果您将 MyISAM 用于您的主表(您不应该),请不要对该表使用事务或您的数据是静态的,这可能是一个选项。另一个问题是,MyISAM 将在 MySQL 的下一个版本中被移除。

  • 禁用停用词列表,添加一列title_withoutstopwords 并维护可用于标准搜索的标题的“清理”版本。这意味着您需要编写一个函数来删除文本中的所有停用词。您可以使用该函数的输出,例如在触发器中使您的列保持同步。这可能是最安全的方式,但会有点冗长。

  • 禁用停用词列表,然后在客户端中过滤标准搜索的结果(或接受结果可能包含停用词)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2021-02-02
    • 2011-05-25
    • 2020-07-23
    • 2013-02-02
    • 2014-05-10
    相关资源
    最近更新 更多