我正在尝试使用xxx/yyy
和xxx yyy
这样的字符串创建弹性搜索索引,但不允许这些索引,因为它们包含非法字符(/
和)。这些名称主要是用户创建的并且不受我的控制,因此为了适应elasticsearch的要求而更改名称并不是一种选择。
这是确切的错误消息:
[Error: InvalidIndexNameException[[XXX\%FFZZZ] Invalid index name [XXX\%FFZZZ], must not contain the following characters [\, /, *, ?, ", <, >, |, , ,]]]
无论如何,我已尝试对字符串进行URL编码,但这不起作用,因为那些包含大写字母是不允许的,反斜杠转义是不可能的,因为它在非法字符列表中。
是否有解决此问题的传统解决方案,或者我是否需要提出一些粗略的序列化和/或散列方案来解决这个问题?
答案 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标准合法的正则表达式,你的正则表达式会变得更复杂,更容易出错。