2

我有这个数字提取问题。我想获得所有没有特定数字的匹配,例如:125501874、125001873 每个在位置 2 处为 55 的数字都不被考虑。

第一个数字范围是 0 到 9,第二个数字范围是 1-9,所以实际范围是 [01-99](我们不能将 00 作为前两个数字)

使用 Lucene,我想添加 NOT 字段:[01-99]55*

但这似乎不起作用。有没有一种简单的方法可以找到 ??55* 并在 Search("NOT field:[01-99]55*") 中忽略它?

谢谢Lucene大师

4

2 回答 2

4

如果创建一个只有第三个和第四个数字的“仅索引”字段,Lucene 可以非常有效地做到这一点。完整的值可以在原始字段中“存储”(或者如果其他查询使用整数,则存储和索引)。


更新:后续评论问:“[有] 一种方法可以仅在第二个数字上创建临时索引吗?”

使用ParallelReader“垂直分区”索引的字段。一个分区可以保存当前索引及其字段,而另一个分区是带有新字段的临时索引,可能存储在RAMDirectory.

假设数字“存储”在原始索引中,遍历原始索引中的每个文档,检索存储的字段,解析出关键数字,并Document使用新字段将 a 添加到临时索引中。正如ParallelReader文档所述,两个索引中的文档编号必须匹配。

于 2009-04-20T18:01:18.497 回答
2

谢谢埃里克森,您的解决方案可能是最好的,如果我可以使用临时索引,请使用 ParallelReader,因为我们缓存了搜索查询,我们稍后会需要它们。

但就像你之前说的,最好从相关数字的索引开始。

我有另一个解决方案。

NOT field:0?55*
NOT field:1?55*
...
NOT field:9?55*

它对于我正在做的搜索来说足够有效,它绕过了第一个字符通配符的限制。如果他们有更多的数字要检查,或者他们离开始的地方更远,我不会使用它。现在我正在测试一百万行,它对我们的需求非常有效。

于 2009-04-24T13:30:10.630 回答