基于文本列的相关行

时间:2010-07-31 16:12:38

标签: sql mysql sqlite search

鉴于我有一个包含TEXT列的表(MySQL或SQlite),是否可以使用该列的值,以便找到具有相关文本值的类似行?

例如,如果我想找到相关的行到row_3 - 我和1& 2匹配:

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

我知道我可以使用FULLTEXT或FTS3,如果我有一个关键词我希望MATCH对列值 - 但我只是想找到行之间有点相关的文本。

3 个答案:

答案 0 :(得分:3)

MySQL支持名为QUERY EXPANSION的全文搜索选项。我们的想法是搜索关键字,找到一行,然后使用该行中的单词作为关键字,搜索更多匹配的行。

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

在此处阅读:http://dev.mysql.com/doc/refman/5.1/en/fulltext-query-expansion.html

答案 1 :(得分:1)

你正在使用错误的锤子敲击螺钉。数据库列中的单个字符串不是存储该数据的方法。你不能轻易得到你关心的部分,这就是单词。

对文本比较问题进行了大量研究。如果您认真对待这种需求,那么您将需要开始阅读该问题域中的各种技术。

第一个线索是你想要不是通过完整的文本字符串来访问/索引数据,而是通过单词或句子片段来访问/索引数据(除非你对拼写相似的单词匹配在一起感兴趣,这更难)。 / p>

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

  

row_1 =这是关于体育

     

row_2 =   这是关于研究

     

row_3 =这是   关于学习和运动

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

答案 2 :(得分:1)

在基行中使用每个相关单词(超过4个字母?或比较共同单词列表?)可能就足够了,使用它们作为全文搜索的关键字并构建tmp表({{1 }})记录每一行的匹配,在匹配时加1。最后,您将在tmp表中获取匹配的所有行以及它们匹配的次数(相关单词的数量相同)。
如果要对整个数据库运行一次并保持结果,使用持久表,为基行的id添加一列,并搜索插入(或更新)的每个新行以更新结果表。
使用此结果表,您可以快速找到与基行的更多单词匹配的行,而无需再次进行搜索。

编辑:使用此功能,您可以对结果进行“评分”,例如,如果计算基行中的x个相关单词,则可以将得分计算为%(匹配/ x * 100)并过滤所有结果示例少于50%匹配。在您的示例中,如果考虑相关性仅包含超过4个字母的单词,则每个row_1和row_2将为50%,如果您考虑所有单词,则为67%。