使用多个过滤器参数进行Aerospike查询

我正在尝试使用多个过滤器查询气溶胶,参考了这个链接

我可以使用给定的lua脚本基于1个过滤器参数查询气溶胶,但是当必须传递超过2个过滤器参数时(例如通过密码传递两个更多的参数,如年龄,性别),我陷入了lua脚本的困境。

这是我第一次用lua。

Lua脚本:

local function map_profile(record)
 return map {name=record.name, password=record.password}
end
function check_password(stream,password)
 local function filter_password(record)
   return record.password == password
 end
 return stream : filter(filter_password) : map(map_profile)
end

提前致谢。

点赞
用户582436
用户582436

filter函数可以拥有额外的参数并返回一个closure,这个closure可以访问这些参数,同时仍然符合参数为一条记录并返回布尔值的预期stub。

local function filter_password(password)
  return function(rec)
    if rec['password'] and (type(rec['password']) == 'string') and
       rec['password'] == password then
      return true
    end
    return false
  end
end

local function map_profile(record)
  return map {name=record.name, password=record.password}
end

function check_password(stream,password)
  return stream : filter(filter_password(password)) : map(map_profile)
end

然而,现在查询或扫描多重过滤器的最佳方法(自从3.12版本以来)是使用谓词过滤器。在大多数情况下(除非您需要以某种方式比较两个记录Bin的值),您将跳过UDF并使用PredExp类(在Java客户端中或其等效物)。 您将只返回与过滤器匹配的记录,而不管您构建了多么复杂的表达式。请参阅Aerospike Java客户端中的示例,或CC#Go客户端。

2015-12-09 18:40:37
用户5084355
用户5084355

我们开发了Aerospike的SQL包装器,它可以从您的SQL查询构建LUA代码。这可能对您有所帮助。

2015-12-11 12:08:40