2015-09-04 37 views

回答

1

User-Defined Functions Lua寫的擴展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'])