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



我正在尝试使用xxx/yyyxxx 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标准中合法的所有内容,那么您的正则表达式将变得更加复杂,更容易出错。

最新更新