Riak中不安全的URL二级索引名称不起作用

Riak中不安全的URL二级索引名称不起作用,riak,Riak,我正在使用Riak 1.3.1并试图创建一个二进制索引名索引字段名@$@$@$非url安全。我能够使用此索引成功保存密钥 当我直接使用键值查询此键时,结果是: {“indexedFieldValue”:“index@$value”,“keyValue”:“093741d5-940a-49a6-b742-be22c1773e87”,“indexes”:{“索引字段名@$@$@$not url safe”#@!:“index@$value”} 现在,当我尝试使用URL/index/index+字

我正在使用Riak 1.3.1并试图创建一个二进制索引名
索引字段名@$@$@$非url安全。我能够使用此索引成功保存密钥

当我直接使用键值查询此键时,结果是:


{“indexedFieldValue”:“index@$value”,“keyValue”:“093741d5-940a-49a6-b742-be22c1773e87”,“indexes”:{“索引字段名@$@$@$not url safe”#@!:“index@$value”}

现在,当我尝试使用URL
/index/index+字段+名称+%40%24%40%40+%40%24+非+URL+safe%23%40%21\u bin/value
使用此索引进行查询时,我完全没有收到任何响应:
{“键”:[]}

  • 我做错什么了,还是
  • Riak不支持需要URL编码的索引名吗
注意:我使用Riak Java客户机来编写数据(在使用Java客户机通过二级索引进行查询时得到相同的结果),但我看不出Java客户机与此有什么关系


谢谢

今早看看,是的。。。HTTP API和URL编码的索引名和索引值存在问题

问题在于:标题名称和值是未解码的URL,并在发布时按原样存储,但当发出GET请求时,URL的层次结构部分(包含索引名称和值)被解码。此外,这两种语言中的
+
而不是
%20
是一个问题

如果您使用
%20
和URL转义GET,它实际上是有效的(注意:我用
%A3
替换了
):

然后

结果:

{“密钥”:[“我的密钥”]}

另一方面,协议缓冲区没有遇到这些问题。如果要将Java客户机与协议缓冲区一起使用,那么以下操作可以正常工作(注意,客户机不会像对键和存储桶那样自动对索引参数进行url编码):

IRiakClient=RiakFactory.pbcClient();
Bucket b=client.fetchBucket(“test_Bucket”).execute();
String s=“索引字段名@$@$@$不是url安全的!”;
字符串s2=URLEncoder.encode(s,“UTF-8”);
系统输出打印LN(s2);
String v=“index@$value”;
字符串v2=URLEncoder.encode(v,“UTF-8”);
系统输出打印项次(v2);
IRiakObject ro=RiakObjectBuilder.newBuilder(“测试桶”、“键”)
.addIndex(s2,v2)
.withValue(“某些值”)
.build();
b、 store(ro.execute();
列表索引=b.fetchIndex(BinIndex.named(s2))
.withValue(v2)
.execute();
系统输出打印项次(索引);
client.shutdown();
输出:

索引+字段+名称+%40%24%40%24%40+%40%24+非+url+安全%23%40%C2%A3%21
索引+%40%24+值
[关键]

事实上,协议缓冲区根本不需要URL编码。。。它将发送UTF8字节,并愉快地将它们用作索引名和值。您可以从上面的示例中删除URL编码,并查看它是否有效

不幸的是,如果您试图在其他地方使用HTTP,这肯定会有问题。因为java附带的
urlcoder
类使用
+
,所以使用另一个使用
%20
(或执行
String.replaceAll()
)的URL编码器会有所帮助,但您仍然需要处理通过HTTP查询转义的URL

归根结底,如果使用HTTP API,带有2i的非US-ASCII(或特殊字符)是有问题的

更新:我决定这将很容易修复,并且有一个PR:-最后讨论了一个问题,因此可能需要额外的工作。我们目前将冻结riak 1.4的代码,因此在下一版本之前可能无法使用

curl -X POST -H 'x-riak-index-Indexed%20field%20name%20%40%24%40%24%40%20%40%24%20not%20url%20safe%23%40%C2%A3%21_bin: index%20%40%24%20value' -d 'Some Value' http://localhost:8098/buckets/test_bucket/keys/my_key
curl localhost:8098/buckets/test_bucket/index/Indexed%2520field%2520name%2520%2540%2524%2540%2524%2540%2520%2540%2524%2520not%2520url%2520safe%2523%2540%25C2%25A3%2521_bin/index%2520%2540%2524%2520value
IRiakClient client = RiakFactory.pbcClient();
Bucket b = client.fetchBucket("test_bucket").execute();

String s = "Indexed field name @$@$@ @$ not url safe#@£!";
String s2 = URLEncoder.encode(s, "UTF-8");
System.out.println(s2);
String v = "index @$ value";
String v2 = URLEncoder.encode(v, "UTF-8");
System.out.println(v2);

IRiakObject ro = RiakObjectBuilder.newBuilder("test_bucket", "key")
                  .addIndex(s2, v2)
                  .withValue("Some value")
                  .build();

b.store(ro).execute();

List<String> index = b.fetchIndex(BinIndex.named(s2))
                      .withValue(v2)
                      .execute();

System.out.println(index);

client.shutdown();