使用非法字符启用Elasticsearch索引名称

时间:2015-12-04 01:54:58

标签: regex elasticsearch

我正在尝试使用xxx/yyyxxx yyy这样的字符串创建弹性搜索索引,但不允许这些索引,因为它们包含非法字符(/)。这些名称主要是用户创建的并且不受我的控制,因此为了适应elasticsearch的要求而更改名称并不是一种选择。

这是确切的错误消息:

[Error: InvalidIndexNameException[[XXX\%FFZZZ] Invalid index name [XXX\%FFZZZ], must not contain the following characters [\, /, *, ?, ", <, >, |,  , ,]]]

无论如何,我已尝试对字符串进行URL编码,但这不起作用,因为那些包含大写字母是不允许的,反斜杠转义是不可能的,因为它在非法字符列表中。

是否有解决此问题的传统解决方案,或者我是否需要提出一些粗略的序列化和/或散列方案来解决这个问题?

2 个答案:

答案 0 :(得分:1)

嗯,让用户控制像索引这样的东西就是要求麻烦:)

但是如果你愿意继续这条路线,我建议只删除任何不是字母数字的字符,并在过程中小写结果。

在PHP中将是:

$index = preg_replace("/[^a-z0-9]+/i", "", $index);

在Java中:

index = index.replace("/[^a-z0-9]+/i", "");

在Javascript中:

index = index.replace(/[^a-z0-9]+/i, "");

答案 1 :(得分:0)

请不要让用户定义索引名称。您可以尝试过滤掉非法字符,但您的正则表达式可能存在问题,以后可能会遇到麻烦。

如果一个usere使用My_Index并写入内容并且下一个尝试访问yndex的用户访问相同的索引,用户可能也不理解为什么他们会产生问题。

BTW:上面给出的正则表达式比法律字符列表要求的更严格。例如_是合法的(但不是在名称的开头),如果你想创建一个允许ES标准合法的正则表达式,你的正则表达式会变得更复杂,更容易出错。