【发布时间】:2012-02-16 22:54:54
【问题描述】:
有谁知道索引正则表达式的方法,这样我就可以运行非正则表达式查询,匹配其中包含正则表达式字段的文档?最好使用 Lucene 或其他进程内 Java 库。
背景
我在一个项目中工作,我们希望对大量用户交易进行分类。我们现在有工具可以做到这一点,但我们需要优化。
目前我正在探索 lucene 来替换一个内存排序树,该树是在父子关系中使用 HashMap、ConcurrentSkipListSets 实现的。
a -> category cat1
1 -> category cat2
b -> category cat4
\w*
6 -> category cat5
所以字符串 'a 1' 和 'a 1 zx y' 将匹配 'cat2', 'a' 将匹配 'cat1',而 'bxy 6' 将匹配 'cat5'。所有规则的末尾都有一个隐含的 '.*',如果没有正则表达式匹配就可以进行匹配,那么它是首选的。这些规则是根据属性列表构建的:
a = cat1
a 1 = cat2
b = cat4
b \w* 6 = cat5
我们现在正在推送 50k 条规则(并且还在增加),虽然这个过程在查找时非常快,但它使用了太多的 RAM,需要一些时间来构建,并且没有我们需要的那么灵活。
我已经尝试使用 Lucene 来索引这些规则,但是我遇到了麻烦,因为正则表达式匹配了很多常用词(在我们的域中),并且为这些构建停用词并不容易,因为它们也经常变化.
所以重申一下 - 我需要一种方法来搜索正则表达式被索引的文档,而查询根本不知道正则表达式。
有人吗?
-- 奥尔夫
【问题讨论】:
-
我的例子中的字母和数字当然不代表现实世界的价值。
-
为什么不直接转义查询中的特殊字符? lucene.apache.org/java/3_5_0/queryparsersyntax.html#Escaping特殊字符
-
当我输入查询如上所说的 'bxy 6' 时,我不知道在查询时 'x y' 会匹配规则 'b \w 6' 的正则表达式部分。我希望匹配尽可能类似于查询字符串,但在索引中使用正则表达式(以及最后的隐式 '.*' )。
标签: java regex search lucene indexing