Sql 基于文本列的相关行

Sql 基于文本列的相关行,sql,mysql,sqlite,search,Sql,Mysql,Sqlite,Search,假设我有一个包含一列文本的表(MySQL或SQlite),那么是否可以使用该列的值来查找具有某种相关文本值的类似行 例如,如果我想查找与第3行相关的行,则第1行和第2行都将匹配: row_1 = this is about sports row_2 = this is about study row_3 = this is about study and sports 我知道,如果我有一个关键字想与列值进行匹配,我可以使用全文或FTS3,但我只是想找到行之间有点关联的文本。MySQL支持一个

假设我有一个包含一列文本的表(MySQL或SQlite),那么是否可以使用该列的值来查找具有某种相关文本值的类似行

例如,如果我想查找与第3行相关的行,则第1行和第2行都将匹配:

row_1 = this is about sports
row_2 = this is about study
row_3 = this is about study and sports 

我知道,如果我有一个关键字想与列值进行匹配,我可以使用全文或FTS3,但我只是想找到行之间有点关联的文本。

MySQL支持一个称为
查询扩展
的全文搜索选项。其思想是搜索关键字,它会找到一行,然后使用该行中的单词作为关键字,搜索更多匹配的行

SELECT ... FROM StudiesTable WHERE MATCH(description_text) 
  AGAINST ('sports' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION);

请在此处阅读:

您使用的锤子打错了螺丝。数据库列中的单个字符串不是存储该数据的方式。你不可能轻易地得到你所关心的部分,那就是单个单词

关于文本比较的问题有很多研究。如果你认真对待这个需求,你会想开始阅读关于这个问题领域的各种技术

第一条线索是,您希望访问/索引数据,而不是通过完整的文本字符串,而是通过单词或句子片段(除非您对拼写相似的单词进行匹配感兴趣,这比较困难)

作为一种技术的示例,通过抓取三个单词的重叠集合,从句子中生成一条链,并存储该链。然后可以搜索具有大量公共链段的条目。上述陈述的一组链段为:

row_1=这是关于体育的

第2排= 这是关于学习的

第3行=这是 关于学习和运动

  • 这是关于(3场比赛)
  • 是关于运动的
  • 关于学习(2场比赛)
  • 关于学习和
  • 学习和运动

也许将每一个相关单词(超过4个字母?或与一个常用单词列表进行比较?)作为全文搜索的关键字,并构建一个tmp表(
id,row\u matched\u id,count
)来记录每一行的匹配,在匹配时加1进行计数就足够了。最后,您将在tmp表中获得所有匹配的行以及它们匹配的次数(有多少个相关单词是相同的)。
如果您想对整个数据库运行一次并保留结果,请使用持久化表,为基行的id添加一列,并搜索插入(或更新)的每一新行更新结果表。
使用此结果表,您可以快速查找与基行中更多单词匹配的行,而无需再次进行搜索


编辑:使用此选项,您可以对结果进行“评分”,例如,如果您在基本行中计算x个相关单词,您可以计算%as(matches/x*100)的分数,并过滤所有匹配少于50%的结果。在你的例子中,如果考虑到相关词,只有4个字母或67%个单词,如果你考虑所有单词,每一个ROWY1和ROWY2都会得到50%。

很好,但是我又没有关键字要搜索——我只是把数据排在行中,试图找到相关的行。然而,如果我需要它,我会把它作为有用的书签。不幸的是,MySQL全文搜索无法做到这一点。模式必须是字符串文字,而不是列名、参数或用户变量。