获取mySQL全文匹配分数的字符串不在表中(最理想的是在一个混合的结果集与表中的匹配)?



这一定是一个利基场景,因为我还没有能够找到一个类似的问题,在我的SQL工作台中,在我的简短测试中,只是使用字符串代替列名没有工作。

,

SELECT MATCH ('fork') AGAINST ('user entered text about forks' IN NATURAL LANGUAGE MODE);

行不通…

我有一个查询,返回匹配全文索引与相关性评分作为返回的列之一。在这个应用程序中,我正在寻找"搜索建议"。在建议表,是建立在网站搜索索引内容。用户端还将他们搜索的所有内容存储在本地浏览器存储中。

目前,我的前端代码使用regex从本地存储搜索历史(最多5个)中提取匹配,然后将他们键入的内容(当他们键入时)发送到后端,以从建议表中获得最佳匹配。

它现在的工作方式是,首先显示(最多5个)历史匹配,然后从后端填充其余的最多10个匹配。我更喜欢的是,我将历史匹配发送到后端,并以某种方式将它们包含在FT匹配查询中,以便结果集包含表中所有匹配的建议+从前端发送的历史匹配,但所有匹配都按全文匹配相关性评分排序,以便按照相关性顺序获得它们。新方法可能会导致没有历史匹配显示,或者可能会导致超过5个历史匹配显示,它会降低相关性评分。

这样的事情可能吗?我能想到的唯一另一种方法是,在运行中以某种方式创建一个具有全文索引的临时表,然后在当前查询中连接该表,然后在完成后删除临时表。在我看来,这个的问题是,这些都是在用户输入时实时发生的所以我不想添加这样的东西如果它会耽误响应时间。是否有一种快速/最佳的方法来做到这一点?是否有一种方法可以在查询结束时也删除临时表?

或者是否有其他命令可以根据用户输入的字符串值给我一个分数,就像我上面尝试的那样?

编辑:它看起来像我的临时表的想法可以工作:https://dev.mysql.com/doc/refman/8.0/en/create-temporary-table.html

我要看看这对性能有什么影响。我仍然很想听听大家的想法,这是否是最好的/唯一的方法,或者是否有更好的方法。

CREATE TEMPORARY TABLE路线是这里的必经之路。我测试了一下,它可以工作。

值得未来的旅行者注意。我不得不把我的主表从innodb切换到myisam来工作。我能够将myisam临时表与innodb主表混合/匹配,但评分算法不同,因此innodb匹配由于得分较高而优先考虑。这对我来说不是问题,因为我真的不需要/使用主要建议表的事务,所以我只是将它们作为MyISAM引擎。

另一个需要注意的是,我必须将用户的查询拆分为"单词"。并将它们封装在&;*&;并且将匹配作为布尔搜索而不是自然语言运行,因为在临时表的情况下,用户可能会输入类似的搜索,这意味着大多数单词在超过50%的行中,因此没有匹配返回。布尔搜索可以解决这个问题。同样,对于我的特定用例来说,这不是什么大问题。

如果我需要留在innodb中,这将是一个问题,因为据我所知,没有办法在innodb临时表上设置全文索引。

最新更新