mysql - 使用匹配和自然语言模式的低相关性结果
问题描述
我正在构建一个由网站上的自动完成功能使用的查询。字段“术语”使用完整索引类型进行索引。我的查询应该将最相关的结果浮动到列表顶部。但也有一些例子,最明显的匹配没有给予足够的相关性。
这是一个例子。我有一个产品术语“Just Believe Bird Feeder”。它确实出现在搜索该确切短语的过程中。但与包含不止一次搜索词之一的术语相关性较低(即“鸟管喂鸟器”)
此外,搜索“相信”或“只是相信”会产生零结果。
我最好的解决方案是什么来克服这个问题?
SELECT
term,
MATCH (term) AGAINST (
'Just Believe Bird Feeder' IN NATURAL LANGUAGE MODE
) AS relevancy
FROM
autocomplete
WHERE
MATCH (term) AGAINST (
'Just Believe Bird Feeder' IN NATURAL LANGUAGE MODE
)
ORDER BY
relevancy DESC
LIMIT 15
解决方案
你的话believe
和just
在 MyISAM停用词列表上。使用全文索引进行索引(或搜索)时,该列表上的单词会被忽略,因此您既找不到它们,也不会影响相关性得分。
停用词列表的想法是排除在英语文本中如此常见以至于它们的出现没有相关性的单词。但是,此功能对于在短标题或产品代码或人工术语列表中进行搜索不太有用。
您可以调整ft_stopword_file
配置设置以指定您自己的停用词列表,例如将其设置为空字符串以完全禁用它,否则为您自己的停用词列表指定文件名。您需要在调整设置并重新启动服务器后重建索引,例如使用 REPAIR TABLE tbl_name QUICK
.
如果您无法控制服务器配置,您可以将表切换到 InnoDB,它使用的停用词列表要小得多。
一些附加说明:
- 全文索引使用最小字长,MyISAM 默认为 4,InnoDB 默认为 3。如果您希望“8 oz”之类的术语产生影响,您可能还需要调整这些设置。
- 术语的顺序对全文搜索中的相关性没有影响
推荐阅读
- powershell - 使用变量从 PowerShell 打印 PNG 文件
- javascript - 数据未设置为默认值
- ruby-on-rails - 验证错误:“密码不能为空”,但不能为空
- python - 使用 Batch Dataset 的 Keras ANN 分类报告
- python - Why I get an ImportError while importing cairo if the installation seems to be correct?
- python - 如何在不输入完整文件路径的情况下运行 Python 脚本
- flutter - Flutter Firestore 数据传输
- reactjs - 找不到模块:无法解析“react-bootstrap/Offcanvas”
- babylonjs - 在巴比伦js中沿轴旋转gltf模型
- kotlin - 常见的 KMM 依赖项Main