Node.js或C的区分大小写,精确的子串匹配/索引(无全文搜索)

时间:2015-02-05 11:59:24

标签: c node.js search indexing full-text-search

哪些库在Node.js 中针对大型字符串提供不区分大小写,精确的子字符串匹配?我特意寻找基于索引的解决方案。

例如,考虑一个语料库包含数百万个字符串:

  • "Abc Gef gHi"
  • "Def Ghi xYz"
  • ...

我需要一个库,以便搜索"C ge"返回上面的第一个字符串,但搜索"C ge"(注意多个空格)则不会。换句话说,我寻找带有词干和停止词的模糊,智能,全文搜索;相反,最简单(和快速)的精确子串匹配器具有可大规模工作的索引。

欢迎使用JavaScript中的解决方案,C 中的解决方案也是如此(因为它们可以转换为本机Node.js模块)。或者,也可以使用其他编程语言(如Java)中的解决方案;它们可以通过命令行使用。优选地,解决方案磁盘空间绑定而不是内存限制(例如,而不是Redis),并且应该将索引写入磁盘,以便后续启动时间为低。

我发现的大多数解决方案(例如the ones here)的问题在于它们太聪明了。即,它们应用不同类型的词干或规范化,因此匹配不准确。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

我将列出我找到的一些解决方案。

最简单但拟合的是https://github.com/martijnversluis/JsSuffixTrie

然后,更精细,基于散列:https://github.com/fergiemcdowall/search-index

我也可以建议http://redis.io/。它很先进,但仍然很低级。没有太多花哨的包装。

最后,这篇博客文章讨论了javascript中的尝试,问题似乎主要是加载时间:http://ejohn.org/blog/javascript-trie-performance-analysis/

答案 1 :(得分:1)

在我的脑海中,我可以想到两种可能的解决方案。

一种是使用不区分大小写的正则表达式(将您搜索的字符串(例如"C ge")作为正则表达式匹配。

另一种方法是存储所有字符串的所有较低(或较高)的案例副本,并在返回未修改的字符串时使用这些副本进行搜索。当然,搜索字符串需要使所有较低(或较高)的情况起作用。

答案 2 :(得分:1)

当然取决于数据集的大小和最短的响应时间。

对于许多用例,标准Unix工具(如sedgrep)在模式匹配方面是无与伦比的。