【问题标题】:Elastic search not giving data with big number for page size弹性搜索不提供页面大小的大数字数据
【发布时间】:2018-08-25 12:17:43
【问题描述】:

要获取的数据大小:大约 20,000

问题:在 python 中使用以下命令搜索 Elastic Search 索引数据

但没有得到任何结果。

from pyelasticsearch import ElasticSearch
es_repo = ElasticSearch(settings.ES_INDEX_URL)
search_results = es_repo.search(
            query, index=advertiser_name, es_from=_from, size=_size)

如果我给出小于或等于 10,000 的尺寸,它可以正常工作,但不能使用 20,000 请帮我找到一个最佳解决方案。

PS:在深入挖掘 ES 时发现此消息错误:

结果窗口太大,from + size 必须小于或等于:[10000] 但为 [19999]。请参阅滚动 API,以更有效地请求大型数据集。

【问题讨论】:

  • 您更喜欢实时使用或分析的解决方案?
  • @Lupanoide 实时使用。
  • 出现在错误堆栈中的滚动查询是分析的最佳解决方案,而不是实时的,因为需要更多资源才能运行。请阅读我的回答中提到的es文档的search_after查询页面
  • 谢谢,但我不确定实时和分析之间有什么区别。你能帮我理解吗?
  • 请在此处阅读elasticsearch开发人员提供的说明discuss.elastic.co/t/scroll-vs-search-api/28294

标签: python elasticsearch pyelasticsearch


【解决方案1】:

实时使用最好的解决方案是使用search after query。您只需要一个日期字段和另一个唯一标识文档的字段 - _id 字段或 _uid 字段就足够了。 尝试这样的事情,在我的示例中,我想提取属于单个用户的所有文档 - 在我的示例中,用户字段具有 keyword datatype

from elasticsearch import Elasticsearch


es = Elasticsearch()
es_index = "your_index_name"
documento = "your_doc_type"

user = "Francesco Totti"

body2 = {
        "query": {
        "term" : { "user" : user } 
            }
        }

res = es.count(index=es_index, doc_type=documento, body= body2)
size = res['count']


body = { "size": 10,
            "query": {
                "term" : {
                    "user" : user
                }
            },
            "sort": [
                {"date": "asc"},
                {"_uid": "desc"}
            ]
        }

result = es.search(index=es_index, doc_type=documento, body= body)
bookmark = [result['hits']['hits'][-1]['sort'][0], str(result['hits']['hits'][-1]['sort'][1]) ]

body1 = {"size": 10,
            "query": {
                "term" : {
                    "user" : user
                }
            },
            "search_after": bookmark,
            "sort": [
                {"date": "asc"},
                {"_uid": "desc"}
            ]
        }




while len(result['hits']['hits']) < size:
    res =es.search(index=es_index, doc_type=documento, body= body1)
    for el in res['hits']['hits']:
        result['hits']['hits'].append( el )
    bookmark = [res['hits']['hits'][-1]['sort'][0], str(result['hits']['hits'][-1]['sort'][1]) ]
    body1 = {"size": 10,
            "query": {
                "term" : {
                    "user" : user
                }
            },
            "search_after": bookmark,
            "sort": [
                {"date": "asc"},
                {"_uid": "desc"}
            ]
        }

然后你会发现所有附加到result var的文档

如果您想使用scroll query - doc here

from elasticsearch import Elasticsearch, helpers

es = Elasticsearch()
es_index = "your_index_name"
documento = "your_doc_type"

user = "Francesco Totti"

body = {
        "query": {
        "term" : { "user" : user } 
             }
        }

res = helpers.scan(
                client = es,
                scroll = '2m',
                query = body, 
                index = es_index)

for i in res:
    print(i)

【讨论】:

【解决方案2】:

可能是它的ElasticSearch 约束。

index.max_result_window index setting which defaults to 10,000

【讨论】:

  • 知道了。因此,我也尝试使用search_results = es_repo.search( query, index=advertiser_name, es_from=1, size=10000) 获取第二页,但没有响应。不过第一页很好。
猜你喜欢
  • 1970-01-01
  • 2023-02-06
  • 2023-03-26
  • 2016-08-03
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多