基于单词/标签匹配,最后访问和频率的搜索算法

时间:2014-07-22 13:49:21

标签: algorithm search data-structures

我正在开发一款用于存储机密的小型移动应用。秘密有不同的类型:简单(纯文本),密码和图像。每个秘密通过一个或多个标签连接。我在主页中有一个搜索文本框,用户可以在其中键入一些文本来搜索机密。

在一个简单的层面上,我可以根据字符串匹配描述或标记来搜索持久化的秘密。通过描述匹配的那些具有比通过标签匹配的那些更高的等级。但是,我还要考虑其他几个因素:最后访问和访问频率。我很困惑这两个因素如何影响比赛。

是否存在任何数据结构/算法可帮助我根据描述,标记,上次访问和访问频率对匹配的实体进行排序?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望通过单词和标签匹配进行搜索,以获得候选人列表,您可以从中选择" best"项目。您的问题表明您赞成在标记匹配上对描述(字?)进行完全匹配。现在,您想知道如何将访问频率和上次访问时间考虑在内。

您不需要为此目的使用特定的数据结构。您可以排序的任何列表都可以正常工作。诀窍是提出一个比较函数,将这些事情考虑在内。比较功能的工作方式取决于您。

最简单的比较函数是基于四个标准的简单排序:单词匹配,标记匹配,最后访问和频率。它看起来像是:

// returns 1 if item1 > item2.
// returns -1 if item1 < item2
// returns 0 if item1 == item2
int compare(item1, item2)
{
    if (item1.wordMatch && !item2.wordMatch) return 1;
    if (item2.wordMatch && !item1.wordMatch) return -1;
    // do the same with tag match
    // then check last access
    if (item1.lastAccess > item2.lastAccess) return 1;
    if (item1.lastAccess < item2.lastAccess) return -1;
    // and check access frequency
    if (item1.freq > item2.freq) return 1;
    if (item1.freq < item2.freq) return -1;
    // everything's the same
    return 0;
}

你可能想要计算一个&#34;得分&#34;对于每个项目。例如,单词匹配值10分,标签匹配值得,比如4分。因此,具有三个标记匹配的项目将得分为12,其排名高于具有单个精确单词匹配的项目。

如何量化上次访问时间和访问频率取决于您。你想要考虑每件事的重要性。如果不经常访问但在30秒前最后一次访问的内容应该排在高于或低于非常频繁访问但在最后一小时内根本没有访问过的内容?只有你可以决定每个标准的重要性。

一旦你想出了计算每个项目得分的方法,你的比较功能就很简单。

无论你做什么都需要一些调整。一种开始的方式是:

10 points for an exact word match
 4 points for a tag match
subtract .01 points for every minute since the last access time, up to a maximum of 8 points.
add .01 points for each prior access (i.e. frequency count), up to a maximum of 8 points.

我说实话,以上只是对可能给出合理结果的猜测。关键是想出一些东西并尝试一下。然后做一些调整。也许尝试其他事情。但基本思路是提出一种基于这四个标准计算分数的方法。