我在一组中有数百万条记录。我想检索匹配相同模式的所有记录。
例如我可能有:
id=4444?mode=mode1?fieldA=abc
id=4444?mode=mode1?fieldA=azerty
id=4444?mode=mode1?fieldA=qwerty
id=4444?mode=mode1?fieldA=foo
id=4444?mode=mode1?fieldA=bar
是否可以在不事先知道fieldA
的值的情况下进行查询以获取所有上述记录?正则表达式中的这样的东西:
id=4444?mode=mode1?fieldA=[\w]*
谢谢你的时间。
答案 0 :(得分:5)
是的,可以做到。您需要首先通过二级索引进行查询,然后首先将结果集缩小到可管理的大小,然后使用Lua编写过滤器,过滤掉您不想要的过滤器。此过滤器可以使用您要匹配的正则表达式(动态传入)并仅返回匹配的记录。
虽然这可行,但它不会像Aerospike中的键值操作一样高效。在将其投入生产之前,您肯定希望对此类解决方案进行基准测试。
答案 1 :(得分:2)
release 3.12。您可以使用Java客户端的stringRegex类的PredExp方法来构建复杂的过滤器,例如你提到过。它目前也适用于C,C#和Go个客户。
Aerospike Java客户端中有一个similar example:
Statement stmt = new Statement();
stmt.setNamespace(params.namespace);
stmt.setSetName(params.set);
stmt.setFilter(Filter.range(binName, begin, end));
stmt.setPredExp(
PredExp.stringBin("bin3"),
PredExp.stringValue("prefix.*suffix"),
PredExp.stringRegex(RegexFlag.ICASE | RegexFlag.NEWLINE)
);
com.aerospike.client.query中的RegexFlag类定义了您可以使用的正则表达式,以及它们的行为方式。