gpt4 book ai didi

java - 使用 Lucene 的正则表达式反向搜索

转载 作者:行者123 更新时间:2023-12-03 16:57:33 25 4
gpt4 key购买 nike

假设我存储的 Lucene 文档有一个 regex表示正则表达式的存储字段。
doc.add(new StringField("regex", "\d{3}[A-G]\d{2}[A-G]\d{2}", Store.YES));我的搜索输入类似于 123D56G89 .
有没有办法在我的 TermQuery 中进行反向匹配并获取与给定输入匹配的所有文档?
来自 RDBMS 背景,MariaDB 有 REGEXP为此功能。

最佳答案

如果您想利用搜索索引功能在次线性时间内搜索多个文档,那么 ,根据您问题中提供的信息,没有办法。您必须检查索引中的每个文档并对每个文档的存储表达式进行操作。
正则表达式本质上是一种程序。通常,在无法推理表达式中编码的特定概念的情况下,评估它需要知道完整的表达式,并且引擎必须实际运行它。这意味着通常无法将字段汇总或分类到搜索索引中以加快查找速度。如果你想用N个正则表达式检查一个字符串,你必须一一检查这N个正则表达式并检查它们。那时,搜索索引不会为存储、获取或管理它们提供任何好处。
如果您对“慢速”搜索完全满意,并且您对以这种方式存储任意表达式一无所知,那么从技术上讲 ,您可以实现一种新型查询,将字段视为正则表达式并针对输入运行它。我不会认为这是搜索索引的正常使用,但从技术上讲,该逻辑与任何其他类型的评估一样是可能的。
然而,也许您正试图解决错误的问题。可能有更好的方法来表示您当前尝试存储为正则表达式的概念。如果您可以为匹配设计更具体的“语言”或结构,那么从理论上讲,您可以创建一个分析器,将数据转换为可索引和可​​优化的字段。
示例:也许您只想使用正则表达式根据前缀中的数字数量和字母数量来匹配某些 ID 代码(如 1200ABC000121G021 )。在这种情况下,与其索引正则表达式,不如索引这两个数字:数字计数和前缀中的字母计数。所以如果搜索字符串是 DG56 ,我可能会搜索与查询匹配的文档,例如 numberPrefixWidth:0 letterPrefixWidth:2 .或者搜索字符串 789FGH4 ,我的查询将是 numberPrefixWidth:3 letterPrefixWidth:3 .
因为我们已经简化了文档中实际表示的概念,所以不需要查看每个文档(并且基本上运行一个存储程序)来找到匹配的。我们可以使用 Lucene 来进行快速搜索。
注:此答案也适用于您的 RDBMS 示例。如果你想在 MariaDB 中做一些事情,比如 WHERE someSearch REGEXP theRegexpColumn ,引擎必须运行每一行并对其进行评估。在这样的设计中,没有任何基于索引的优化的潜力。不同之处在于 Lucene 更具有特殊用途,并且没有像 SQL 那样广泛的语言,可以轻松地运行这样的查询,而无需您自己做一些工作。

关于java - 使用 Lucene 的正则表达式反向搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66804694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com