我正在尝试使用像xxx/yyy和xxx yyy这样的字符串创建elasticsearch索引,但这些是不允许的,因为它们包含非法字符(/和)。这些名称在很大程度上是用户创建的,不在我的控制范围内,所以为了适应elasticsearch的需求而更改名称并不是一个真正的选择。
这是确切的错误消息:
[Error: InvalidIndexNameException[[XXX\%FFZZZ] Invalid index name [XXX\%FFZZZ], must not contain the following characters [\, /, *, ?, ", <, >, |, , ,]]]无论如何,我已经尝试过对字符串进行URL编码,但这并不起作用,因为这些字符串包含不允许的大写字母,而且反斜杠转义是不可能的,因为它在非法字符列表中。
这个问题有没有传统的解决方案,或者我必须想出一些粗略的序列化和/或散列方案来解决这个问题?
发布于 2015-12-04 12:29:57
嗯,让用户控制像索引名称这样的东西是自找麻烦的:)
但是,如果您愿意这样做,我建议您简单地删除所有非字母数字的字符,并将过程中的结果小写。
在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, "");发布于 2015-12-18 20:20:55
请不要允许用户定义索引名称。您可以尝试过滤掉非法字符,但是regexp可能会有问题,稍后可能会遇到麻烦。
此外,用户可能不理解,如果一个用户使用My_Index并在其中写入内容,而下一个用户试图访问yndex访问相同的索引,那么他们为什么会产生问题。
顺便说一下:上面给出的regexp比合法字符列表要求的更严格。例如,_是合法的(但不是在名称的开头),如果您想创建一个regexp,它允许ES标准中所有合法的东西,那么您的regexp将变得更加复杂且更容易出错。
https://stackoverflow.com/questions/34079644
复制相似问题