SQL Tarantool 中的 LIKE 查询
SQL LIKE query in Tarantool
在 Tarantool DB 中使用 SQL LIKE 关键字进行查询的正确方法是什么?
例如:
SELECT * FROM space where smth LIKE '%some_value%';
我可以使用索引的一部分来搜索值,还是我需要为此类功能编写自己的 LUA 脚本?
是的,您应该编写 Lua 脚本,它将遍历 space 并在元组的 'smth'
字段上使用 lua 函数 gsub
。
目前无法搜索字符串的一部分。
使用存储过程进行优化 prefix-based 搜索。
例如,此代码段也适用于西里尔文字:
box.schema.create_space('address')
box.space.address:create_index('prefix', { type = 'tree', parts = { { 1, 'str', collation = 'unicode_ci' } }, unique = true })
select_by_prefix = function(prefix)
local result = {}
for _, addr in box.space.address.index.prefix:pairs(prefix, { iterator = 'GT' }) do
if utf.casecmp(utf.sub(addr[1], 1, utf.len(prefix)), prefix) == 0 then
table.insert(result, addr)
else
break
end
end
return result
end
如果您使用 tarantool 版本 2.x,您的查询没有任何问题。
SELECT * FROM "your_space" WHERE "smth" LIKE '%some_value%';
在 Tarantool DB 中使用 SQL LIKE 关键字进行查询的正确方法是什么? 例如:
SELECT * FROM space where smth LIKE '%some_value%';
我可以使用索引的一部分来搜索值,还是我需要为此类功能编写自己的 LUA 脚本?
是的,您应该编写 Lua 脚本,它将遍历 space 并在元组的 'smth'
字段上使用 lua 函数 gsub
。
目前无法搜索字符串的一部分。
使用存储过程进行优化 prefix-based 搜索。 例如,此代码段也适用于西里尔文字:
box.schema.create_space('address')
box.space.address:create_index('prefix', { type = 'tree', parts = { { 1, 'str', collation = 'unicode_ci' } }, unique = true })
select_by_prefix = function(prefix)
local result = {}
for _, addr in box.space.address.index.prefix:pairs(prefix, { iterator = 'GT' }) do
if utf.casecmp(utf.sub(addr[1], 1, utf.len(prefix)), prefix) == 0 then
table.insert(result, addr)
else
break
end
end
return result
end
如果您使用 tarantool 版本 2.x,您的查询没有任何问题。
SELECT * FROM "your_space" WHERE "smth" LIKE '%some_value%';