当前位置: 首页 > 知识库问答 >
问题:

使用Lucene进行Regex反向搜索

章安易
2023-03-14

假设我存储的Lucene文档有一个表示正则表达式的regex存储字段。

doc.add(new StringField(“regex”,“\d{3}[A-G]\d{2}[A-G]\d{2}”,store.yes));

我的搜索输入类似于123d56g89

共有1个答案

卫松
2023-03-14

如果您想利用搜索索引功能在次线性时间内搜索许多文档,那么不,根据您问题中给出的信息,没有办法。您必须检查索引中的每个文档,并对每个文档存储的表达式执行操作。

正则表达式本质上是一种程序类型。通常,由于无法推理表达式中编码的特定概念,因此计算它需要知道完整的表达式,并且引擎必须实际运行它。这意味着没有办法将字段概括或归类到搜索索引中以加快查找速度。如果希望对照N个正则表达式检查一个字符串,则必须逐一检查这N个正则表达式并检查它们。在这一点上,搜索索引不能为存储、获取或管理它们提供任何好处。

如果您完全不喜欢“慢速”搜索,并且不喜欢用这种方式存储任意表达式,那么从技术上讲,您可以实现一种新的查询类型,将字段视为正则表达式,并针对输入运行它。我不认为这是搜索索引的正常使用,但这种逻辑在技术上与任何其他类型的评估一样可能。

示例:也许您只想使用正则表达式根据前缀中的数字个数和字母个数匹配某些ID代码(如1200abc000121g021)。在这种情况下,与其索引正则表达式,更好的方法是索引这两个数字:数字计数和前缀中的字母计数。因此,如果搜索字符串为DG56,我可能会搜索与查询匹配的文档,如numberprefixwidth:0letterprefixwidth:2。或者对于搜索字符串789FGH4,我的查询是numberprefixwidth:3letterprefixwidth:3

因为我们已经简化了文档中实际表示的概念,所以不需要查看每一个文档(基本上运行一个存储程序)来查找匹配的文档。我们可以使用Lucene进行快速搜索。

注意:这个答案也适用于您的RDBMS示例。如果您试图在MariaDB中做一些事情,比如,其中someSearch REGEXP theregexpcolumn,引擎必须遍历每一行并对其进行计算。在这样的设计中,没有任何基于索引的优化的潜力。不同之处在于,Lucene的用途更加特殊,没有像SQL那样宽泛的语言来轻松地运行这样的查询,而无需自己做一些工作。

 类似资料:
  • 供参考:我的代码和这个so帖子非常相似。 谢谢

  • 问题内容: 我有一个包含多个字段的索引,其中一个是字符串字段,我在其中存储产品的类别名称…例如“电子”,“家庭”,“花园”等 我正在执行布尔查询以按名称,价格和类别查找产品,但是我不确定如何执行“或”搜索,以便可以同时查询两个类别。 我当前的查询如下所示: 这对于一个类别的搜索来说效果很好,但是我不确定如何搜索将是两个类别的“ Electronics OR Home”。 问题答案: 您可以这样写:

  • 在这里,我可以搜索python。 我希望放置负模式,实际上应该不会产生任何结果或不匹配。 当字符串包含python但字符串“在python上工作很容易”中不包含容易时,我喜欢使用re.search。我该怎么做?同时使用正负条件。

  • 我在建立一个简单的地址数据库。有一个名为的类,其中的地址被分解为字段(street、city、state、ZIP)。每个字段都是字符串类型。 我想能够搜索地址中的任何一个字。例如:查找地址,无论搜索的词是在街道名称或城市名称等。换句话说,我希望用户能够轻松搜索,而不必指定他们感兴趣的地址的哪一部分。 但是当我执行以下查询时,我不会得到结果或错误消息: =>没有结果,应该是2条邮政编码为46250和

  • 我在使用Lucene.NET 3.0.3时遇到以下问题。 我的搜索查询如下所示: 手动生成的搜索查询:(+*test*+*und*+*produktivumgebung*) 解析的搜索查询:+(标题:*test*)+(标题:*und*)+(标题:*produktivumgebung*) 为什么我找不到搜索“test-und produktivumgebung”的文档?

  • 用git grep 命令查找Git库里面的某段文字是很方便的. 当然, 你也可以用unix下的'grep'命令进行搜索, 但是'git grep'命令能让你不用签出(checkout)历史文件, 就能查找它们. 例如, 你要看 git.git 这个仓库里每个使用'xmmap'函数的地方, 你可以运行下面的命令: $ git grep xmmap config.c: co