我在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()
答案 0 :(得分:1)
对于elasticsearch-sql,LIMIT 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中的普通滚动方法