小集合的智能字符串搜索

Posted

技术标签:

【中文标题】小集合的智能字符串搜索【英文标题】:Smart string search for small collections 【发布时间】:2015-01-07 07:08:09 【问题描述】:

我在内存中有一个非常小的字符串值集合(大约 8400 条记录,平均每条记录 10 个单词):

我试图找出是否有库或其他东西,当我在该集合中搜索字符串时,它会根据它返回匹配值,并且它还可能包括某种对结果的权重。

这就是我想要做的;假设我在内存中的 List 中有这些记录:

百货总经理 总经理兼运营经理 总经理 餐厅一般经理 餐厅总经理

假设我正在研究一种接收搜索字符串的方法,它将分析该集合以检索结果:

List<string> SearchJotitles("General Manager")

我想要返回包含单词 General AND Manager 的所有记录的东西。到目前为止应该很容易:我可以使用正则表达式来完成。

但棘手的部分是我想应用一些称重规则:

“好的:第三条记录是一个更大的匹配,因为它是一个精确匹配。” “第一个和最后一个记录应该是下一个,因为它们有两个单词,它们之间没有距离”。 “第二条记录应该是下一个,因为它有两个完全相同的单词,但顺序不同” “第四条记录应该是最后一个,因为它有两个单词的部分匹配”

这就是我想要应用的逻辑。

我知道有一些库,例如 Lucene.NETSphinx:我不会丢弃它们;我只是不相信它们是否值得用于如此小的内存集合。

在最坏的情况下,我将在实体的 IComparer 实现中工作,但我想知道是否有一些我已经可以使用的东西。

感谢和问候,

【问题讨论】:

【参考方案1】:

在这个特定的示例中,记录量很小,但仍不会降低全文搜索的复杂性。

如果您只有 5 条记录,那么实现简单的Levenshtein distance(或在线查找实现)可能是个好主意,标记所有短语并执行您的自定义匹配算法(单词距离,可能是同义词等)。

另一方面,使用 Lucene.NET 可以为您提供开箱即用的功能。您可以使用 RAMDirectory 将索引存储在内存中。最重要的是,您不必花费数小时试图弄清楚您的自定义算法为何无法正常工作。为什么要重新发明***?

替代方案? 您是否在应用程序中使用任何 sql 数据库?也许值得利用现代 SQL 数据库中内置的全文搜索,当然如果您使用的话。

【讨论】:

谢谢@plentysmart;我要给 Lucene.NET 一个机会:我听说它很难配置,但我会研究一下。我考虑过全文搜索,是的,但是如果您想自定义它对结果进行排名的方式,它就没有那么强大了,所以我放弃了。

以上是关于小集合的智能字符串搜索的主要内容,如果未能解决你的问题,请参考以下文章

如何在聚合期间将mongodb子集合的objectid转换为字符串

jquery插件小集合

python中集合的用法

一文看懂从并查集到图的基本算法

MongoDB小集合查询很慢

●小集训之旅 三