我正在使用自定义 Elasticsearch 插件在 Java 中尝试 RoaringBitMaps,并且
rBitmap.contains(1111)
效果非常好。
现在,如果我这样做
rBitmap.contains([1111,2222,3333])
,将无法按预期工作。
我期望的是
OR
,但事实并非如此。
将 RoaringBitMap 与数组进行比较的最有效方法是什么?我缺少什么方法吗?
我将尝试一个 forloop,当它发现包含重合时停止,并将数组转换为 RoaringMap,然后运行基数函数。
我使用Java(这是一个自定义的Elasticsearch插件),试图找到类似于pyroaring的东西isdisjoint
这是插件中实现RoaringBitmap的部分
@Override
public LeafFactory newFactory(
Map<String, Object> params,
SearchLookup lookup
) {
final byte[] decodedTerms = Base64.getDecoder().decode(params.get("terms").toString());
final ByteBuffer buffer = ByteBuffer.wrap(decodedTerms);
RoaringBitmap rBitmap = new RoaringBitmap();
try {
rBitmap.deserialize(buffer);
}
catch (IOException e) {
// Do something here
}
return new FastFilterLeafFactory(params, lookup, rBitmap);
}
}
@Override
public boolean execute() {
final int docVal;
try {
docVal = Math.toIntExact(docValues.nextValue());
} catch (IOException e) {
throw ExceptionsHelper.convertToElastic(e);
}
if (exclude && rBitmap.contains(docVal)) {
return false;
}
else return !include || rBitmap.contains(docVal);
}
谢谢
从你的代码 -
rBitmap.contains([1111,2222,3333])
这将检查输入数组是否是
rBitMap
的子集,而这不是您要寻找的。
如果您正在寻找一种方法来检查两个咆哮位图是否相交,您可以使用
intersects
定义的方法here -
public static boolean intersects(final RoaringBitmap x1, final RoaringBitmap x2)
如果您正在寻找一个使用 RoaringBitmap 实现来检查两个大整数列表(一个存储在 elasticsearch 中,另一个作为查询中的过滤器参数传递给 elasticsearch)是否相交的弹性搜索插件,你可以使用这个插件 - https://github.com/tata1mg/fastmatch-elasticsearch-plugin