【问题标题】:ElasticSearch[1.4.4] :Range search on numeric index with non numeric inputElasticSearch[1.4.4] : 使用非数字输入对数字索引进行范围搜索
【发布时间】:2015-09-07 12:45:56
【问题描述】:

我正在使用 Elasticsearch Java API 创建索引并编写搜索查询。 索引是在各种字段上创建的。其中一个字段是在其上创建索引的数字(整数)。

现在我们得到的输入是字符串形式的。我们必须在所有字段中搜索提供的输入。要搜索我们正在使用的数字字段

QueryBuilders.rangeQuery() method.

但是当它在“to”或“from”字段中遇到任何非整数值时,它会抛出

SearchPhaseExecutionException[Failed to execute phase [query].
nested: NumberFormatException[For input string: \"30y\"]

我怎样才能避免这种情况?我们没有得到任何搜索结果很好,但我想避免这个异常,因为可能会有我们得到非整数输入的情况。

另一种选择是检查所有输入标记,我想避免这种情况,因为它会添加另一个级别的检查,这会影响性能。

我有什么方法可以使用 elasticsearch API 完成此任务吗?

【问题讨论】:

    标签: elasticsearch lucene


    【解决方案1】:

    另一种选择是检查所有输入标记,我想避免这种情况,因为它会添加另一个级别的检查,这会影响性能。

    检查/验证用户输入是您应该始终做的事情,在任何情况下,无论您的性能要求是什么。如果您不这样做,您将不必要地将您的集群暴露在未知的未来威胁中,而且known ones 最近已经造成了一些损害,并且可能对您的集群和/或业务产生更严重的影响,而不是花费几毫秒的清理时间用户输入。 Elasticsearch 很灵活,可以创造奇迹,但你也必须好好利用它。

    话虽如此,如果你真的想避免secure coding best practices,你可以使用下面的查询,如果输入数据不合规就不会吠叫。

    {
      "query": {
        "simple_query_string": {
          "query": "numfield:[10y TO *]"
        }
      }
    }
    

    simple_query_string 等同于query_string,但对输入更加宽容,并且永远不会抛出异常。

    【讨论】:

    • 感谢Val 提供的有用信息。我们最终决定在创建查询之前检查输入。因为这将节省我们对 DB 的调用,这将补偿检查所花费的时间。
    • 很好,您采用了正确的方法;) 确实,这种简单的验证检查绝对值得!
    猜你喜欢
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    相关资源
    最近更新 更多