Aerospike按字典顺序限制记录

时间:2015-09-04 12:35:05

标签: aerospike

Aerospike可以通过字典顺序获取记录。例如,如果U想要所有以“a”开头的记录,那么U喜欢搜索bin> =“a”AND bin< =“az”

2 个答案:

答案 0 :(得分:1)

aerospike支持UDF模块(使用LUA和C语言)https://www.aerospike.com/docs/udf/developing_lua_modules.html 这可以满足你的目的。

答案 1 :(得分:1)

用Lua编写的

User-Defined Functions扩展了Aerospike的核心功能。您可以创建stream UDF并将其附加到query

Aerospike中流UDF的一个最佳实践是在将结果传递到UDF之前消除尽可能多的记录,因此在这种情况下,我将创建另一个bin来保存前缀(第一个字母或子字符串,具体取决于你的用例)并在其上构建一个二级索引。我们的想法是,查询部分应尽可能小地返回子集。对于您的示例,前缀可以是单个字符,您可以添加新的bin' firstchar'到集合中的记录,然后build上的二级索引。

流UDF模块看起来像:

local function range_filter(bin_name, substr_from, substr_to)
    return function(record)
        local val = record[bin_name]
        if type(val) ~= 'string' then
            return false
        end
        if val >= substr_from and val <= substr_to then
            return true
        else
            return false
        end
    end
end

local function rec_to_map(record)
    local xrec = map()
    for i, bin_name in ipairs(record.bin_names(record)) do
        xrec[bin_name] = xrec[bin_name]
    end
    return xrec
end


function str_between(stream, bin_name, substr_from, substr_to)
    return stream : filter(range_filter(bin_name, substr_from, substr_to)) : map(rec_to_map)
end

在Python客户端中,您可以按如下方式调用它:

import aerospike
from aerospike import predicates as p

# instantiate the client and connect to the cluster, then:
query = client.query('test', 'this')
query.where(p.equals('firstchar', 'a'))
query.apply('strrangemod', 'str_between', ['a','az'])