【问题标题】:Enabling Elasticsearch index names with illegal characters启用带有非法字符的 Elasticsearch 索引名称
【发布时间】:2015-12-18 20:20:54
【问题描述】:

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

这是确切的错误消息:

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

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

这个问题有传统的解决方案吗,还是我必须想出一些粗略的序列化和/或散列方案来解决这个问题?

【问题讨论】:

    标签: regex elasticsearch


    【解决方案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, "");
    

    【讨论】:

    • 我认为这或自己定义索引名称确实是仅有的两个选择。
    【解决方案2】:

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

    此外,如果一个用户使用 My_Index 并在其中写入内容,而下一个尝试访问 yndex 的用户访问相同的索引,用户可能不明白为什么会出现问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      相关资源
      最近更新 更多