【问题标题】:Return all rows in a Elasticsearch SQL query返回 Elasticsearch SQL 查询中的所有行
【发布时间】:2019-03-29 18:41:54
【问题描述】:

我在 Elasticsearch 中有一个简单的 SQL 查询,我知道它返回的结果少于 100 行。如何一次获得所有这些结果(即,不使用滚动)?我尝试了limit n 子句,但它在n 小于或等于10 时有效,但在n 大于10 时无效。

调用Elasticsearch SQL API的Python代码如下。

import requests
import json

url = 'http://10.204.61.127:9200/_xpack/sql'
headers = {
   'Content-Type': 'application/json',
}
query = {
    'query': '''
        select
            date_start,
            sum(spend) as spend
       from
           some_index
       where
           campaign_id = 790
           or
           campaign_id = 490
       group by
           date_start
   '''
}
response = requests.post(url, headers=headers, data=json.dumps(query))

上述查询返回一个游标 ID。我尝试将游标 ID 提供给同一个 SQL API,但它没有给我更多结果。

我还尝试使用 SQL 翻译 API 将上述 SQL 查询翻译为原生 Elasticsearch 查询,并将其包装到以下 Python 代码中,但它也不起作用。我仍然只有 10 行结果。

import requests
import json


url = 'http://10.204.61.127:9200/some_index/some_doc/_search'
headers = {
    'Content-Type': 'application/json',
}
query = {
    "size": 0,
    "query": {
        "bool": {
            "should": [
                {
                    "term": {
                        "campaign_id.keyword": {
                            "value": 790,
                            "boost": 1.0
                        }
                    }
                },
                {
                    "term": {
                        "campaign_id.keyword": {
                            "value": 490,
                            "boost": 1.0
                        }
                    }
                }
            ],
            "adjust_pure_negative": True,
            "boost": 1.0
        }
    },
    "_source": False,
    "stored_fields": "_none_",
    "aggregations": {
        "groupby": {
            "composite": {
                "size": 1000,
                "sources": [
                    {
                        "2735": {
                            "terms": {
                                "field": "date_start",
                                "missing_bucket": False,
                                "order": "asc"
                            }
                        }
                    }
                ]
            },
            "aggregations": {
                "2768": {
                    "sum": {
                        "field": "spend"
                    }
                }
            }
        }
    }
}
response = requests.post(url, headers=headers, data=json.dumps(query)).json() 

【问题讨论】:

    标签: sql elasticsearch size limit elasticsearch-sql


    【解决方案1】:

    elasticsearch 有限制,但是如果你使用 python 你可以使用 elasticsearc-dsl

    from elasticsearch_dsl import Search
    
    q = Q('term', Frequency=self._frequency)
    q = q & Q("range", **{'@timestamp': {"from": self._start, "to": self._end}})
    
    Search().query(q).scan()
    

    【讨论】:

    • 如何使用elasticsearch_dsl 执行问题中给出的示例的聚合?
    【解决方案2】:
    POST _sql?format=json
    {
      "query": "SELECT field1, field2 FROM indexTableName ORDER BY field1",
      "fetch_size": 10000
    }
    

    上述查询会在响应中返回一个游标,需要在下次调用时传入。

    POST _sql?format=json
    {
      "cursor": "g/W******lAAABBwA="
    }
    

    这类似于 Elasticsearch 中的普通滚动方法

    【讨论】:

      【解决方案3】:

      对于elasticsearch-sqlLIMIT 100 应转换为traditional query DSL 中的"size": 100。这将返回最多 100 个匹配结果。

      鉴于此请求:

      POST _xpack/sql/translate
      {
        "query":"SELECT FlightNum FROM flights LIMIT 100"
      }
      

      翻译后的查询是:

      {
        "size": 100,
        "_source": {
          "includes": [
            "FlightNum"
          ],
          "excludes": []
        },
        "sort": [
          {
            "_doc": {
              "order": "asc"
            }
          }
        ]
      }
      

      所以从语法上讲,LIMIT N 应该按照您的预期进行。至于为什么您没有看到更多结果,这可能与您的索引、查询或数据有关。

      有一个设置 index.max_result_window 可以限制查询的大小,但它默认为 10K,并且还应该返回错误,而不仅仅是限制结果。

      【讨论】:

      • demo.elastic.co 上测试过,该查询确实返回 100 个结果
      • 如果像问题中的示例一样使用聚合怎么办?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2011-07-26
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多