返回Elasticsearch SQL查询中的所有行

时间:2018-10-25 08:12:07

标签: sql elasticsearch size limit elasticsearch-sql

我在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 Translation 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() 

3 个答案:

答案 0 :(得分:1)

对于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,并且应该返回错误,而不仅是限制结果。

答案 1 :(得分:0)

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()

答案 2 :(得分:0)

NaN

上面的查询将在响应中返回一个游标,该游标需要在下一个调用中传递。

POST _sql?format=json
{
  "query": "SELECT field1, field2 FROM indexTableName ORDER BY field1",
  "fetch_size": 10000
}

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