阅读文档对我没什么帮助。
1)据我所知,在一个查询中无法使用多个过滤器。如果是这样,如何使用Aerospike java客户端API,我写如查询:
SELECT * FROM TABLE_NAME WHERE COLUMN1 = 1 AND COLUMN2 = 2
2)如果没有可能为此目的使用JAVA CLIENT API,我是否必须编写自己的UDF来过滤数据?
3)如果我编写自己的UDF(过滤数据),它是否会很快或者我应该使用二级索引以使其执行更快?
答案 0 :(得分:1)
严格地说,您无法直接从您列出的多重过滤查询的等效实现中获取一组记录。但是有一个回合的方式。您可以在column1上创建SI(二级索引)以获取第一个记录子集,将该记录集提供给流udf,您只能读取记录,按列2过滤它们,返回返回值的映射。在UDF中,您无法返回记录或记录集或流子集。但是,如果将记录密钥存储为每个记录中的bin,则可以返回密钥映射,然后可以访问应用程序中的该记录子集。
答案 1 :(得分:1)
release 3.12。您可以使用Java客户端的PredExp类来构建复杂的过滤器,例如您提到的过滤器。它目前也适用于C,C#和Go个客户。
谓词过滤可用于根据需要构建过滤逻辑的复合体,并且可以本机执行,而不是通过UDF执行。如果需要,您可以将记录UDF应用于您的过滤器匹配的任何记录。如果您只是尝试获取符合特定复杂谓词条件的所有记录,请不要使用UDF,只需使用谓词过滤器本身。
谓词过滤器可以在二级索引之上运行得更快,但这不是必需的。如果没有它,它将针对返回命名空间/集合中所有记录的扫描运行,将过滤器应用于每个记录。如果您有二级索引,请确保命令WHERE子句使用它。由于目前没有服务器端查询优化器,您应该通过考虑谓词的顺序来手动优化查询。
例如,假设您有一组用户,其中包含性别,年龄和名称,其中前两个已编入索引,并且正在寻找35到44之间的所有女性用户,其名称以' S'开头。您希望set the Filter Statement使用返回查询中最少记录的索引。在这种情况下,使用 age 上的索引将返回的记录少于 gender ,并且执行速度更快。在PredExp中,您还希望命令谓词短路并尽快跳过匹配的记录。在这种情况下,您可能希望在 name 上更昂贵的字符串正则表达式之前比较 gender bin值。