【问题标题】:Riak search on CRDT data types - memory backendRiak 搜索 CRDT 数据类型 - 内存后端
【发布时间】:2018-10-30 19:10:44
【问题描述】:

我正在使用 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"}
]

但搜索请求仍然没有返回结果:

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]
 ]}

【问题讨论】:

  • 很遗憾,您误解了我的回答。我向您展示了根据您的特定示例,您的搜索查询应该是什么样子。例如。 “attrs”将被索引为“attrs_register”。因此,如果您的查询是“test_register:*”,那么该字段必须命名为“test”而不是“test_register”。
  • 确实误会了,感谢详细的解释。昨天没有用,但重试了,现在可以了。哇!很快会问另一个关于管理内存缓存和过期键的问题

标签: riak riak-search riak-kv


【解决方案1】:

在地图中搜索的规则是不同的。根据Searching with Data Types,地图有四种模式,每种嵌入类型一种:

  • *_flag
  • *_counter
  • *_register
  • *_set

因此,在您的情况下,您应该搜索 attrs_registeriat_i_registertest_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 中的表格很好地显示了这一点。

另请参阅default schema&lt;!-- Riak datatypes embedded fields --&gt; 部分中嵌入数据类型的动态字段的定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    相关资源
    最近更新 更多