鉴于我有一个包含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
对列值 - 但我只是想找到行之间有点相关的文本。
答案 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 =这是 关于学习和运动
答案 2 :(得分:1)
在基行中使用每个相关单词(超过4个字母?或比较共同单词列表?)可能就足够了,使用它们作为全文搜索的关键字并构建tmp表({{1 }})记录每一行的匹配,在匹配时加1。最后,您将在tmp表中获取匹配的所有行以及它们匹配的次数(相关单词的数量相同)。
如果要对整个数据库运行一次并保持结果,使用持久表,为基行的id添加一列,并搜索插入(或更新)的每个新行以更新结果表。
使用此结果表,您可以快速找到与基行的更多单词匹配的行,而无需再次进行搜索。
编辑:使用此功能,您可以对结果进行“评分”,例如,如果计算基行中的x个相关单词,则可以将得分计算为%(匹配/ x * 100)并过滤所有结果示例少于50%匹配。在您的示例中,如果考虑相关性仅包含超过4个字母的单词,则每个row_1和row_2将为50%,如果您考虑所有单词,则为67%。