我可以在ids过滤器或一般查询子句中指定的值数量的最大限制?

时间:2014-10-29 23:21:03

标签: elasticsearch

在elasticsearch中,指定可以对其执行匹配的值的数量的最大限制是多少?我在某处读到它是1024,但也是可配置的。真的吗?它如何影响性能?

curl -XPOST 'localhost:9200/my_index/_search?pretty' -d '{
  "query": {
    "filtered": {
      "filter": {
        "not": {
          "ids": {
            "type": "my_type",
            "values": ["1", "2", "3"]
}}}}}}'

我可以在此数组中指定多少个值?限制是多少?如果可配置,对增加限制的性能影响是什么?

4 个答案:

答案 0 :(得分:34)

我不认为Elaticsearch或Lucene明确规定了任何限制。但是,您可能遇到的限制是JDK设置的限制。

为了证明我上面的陈述,我查看了Elasticsearch的源代码:

/**
 * The maximum size of array to allocate.
 * Some VMs reserve some header words in an array.
 * Attempts to allocate larger arrays may result in
 * OutOfMemoryError: Requested array size exceeds VM limit
 */
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;   

/**
 * Increases the capacity to ensure that it can hold at least the
 * number of elements specified by the minimum capacity argument.
 *
 * @param minCapacity the desired minimum capacity
 */
private void grow(int minCapacity) {
    ...
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    ...
}

private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

该号码(Integer.MAX_VALUE - 8)为2147483639。所以,这将是该阵列的理论最大尺寸。

我在我的ES实例中本地测试了150000个元素的数组。这就是性能影响:当然,阵列越大,性能就越差。在我使用150k ID的简单测试中,我得到了800毫秒的执行时间。但是,一切都取决于CPU,内存,负载,数据量,数据映射等等。最好的是你实际测试它。

2016年12月更新:此答案适用于2014年底存在的Elasticsearch版本,即1.x分支。当时的最新版本是1.4.x。

答案 1 :(得分:12)

是的!字段中的值的数量是可配置的。默认情况下,它限制为1024.您可以在elasticsearch.yml文件中配置它。

indices.query.bool.max_clause_count: 10000

注意:增加限制将导致高内存和CPU使用率。

有关详细信息,请参阅以下链接:

https://groups.google.com/forum/#!topic/elasticsearch/LqywKHKWbeI

https://github.com/elasticsearch/elasticsearch/issues/482

http://elasticsearch-users.115913.n3.nabble.com/index-query-bool-max-clause-count-Setting-and-TermsQueryParser-td3050751.html

http://elasticsearch-users.115913.n3.nabble.com/Query-string-length-limit-td4054066.html

答案 2 :(得分:4)

术语查询中术语数量的索引级别限制为introduced in ES 7.0

设置为index.max_terms_count,默认值为65536。

答案 3 :(得分:0)

来自docs for version 6.4

  

执行带有很多术语的术语查询请求可能会非常慢,因为每个附加术语都需要额外的处理和存储空间。为了防止这种情况,直接或通过查找在字词查询中最多可以使用的字词数量限制为 65536 。可以使用索引设置index.max_terms_count更改特定索引的默认最大值。