Riak 搜索 CRDT 数据类型 - 内存后端
Riak search on CRDT data types - memory backend
我正在使用 riak2.2.3,并尝试在地图桶类型中进行搜索,但没有返回任何内容。
我在内存后端配置了一个存储桶类型"dist_cache":
# riak-admin bucket-type status dist_cache
dist_cache is active
active: true
allow_mult: true
backend: <<"memory_mult">>
basic_quorum: false
big_vclock: 50
chash_keyfun: {riak_core_util,chash_std_keyfun}
claimant: 'riak@127.0.0.1'
datatype: map
dvv_enabled: true
dw: quorum
last_write_wins: false
linkfun: {modfun,riak_kv_wm_link_walker,mapreduce_linkfun}
n_val: 3
notfound_ok: true
old_vclock: 86400
postcommit: []
pr: 0
precommit: []
pw: 0
r: quorum
rw: quorum
search_index: <<"expirable_token">>
small_vclock: 50
w: quorum
young_vclock: 20
然后我在 /etc/riak/:
中启用搜索
search = on
然后我配置了一个索引,使用默认架构并将其与存储桶类型相关联(见上文)。
我可以使用键在该存储桶中成功存储和检索值。我在寄存器中存储了 3 个值:二进制数据、整数(时间戳)和一个字符串:
[
{{"attrs", :register}, <<131, 97, 111>>},
{{"iat_i", :register}, "1540923453"},
{{"test_s", :register}, "paul"}
]
(使用 Elixir 的 Riak 库从 Elixir shell 格式化后显示。)
但是,当我尝试搜索这些值时没有找到任何内容:
iex(74)> :riakc_pb_socket.search(pid, "expirable_token", "iat_i:[0 TO *]")
{:ok, {:search_results, [], 0.0, 0}}
iex(75)> :riakc_pb_socket.search(pid, "expirable_token", "iat_i:1540923453")
{:ok, {:search_results, [], 0.0, 0}}
iex(76)> :riakc_pb_socket.search(pid, "expirable_token", "test_s:paul")
{:ok, {:search_results, [], 0.0, 0}}
iex(77)> :riakc_pb_socket.search(pid, "expirable_token", "test_s:*")
{:ok, {:search_results, [], 0.0, 0}}
此外,/var/log/riak/solr.log 没有显示这些请求的任何错误消息。
我错过了什么吗?
我需要从 java 启动选项中删除一些选项,但现在似乎 java 已启动并且 运行 和 solr.log 在尝试格式错误的请求时确实显示错误消息。
编辑:
尝试@vempo 的解决方案后:
我已经在该字段后缀_register,但它仍然不起作用。该字段是这样的:
iex(12)> APISexAuthBearerCacheRiak.get("ddd", opts)
[
{{"attrs", :register}, <<131, 98, 0, 0, 1, 188>>},
{{"iat_i", :register}, "1542217847"},
{{"test_flag", :flag}, true},
{{"test_register", :register}, "pierre"}
]
但搜索请求仍然returns没有结果:
iex(15)> :riakc_pb_socket.search(pid, "expirable_token", "test_register:*")
{:ok, {:search_results, [], 0.0, 0}}
iex(16)> :riakc_pb_socket.search(pid, "expirable_token", "test_register:pierre")
{:ok, {:search_results, [], 0.0, 0}}
iex(17)> :riakc_pb_socket.search(pid, "expirable_token", "test_register:*")
{:ok, {:search_results, [], 0.0, 0}}
iex(18)> :riakc_pb_socket.search(pid, "expirable_token", "test_flag:true")
{:ok, {:search_results, [], 0.0, 0}}
iex(19)> :riakc_pb_socket.search(pid, "expirable_token", "test_flag:*")
仍然知道 /var/log/riak/solr.log 中的输出,并且索引似乎正确设置:
iex(14)> :riakc_pb_socket.list_search_indexes(pid)
{:ok,
[
[index: "expirable_token", schema: "_yz_default", n_val: 3],
[index: "famous", schema: "_yz_default", n_val: 3]
]}
在地图内搜索的规则不同。根据 Searching with Data Types,地图有四种模式,每种模式对应一种:
- *_flag
- *_counter
- *_注册
- *_set
所以在您的情况下,您应该搜索 attrs_register
、iat_i_register
和 test_s_register
。
作为旁注,后缀 _s
和 _i
可能是多余的。默认模式使用它们来决定常规字段的类型,但对嵌入式数据类型无用)。
更新
总结规则:
- 名为
test
的标志字段将被索引为test_flag
(查询test_flag:*
)
- 名为
test
的寄存器字段将被索引为test_register
(查询test_register:*
)
- 名为
test
的计数器字段将被索引为 test_counter
(查询 test_counter:*
)
- 名为
test
的集合字段将被索引为 test_set
(查询 test_set:*
)
Searching with Data Types: Embedded Schemas 中的 table 很好地展示了这一点。
另请参阅 default schema 部分 <!-- Riak datatypes embedded fields -->
中嵌入数据类型的动态字段定义。
我正在使用 riak2.2.3,并尝试在地图桶类型中进行搜索,但没有返回任何内容。
我在内存后端配置了一个存储桶类型"dist_cache":
# riak-admin bucket-type status dist_cache
dist_cache is active
active: true
allow_mult: true
backend: <<"memory_mult">>
basic_quorum: false
big_vclock: 50
chash_keyfun: {riak_core_util,chash_std_keyfun}
claimant: 'riak@127.0.0.1'
datatype: map
dvv_enabled: true
dw: quorum
last_write_wins: false
linkfun: {modfun,riak_kv_wm_link_walker,mapreduce_linkfun}
n_val: 3
notfound_ok: true
old_vclock: 86400
postcommit: []
pr: 0
precommit: []
pw: 0
r: quorum
rw: quorum
search_index: <<"expirable_token">>
small_vclock: 50
w: quorum
young_vclock: 20
然后我在 /etc/riak/:
中启用搜索search = on
然后我配置了一个索引,使用默认架构并将其与存储桶类型相关联(见上文)。
我可以使用键在该存储桶中成功存储和检索值。我在寄存器中存储了 3 个值:二进制数据、整数(时间戳)和一个字符串:
[
{{"attrs", :register}, <<131, 97, 111>>},
{{"iat_i", :register}, "1540923453"},
{{"test_s", :register}, "paul"}
]
(使用 Elixir 的 Riak 库从 Elixir shell 格式化后显示。)
但是,当我尝试搜索这些值时没有找到任何内容:
iex(74)> :riakc_pb_socket.search(pid, "expirable_token", "iat_i:[0 TO *]")
{:ok, {:search_results, [], 0.0, 0}}
iex(75)> :riakc_pb_socket.search(pid, "expirable_token", "iat_i:1540923453")
{:ok, {:search_results, [], 0.0, 0}}
iex(76)> :riakc_pb_socket.search(pid, "expirable_token", "test_s:paul")
{:ok, {:search_results, [], 0.0, 0}}
iex(77)> :riakc_pb_socket.search(pid, "expirable_token", "test_s:*")
{:ok, {:search_results, [], 0.0, 0}}
此外,/var/log/riak/solr.log 没有显示这些请求的任何错误消息。
我错过了什么吗? 我需要从 java 启动选项中删除一些选项,但现在似乎 java 已启动并且 运行 和 solr.log 在尝试格式错误的请求时确实显示错误消息。
编辑:
尝试@vempo 的解决方案后:
我已经在该字段后缀_register,但它仍然不起作用。该字段是这样的:
iex(12)> APISexAuthBearerCacheRiak.get("ddd", opts)
[
{{"attrs", :register}, <<131, 98, 0, 0, 1, 188>>},
{{"iat_i", :register}, "1542217847"},
{{"test_flag", :flag}, true},
{{"test_register", :register}, "pierre"}
]
但搜索请求仍然returns没有结果:
iex(15)> :riakc_pb_socket.search(pid, "expirable_token", "test_register:*")
{:ok, {:search_results, [], 0.0, 0}}
iex(16)> :riakc_pb_socket.search(pid, "expirable_token", "test_register:pierre")
{:ok, {:search_results, [], 0.0, 0}}
iex(17)> :riakc_pb_socket.search(pid, "expirable_token", "test_register:*")
{:ok, {:search_results, [], 0.0, 0}}
iex(18)> :riakc_pb_socket.search(pid, "expirable_token", "test_flag:true")
{:ok, {:search_results, [], 0.0, 0}}
iex(19)> :riakc_pb_socket.search(pid, "expirable_token", "test_flag:*")
仍然知道 /var/log/riak/solr.log 中的输出,并且索引似乎正确设置:
iex(14)> :riakc_pb_socket.list_search_indexes(pid)
{:ok,
[
[index: "expirable_token", schema: "_yz_default", n_val: 3],
[index: "famous", schema: "_yz_default", n_val: 3]
]}
在地图内搜索的规则不同。根据 Searching with Data Types,地图有四种模式,每种模式对应一种:
- *_flag
- *_counter
- *_注册
- *_set
所以在您的情况下,您应该搜索 attrs_register
、iat_i_register
和 test_s_register
。
作为旁注,后缀 _s
和 _i
可能是多余的。默认模式使用它们来决定常规字段的类型,但对嵌入式数据类型无用)。
更新
总结规则:
- 名为
test
的标志字段将被索引为test_flag
(查询test_flag:*
) - 名为
test
的寄存器字段将被索引为test_register
(查询test_register:*
) - 名为
test
的计数器字段将被索引为test_counter
(查询test_counter:*
) - 名为
test
的集合字段将被索引为test_set
(查询test_set:*
)
Searching with Data Types: Embedded Schemas 中的 table 很好地展示了这一点。
另请参阅 default schema 部分 <!-- Riak datatypes embedded fields -->
中嵌入数据类型的动态字段定义。