我正在尝试使用xxx/yyy
和xxx yyy
等字符串创建弹性搜索索引,但这些索引是不允许的,因为它们包含非法字符(/
和)。这些名称在很大程度上是用户创建的,超出了我的控制范围,因此为了适应弹性搜索的要求而更改名称并不是一个真正的选择。
这是确切的错误消息:
[Error: InvalidIndexNameException[[XXX%FFZZZ] Invalid index name [XXX%FFZZZ], must not contain the following characters [, /, *, ?, ", <, >, |, , ,]]]
无论如何,我已经尝试过对字符串进行URL编码,但这不起作用,因为其中包括不允许使用的大写字母,而且反斜杠转义是不可能的,因为它在非法字符列表中。
这个问题有没有一个传统的解决方案,或者我必须想出一些粗略的序列化和/或哈希方案来解决这个问题?
嗯,让用户控制诸如索引名之类的事情会带来麻烦:)
但如果你愿意走这条路,我建议你简单地删除任何不是字母数字和小写的字符——这是这个过程的结果。
在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, "");
请不要允许用户定义索引名称。您可以尝试过滤掉非法字符,但您的regexp可能有问题,以后可能会遇到麻烦。
此外,如果一个用户使用My_Index并写入内容,而下一个试图访问yndex的用户访问相同的索引,用户可能不明白为什么会产生问题。
BTW:上面给出的正则表达式比法定字符列表要求的更严格。例如,_是合法的(但不在名称的开头),如果您想创建一个正则表达式,允许ES标准中合法的所有内容,那么您的正则表达式将变得更加复杂,更容易出错。