【问题标题】:Do reserved characters need to be escaped in an Elasticsearch query?保留字符是否需要在 Elasticsearch 查询中转义?
【发布时间】:2016-04-07 05:34:54
【问题描述】:

我可能没有正确理解这一点,但是当使用查询字符串查询来搜索我的索引时,它指出需要转义保留字符或特殊字符。

https://www.elastic.co/guide/en/elasticsearch/reference/2.1/query-dsl-query-string-query.html#_reserved_characters

保留字符为:+ - = && || >

未能正确转义这些特殊字符可能会导致语法错误,从而阻止您的查询运行。"

目前我的索引没有标记特殊字符,因为我只使用标准分析器,但我确实对所有字符串字段都进行了分析和未分析。

如果我将这些字符串编入索引:

quick fox
brown fox

当我运行查询时:

{
    "query_string" : {
        "query" : "(quick OR brown) AND fox",
    }
}

返回正确的结果。但是根据保留字符文档,是否需要在查询字符串查询中转义带有括号“(”和“)”的查询?我对何时转义保留字符以及何时不在查询中感到有些困惑?

需要吗?:

{
    "query_string" : {
        "query" : "\(quick OR brown\) AND fox",
    }
}

我知道括号是用于分组的,所以不要逃避它们是有意义的。但是在 Elasticsearch 的查询中总是需要转义哪些保留字符?仅当保留字符为运算符时?

【问题讨论】:

    标签: elasticsearch escaping query-string


    【解决方案1】:

    如果保留字符不是查询语法的一部分,则只需要对其进行转义。

    所以在(quick OR brown) AND fox 中你什么也逃不掉。

    但是,例如,如果您的字段包含您要搜索的保留字符,例如您的字段包含Hello!! 是一个保留字符等价于NOT 并且您想搜索Hello!,那么您的查询需要是这样的

    `Hello\! AND blabla`
          ^^
          ||
    escaped reserved char
    

    【讨论】:

    • 这就是我最初的想法,但一些保留字符会抛出解析异常,例如:如果查询带有搜索字符串“etc/elasticsearch”,它会抛出异常。这就是为什么我不清楚搜索查询需要转义哪些字符并且不会影响搜索结果。
    • 在这种情况下,您需要像这样 etc\/elasticsearch 转义它,因为正斜杠是您正在查询的值的一部分,而不是查询语法的一部分
    • 我想这就是我试图找出的。哪些保留字符需要转义,哪些可以直接通过。
    • 规则很简单:1)如果保留字符需要成为您正在搜索的值的一部分,则转义,2)如果保留字符是查询语法的组成部分,则不要转义
    • 谢谢 Val,如果你知道什么被搜索什么不是,那当然是一个非常简单的规则。这意味着该站点是否允许开放式搜索功能并且它只是一个搜索文本框。用户可以输入任何想要的搜索词,它会强制幕后的逻辑强制执行“可搜索”的内容。但它也涉及分析器对这些保留字符所做的事情,它是否被索引。但是在 "(" 与 "/" 的例子中,如何确定查询语法的一部分,哪些不是?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多