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

Node.js或C不区分大小写,精确的子字符串匹配/索引(无全文搜索),c,node.js,search,indexing,full-text-search,C,Node.js,Search,Indexing,Full Text Search,哪些库在Node.js中提供了对大量字符串的不区分大小写的精确子字符串匹配?我特别寻找基于索引的解决方案 作为一个例子,考虑一个语料库由数百万个字符串组成: “Abc全球环境基金gHi” “Def Ghi xYz” 我需要一个库,这样搜索“cge”会返回上面的第一个字符串,但搜索“cge”(注意多个空格)不会返回。在单词排序方面,我不是在寻找模糊的、智能的、带有词干和停止词的全文搜索;更确切地说,是最简单(和快速)的精确子串匹配器,其索引可以大规模工作 JavaScript中的解决方案是受

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

作为一个例子,考虑一个语料库由数百万个字符串组成:

  • “Abc全球环境基金gHi”
  • “Def Ghi xYz”
我需要一个库,这样搜索
“cge”
会返回上面的第一个字符串,但搜索
“cge”
(注意多个空格)不会返回。在单词排序方面,我不是在寻找模糊的、智能的、带有词干和停止词的全文搜索;更确切地说,是最简单(和快速)的精确子串匹配器,其索引可以大规模工作

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

我发现的大多数解决方案(例如)的问题是它们太聪明了。也就是说,它们应用不同类型的词干或规范化,因此匹配不精确


提前感谢您的帮助

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

一种是使用不区分大小写的正则表达式(将您搜索的字符串(例如,
“cge”
)作为正则表达式)进行匹配


另一种方法是存储所有字符串的全小写(或大写)副本,并在返回未修改的字符串时使用这些副本进行搜索。当然,搜索字符串需要全部小写(或大写)才能工作。

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

一种是使用不区分大小写的正则表达式(将您搜索的字符串(例如,
“cge”
)作为正则表达式)进行匹配


另一种方法是存储所有字符串的全小写(或大写)副本,并在返回未修改的字符串时使用这些副本进行搜索。当然,搜索字符串必须全部用小写(或大写)才能工作。

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

最简单但最合适的是

然后,更详细、基于哈希的:

我也可以建议。这是先进的,但仍然是相当低的水平。没有太多花哨的包装


最后,这篇博文讨论了javascript中的尝试,问题似乎主要是加载时间:

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

最简单但最合适的是

然后,更详细、基于哈希的:

我也可以建议。这是先进的,但仍然是相当低的水平。没有太多花哨的包装


最后,这篇博文讨论了javascript中的尝试,其中的问题似乎主要是加载时间:

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


对于许多用例来说,标准Unix工具,如
sed
grep
在模式匹配方面是无与伦比的。

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


对于许多用例来说,标准的Unix工具,如
sed
grep
在模式匹配方面是无与伦比的。

嗨,Joachim,恐怕这样的解决方案不够快。在一百万个字符串上执行正则表达式(或者在规范化的情况下执行精确的子字符串搜索)是不可伸缩的。我真的需要一个基于索引的解决方案,例如,使用n-gram或其他东西。我的问题是是否有这样做的库(我将进一步澄清)。@RubenVerborgh关于规范化,您只需要做一次。有两个集合,一个包含原始字符串,另一个包含规范化字符串,其中集合中两个的索引相同。如果您搜索的子字符串很小,那么规范化该子字符串的开销很可能可以忽略不计;那很好。我担心的是搜索策略。根据您的建议,每次搜索都需要检查数百万个字符串;即使只是精确的比较,这仍然是O(n),其中n是语料库中字符串的数量。@RubenVerborgh如果你有很多内存,你可以使用多个?当然可以。:)嗨,Joachim,恐怕这样的解决方案还不够快。在一百万个字符串上执行正则表达式(或者在规范化的情况下执行精确的子字符串搜索)是不可伸缩的。我真的需要一个基于索引的解决方案,例如,使用n-gram或其他东西。我的问题是是否有这样做的库(我将进一步澄清)。@RubenVerborgh关于规范化,您只需要做一次。有两个集合,一个包含原始字符串,另一个包含规范化字符串,其中集合中两个的索引相同。如果您搜索的子字符串很小,那么规范化该子字符串的开销很可能可以忽略不计;那很好。我担心的是搜索策略。根据您的建议,每次搜索都需要检查数百万个字符串;即使只是精确的比较,这仍然是O(n),其中n是语料库中字符串的数量。@RubenVerborgh如果你有很多内存,你可以使用多个?当然可以。:)