我在内存中有一个非常小的字符串值集合(大约8400条记录,平均每条10个字):
我试图找出是否存在库或某些内容,当我在该集合中搜索字符串时,它会根据它返回匹配值,并且还可能包含对结果的某种权重。
这就是我想要做的;假设我在内存列表中有这些记录:
假设我正在研究一种接收搜索字符串的方法,它将分析该集合以检索结果:
List<string> SearchJotitles("General Manager")
我想要的东西会返回包含General AND Manager字样的所有记录。到目前为止应该很容易:我可以使用正则表达式来完成它。
但棘手的部分是我想应用一些称重规则:
“好的:第三条记录是一个更大的匹配,因为它是一个完全匹配。” “第一个和最后一个记录应该是下一个原因,因为他们有两个单词,它们之间没有距离”。 “第二条记录应该是下一个原因,因为它有两个确切的单词,但顺序不同”“第四条记录应该是最后一条,因为它有两个单词的部分匹配”
这就是我想要应用的逻辑。
我知道有一些像 Lucene.NET 或 Sphinx 这样的库:我不会丢弃它们;我只是不相信它们是否值得用于如此小的内存收集。
在最糟糕的情况下,我将参与实体的IComparer实现,但我想知道是否有我可以在那里使用的东西。
谢谢和问候,
答案 0 :(得分:2)
在此特定示例中,记录量很小,但仍不会降低全文搜索的复杂性。
如果你只有5条记录,那么实现简单的Levenshtein distance(或在线查找实现)可能是一个好主意,标记所有短语并进行自定义匹配算法(字距,可能是同义词等)。
另一方面,使用Lucene.NET可以提供开箱即用的功能。您可以使用RAMDirectory将索引存储在内存中。而且最重要的是你不必花费数小时试图找出你的自定义算法无法正常工作的原因。为什么重新发明轮子?
替代? 您在应用程序中使用任何sql数据库吗?也许值得利用内置于现代SQL数据库中的全文搜索,当然如果你使用它。