Sql 基于文本列的相关行
假设我有一个包含一列文本的表(MySQL或SQlite),那么是否可以使用该列的值来查找具有某种相关文本值的类似行 例如,如果我想查找与第3行相关的行,则第1行和第2行都将匹配: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支持一个
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场比赛)
- 关于学习和
- 学习和运动
id,row\u matched\u id,count
)来记录每一行的匹配,在匹配时加1进行计数就足够了。最后,您将在tmp表中获得所有匹配的行以及它们匹配的次数(有多少个相关单词是相同的)。如果您想对整个数据库运行一次并保留结果,请使用持久化表,为基行的id添加一列,并搜索插入(或更新)的每一新行更新结果表。
使用此结果表,您可以快速查找与基行中更多单词匹配的行,而无需再次进行搜索
编辑:使用此选项,您可以对结果进行“评分”,例如,如果您在基本行中计算x个相关单词,您可以计算%as(matches/x*100)的分数,并过滤所有匹配少于50%的结果。在你的例子中,如果考虑到相关词,只有4个字母或67%个单词,如果你考虑所有单词,每一个ROWY1和ROWY2都会得到50%。很好,但是我又没有关键字要搜索——我只是把数据排在行中,试图找到相关的行。然而,如果我需要它,我会把它作为有用的书签。不幸的是,MySQL全文搜索无法做到这一点。模式必须是字符串文字,而不是列名、参数或用户变量。