获取 mySQL 不在 table 中的字符串的全文匹配分数(最好在包含来自 table 的匹配项的混合结果集中)?
Get mySQL full text match score for strings not in the table (optimally in a mixed result set with matches from the table)?
这一定是一个小众场景,因为我无法在 SQL workbench 的简短测试中找到类似的问题,只是使用字符串代替列名没用。
例如:
SELECT MATCH ('fork') AGAINST ('user entered text about forks' IN NATURAL LANGUAGE MODE);
没用...
我有一个查询 returns 与全文索引匹配,相关性得分作为返回的列之一。在此应用程序中,我正在根据网站搜索索引内容构建的建议 table 中寻找“搜索建议”。用户端还将他们搜索的所有内容存储在本地浏览器存储中。
目前,我的前端代码使用正则表达式从他们的本地存储搜索历史记录(最多 5 个)中提取匹配项,然后将他们键入的内容(在他们键入时)发送到后端以从中获取最佳匹配项建议 table.
现在的工作方式是首先显示(最多 5 个)历史匹配项,然后从后端填充最多 10 个匹配项。我更喜欢的是,我将历史匹配发送到后端并以某种方式将它们包含在 FT 匹配查询中,以便结果集包含来自 table 的所有匹配建议 + 从发送的历史匹配前端,但全部按全文匹配相关性得分排序,以使它们全部按相关性排序。新方式可能会导致不显示历史匹配项,或者可能会导致显示超过 5 个历史匹配项,这都会归结为相关性分数。
这样的事情可能吗?我能想到的唯一其他方法是以某种方式动态创建一个带有全文索引的临时 table,然后在我当前的查询中加入 table,然后删除临时 table 完成后。在我看来,这样做的问题是,这一切都是在用户键入时实时发生的,所以如果它会拖慢响应时间,我不想添加类似的东西。有 fast/optimal 的方法吗?有没有一种方法可以在查询结束时删除临时 table?
或者是否有一些其他命令可以像我在上面尝试的那样,根据字符串值和用户输入的内容给我一个分数?
编辑:
看来我临时 table 的想法可行:
https://dev.mysql.com/doc/refman/8.0/en/create-temporary-table.html
我只需要看看这会产生什么样的性能影响。我仍然有兴趣听听关于这是最好/唯一的方法还是有更好的方法的想法。
CREATE TEMPORARY TABLE
路线是去这里的路。我对其进行了测试并正常工作。
值得未来的旅行者注意。我必须将我的主 table 从 innodb 切换到 myisam 才能工作。我能够 mix/match myisam temp table 与 innodb main table,但是评分算法不同,因此 innodb 匹配由于更高的分数而优先。这对我来说不是问题,因为我真的不需要/使用交易作为主要建议 table 所以我只是让它们成为 MyISAM 引擎。
另一个值得注意的项目是,我不得不切换到将用户的查询拆分为“单词”并将它们封装在“*”中,运行匹配作为布尔搜索而不是自然语言,因为在在 temp table 的情况下,用户可能会输入类似的搜索,这意味着大多数单词出现在超过 50% 的行中,因此没有返回任何匹配项。布尔搜索解决这个问题。同样,对于我的特定用例来说没什么大不了的。
如果我为此需要留在 innodb 中,那将是一个问题,因为据我所知,没有办法在 innodb 临时文件上设置全文索引 table。
这一定是一个小众场景,因为我无法在 SQL workbench 的简短测试中找到类似的问题,只是使用字符串代替列名没用。
例如:
SELECT MATCH ('fork') AGAINST ('user entered text about forks' IN NATURAL LANGUAGE MODE);
没用...
我有一个查询 returns 与全文索引匹配,相关性得分作为返回的列之一。在此应用程序中,我正在根据网站搜索索引内容构建的建议 table 中寻找“搜索建议”。用户端还将他们搜索的所有内容存储在本地浏览器存储中。
目前,我的前端代码使用正则表达式从他们的本地存储搜索历史记录(最多 5 个)中提取匹配项,然后将他们键入的内容(在他们键入时)发送到后端以从中获取最佳匹配项建议 table.
现在的工作方式是首先显示(最多 5 个)历史匹配项,然后从后端填充最多 10 个匹配项。我更喜欢的是,我将历史匹配发送到后端并以某种方式将它们包含在 FT 匹配查询中,以便结果集包含来自 table 的所有匹配建议 + 从发送的历史匹配前端,但全部按全文匹配相关性得分排序,以使它们全部按相关性排序。新方式可能会导致不显示历史匹配项,或者可能会导致显示超过 5 个历史匹配项,这都会归结为相关性分数。
这样的事情可能吗?我能想到的唯一其他方法是以某种方式动态创建一个带有全文索引的临时 table,然后在我当前的查询中加入 table,然后删除临时 table 完成后。在我看来,这样做的问题是,这一切都是在用户键入时实时发生的,所以如果它会拖慢响应时间,我不想添加类似的东西。有 fast/optimal 的方法吗?有没有一种方法可以在查询结束时删除临时 table?
或者是否有一些其他命令可以像我在上面尝试的那样,根据字符串值和用户输入的内容给我一个分数?
编辑: 看来我临时 table 的想法可行: https://dev.mysql.com/doc/refman/8.0/en/create-temporary-table.html
我只需要看看这会产生什么样的性能影响。我仍然有兴趣听听关于这是最好/唯一的方法还是有更好的方法的想法。
CREATE TEMPORARY TABLE
路线是去这里的路。我对其进行了测试并正常工作。
值得未来的旅行者注意。我必须将我的主 table 从 innodb 切换到 myisam 才能工作。我能够 mix/match myisam temp table 与 innodb main table,但是评分算法不同,因此 innodb 匹配由于更高的分数而优先。这对我来说不是问题,因为我真的不需要/使用交易作为主要建议 table 所以我只是让它们成为 MyISAM 引擎。
另一个值得注意的项目是,我不得不切换到将用户的查询拆分为“单词”并将它们封装在“*”中,运行匹配作为布尔搜索而不是自然语言,因为在在 temp table 的情况下,用户可能会输入类似的搜索,这意味着大多数单词出现在超过 50% 的行中,因此没有返回任何匹配项。布尔搜索解决这个问题。同样,对于我的特定用例来说没什么大不了的。
如果我为此需要留在 innodb 中,那将是一个问题,因为据我所知,没有办法在 innodb 临时文件上设置全文索引 table。