我有一个存储数百或数千个字符串的SQLite数据库,我保留了这些字符串的数组,因此我可以更快地搜索我的数据库。但是,用户可以使用搜索字符串进行搜索,我会在数据库中对字符串进行排名,以确定它们与搜索字符串的接近程度。例如,假设他们搜索“foo”。如果我的数据库中有条目“foo”“foobar”和“foo foo”,那么是否有人对按顺序排列这些字符串的算法有任何想法:
1。 “foo”(完全匹配)
2。 “foo foo”(它包含两次搜索字符串)
3。 “foobar”(它包含一次搜索字符串)
是否有人知道或有任何想法会产生这种结果的算法?如果有人希望发布任何代码片段,我在java和c ++中工作,但我真的只是在寻找算法的想法。
注意,我想在搜索结果中显示像fobar或fuo这样的内容,因为搜索结果只有1个字母,
答案 0 :(得分:1)
当你说你希望排名处于线性时间时,我猜你只想分析一次集合中的每个字符串。
一种相对简单的方法是根据您定义的某些规则计算得分。当然,你拥有的规则越多,所需的时间就越长,但只要你很好地实施分析,即使数千个字符串也不会花费很长时间。
一个例子是你说完全匹配获得100分,而包含搜索字符串n次达到10n,并且在另一个单词中包含n次得到5n,依此类推。如果您以相当分离的方式实施规则,您可以调整几次规则,看看它们在实际搜索中的表现如何,直到您对搜索的准确性感到满意为止。
获得一组分数后,您可以使用一些非常快速的排序算法,按照最佳分数到最差分数为您排序结果。当然,您会排除小于x的分数结果。
(正如旁注,这种技术可以很容易地实现高级搜索功能,例如AND / OR / NOT,因为你可以拆分搜索术语的分析并将每个结果的分数结合起来)
答案 1 :(得分:1)
建立排名有不同的策略和要求。
http://wiki.apache.org/solr/SolrRelevancyCookbook
http://lucene.apache.org/java/2_4_0/scoring.html#Algorithm
BTW Solr本身就是一个解决方案,我很确定你已经知道这个时候了:-)