【问题标题】:Ranking Strings Based on a Search String in Linear Time基于线性时间的搜索字符串对字符串进行排序
【发布时间】:2011-12-12 04:26:03
【问题描述】:

我有一个存储数百或数千个字符串的 SQLite 数据库,我保留了一个我不断增长的这些字符串的数组,以便我可以更轻松地更快地搜索我的数据库。但是,用户可以使用搜索字符串进行搜索,我将在我的数据库中对这些字符串进行排名,以确定它们与搜索字符串的接近程度。例如,假设他们搜索“foo”。如果我的数据库中有条目“foo”“foobar”和“foo foo”,是否有人对按顺序排列这些字符串的算法有任何想法:

1。 “foo”(完全匹配)

2。 "foo foo"(包含两次搜索字符串)

3。 "foobar"(它包含一次搜索字符串)

有没有人知道或有任何想法会产生这种结果的算法?如果有人希望发布任何代码 sn-ps,我正在使用 java 和 c++,但是我真的只是在寻找算法的想法。

注意,我希望 fobar 或 fuo 之类的内容也出现在搜索结果中,因为它与搜索结果相差 1 个字母,

【问题讨论】:

标签: java c++ sql algorithm search


【解决方案1】:

当你说你希望排名是线性时间时,我猜你只想分析集合中的每个字符串一次。

一种相对简单的方法是根据您定义的一些规则计算分数。当然,规则越多需要的时间越长,但只要分析得好,即使是数千个字符串也应该不会花费很长时间。

例如,您说完全匹配获得 100 分,而包含搜索字符串 n 次获得 10n 得分,并且将其包含在另一个单词中 n 次获得 5n,依此类推。如果您以相当解耦的方式实施规则,您可以调整规则几次,看看它们在实际搜索中的表现如何,直到您对搜索的准确性感到满意为止。

一旦你有了一组分数,你就可以使用一些非常快速的排序算法来为你排序你的结果,按照从最好到最差的顺序排列。当然,您会排除分数小于 x 的结果。

(顺便说一句,这种技术可以很容易地实现高级搜索功能,例如 AND/OR/NOT,因为您可以拆分搜索词的分析并结合每个结果的得分)

【讨论】:

    【解决方案2】:

    建立排名有不同的策略和要求。

    http://wiki.apache.org/solr/SolrRelevancyCookbook

    http://lucene.apache.org/java/2_4_0/scoring.html#Algorithm

    BTW Solr 本身就是一个解决方案,我敢肯定你现在已经知道了 :-)

    Solr, Sunspot, SQlite, and Rails

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      相关资源
      最近更新 更多