MySQL全文搜索中的WITH QUERY EXPANSION MODE是什么

hun*_*eox 5 mysql full-text-search

MATCH (col1,col2,...) AGAINST (expr [search_modifier])

search_modifier: 
{ 
     IN NATURAL LANGUAGE MODE 
   | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION    
   | IN BOOLEAN MODE 
   | WITH QUERY EXPANSION 
}
Run Code Online (Sandbox Code Playgroud)

你能向我解释一下什么是 QUERY EXPANSION 以及 MySQL 使用这种模式做什么吗?

小智 6

对您问题的简短回答是,查询扩展通过向搜索词添加额外的相关信息来增强原始搜索词。错误引用了Derek 链接中的示例:

\n\n
\n

例如,当用户不确定如何拼写 \xe2\x80\x9cMaigret\xe2\x80\x9d 时,可以搜索 Georges Simenon 撰写的关于 \n Maigret 的书籍。搜索\n \xe2\x80\x9cMegre 和不情愿的证人\xe2\x80\x9d 仅找到\xe2\x80\x9cMaigret 和\n 不情愿的证人\xe2\x80\x9d,而没有查询扩展。使用查询\n 扩展进行的搜索在第二遍中查找包含单词 \xe2\x80\x9cMaigret\xe2\x80\x9d 的所有书籍。

\n
\n\n

本教程应该会让事情变得更清楚:

\n\n

使用 MySQL 查询扩展

\n\n

摘要:在本教程中,您将了解 MySQL 查询扩展,以基于自动相关性反馈来拓宽搜索结果。

\n\n

MySQL查询扩展简介

\n\n

在某些情况下,用户希望根据他们所拥有的知识来搜索信息。用户使用他们的知识来定义关键字来搜索信息,并且通常这些关键字太短。为了帮助用户根据过短的关键词找到自己想要的内容,MySQL全文搜索引擎引入了一个称为查询扩展的概念。

\n\n

查询扩展用于基于自动相关性反馈(或盲查询扩展)来拓宽全文搜索的搜索结果。从技术上讲,MySQL全文搜索引擎在使用查询扩展时执行以下步骤:

\n\n
    \n
  • 首先,MySQL 全文搜索引擎查找与搜索查询匹配的所有行。
  • \n
  • 其次,它检查搜索结果中的所有行并查找\n相关单词。
  • \n
  • 第三,它再次执行搜索,但基于相关词\而不是用户提供的原始关键字。
  • \n
\n\n

从应用的角度来看,当搜索结果太少时,可以使用查询扩展。您再次执行搜索,但通过查询扩展为用户提供更多与他们正在寻找的内容相关的信息。

\n\n

要使用查询扩展,您可以在函数WITH QUERY EXPANSION中使用搜索修饰符AGAINST()。下面说明了使用搜索修饰符的查询语法WITH QUERY EXPANSION

\n\n
SELECT column1, column2\nFROM table1\nWHERE MATCH(column1,column2)\n      AGAINST(\'keyword\',WITH QUERY EXPANSION)\n
Run Code Online (Sandbox Code Playgroud)\n\n

MySQL 查询扩展示例

\n\n

让\xe2\x80\x99s通过一个例子来了解MySQL查询扩展是如何工作的。

\n\n

我们将使用表productName的列products来演示查询扩展功能。首先,我们启用本专栏的全文搜索功能。

\n\n
ALTER TABLE products\nADD FULLTEXT(productName)\n
Run Code Online (Sandbox Code Playgroud)\n\n

其次,我们不使用查询扩展来搜索产品名称包含1992关键字的产品。

\n\n
SELECT productName\nFROM products\nWHERE MATCH(productName) AGAINST(\'1992\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

给予

\n\n
+-----------------------------------+\n| productName                       |\n+-----------------------------------+\n| 1992 Ferrari 360 Spider red       |\n| 1992 Porsche Cayenne Turbo Silver |\n+-----------------------------------+\n2 rows in set (0.00 sec)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如您所见,搜索结果中有 2 个产品名称包含 的产品1992

\n\n

第三,我们可以使用查询扩展来扩大搜索结果,如下语句:

\n\n
SELECT productName\nFROM products\nWHERE MATCH(productName)\n      AGAINST(\'1992\' WITH QUERY EXPANSION)\n
Run Code Online (Sandbox Code Playgroud)\n\n

给予

\n\n
+-------------------------------------+\n| productName                         |\n+-------------------------------------+\n| 1992 Porsche Cayenne Turbo Silver   |\n| 1992 Ferrari 360 Spider red         |\n| 2001 Ferrari Enzo                   |\n| 1932 Alfa Romeo 8C2300 Spider Sport |\n| 1948 Porsche 356-A Roadster         |\n| 1948 Porsche Type 356 Roadster      |\n| 1956 Porsche 356A Coupe             |\n+-------------------------------------+\n7 rows in set (0.00 sec)\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我们使用查询扩展时,我们在搜索结果中获得了更多行。前两行是最相关的,其他行来自前两行中的相关关键字,例如Ferrari

\n\n

请注意,盲目查询扩展往往会通过返回不相关的结果来显着增加噪音。强烈建议您仅在搜索关键字较短时才使用查询扩展。

\n\n

在本教程中,我们向您介绍了 MySQL 查询扩展,以在用户提供的关键字较短时扩大搜索结果。

\n\n

来源:使用 MySQL 查询扩展

\n