如何在Aerospike中获得与正则表达式匹配的所有记录?

时间:2016-04-04 15:38:32

标签: aerospike nosql

我在一组中有数百万条记录。我想检索匹配相同模式的所有记录。

例如我可能有:

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]*

谢谢你的时间。

2 个答案:

答案 0 :(得分:5)

是的,可以做到。您需要首先通过二级索引进行查询,然后首先将结果集缩小到可管理的大小,然后使用Lua编写过滤器,过滤掉您不想要的过滤器。此过滤器可以使用您要匹配的正则表达式(动态传入)并仅返回匹配的记录。

虽然这可行,但它不会像Aerospike中的键值操作一样高效。在将其投入生产之前,您肯定希望对此类解决方案进行基准测试。

答案 1 :(得分:2)

3月15日在Predicate filtering中添加了

release 3.12。您可以使用Java客户端的stringRegex类的PredExp方法来构建复杂的过滤器,例如你提到过。它目前也适用于CC#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类定义了您可以使用的正则表达式,以及它们的行为方式。