【问题标题】:elasticseach 2.4 : retrieve all records which are fulfilling all search criterias using scrollelasticsearch 2.4:使用滚动检索满足所有搜索条件的所有记录
【发布时间】:2016-10-21 16:52:15
【问题描述】:

我是第一次使用弹性搜索,根据要求我对滚动有一些疑问和问题

检索满足所有搜索条件的所有数据 1)我正在尝试使用滚动,但我在搜索时发现 https://www.elastic.co/guide/en/elasticsearch/reference/current/breaking_21_search_changes.html 我发现不推荐使用搜索类型扫描 但 NEST 支持它 那么我应该使用“搜索类型扫描”还是“按文档排序”? (我使用的是弹性搜索 2.4)

2)我可以在使用滚动时使用“在任何字段上排序”吗?

3) 在进行清除滚动时 var test2 = client.ClearScroll(x=>x.ScrollId(results.ScrollId));

得到如下错误: 无效的 NEST 响应构建于对 DELETE 的不成功的低级别调用:/_search/scroll

此 API 调用的审计跟踪:

  • [1] 错误响应:节点:http://mydomain@localhost:9200/ 接受:00:00:00.0160110

    OriginalException: System.Net.WebException: 远程服务器返回错误:(404) Not Found。

    在 System.Net.HttpWebRequest.GetResponse() 在 Elasticsearch.Net.HttpConnection.Request[TReturn](RequestData requestData) 在 C:\Users\russ\source\elasticsearch-net-2.x\src\Elasticsearch.Net\Connection\HttpConnection.cs:line 141

    请求:

{"scroll_id":["c2NhbjswOzE7dG90YWxfaGl0czoxMjs="]}

回应:

{}

那么清除滚动的方法是否正确?

更新::下面是我的代码:

 List<Object> indexedList = new List<Object>();
    ISearchResponse<ListingSearch> listingResult =
            client.Search<ListingSearch>(search => search
                  .Index(Constant.ES_INDEX)                          
                  .Type(Constant.ES_TYPE)
                  .From(listingSearch.StartIndex)
                  .Size(10)
                  .Source(s => s.Include(i => i.Fields(outpputFields)))                         
                  .Query(query => query.
                            Bool(boolean => boolean.
                            Must(
                                must => must.Term(t => t.Field("is_deleted").Value(false))

                )
                 .Sort(x => x.Field("_doc", SortOrder.Ascending))                       
                .Scroll("60s")
                );
List<Object> indexedList = new List<Object>();
var results = client.Scroll<ListingSearch>("60s", listingResult.ScrollId);
                while (results.Documents.Any())
                {
                    foreach (var doc in results.Hits)
                    {
                        indexedList.Add(doc);
                    }

                    results = client.Scroll<ListingSearch>("60s", results.ScrollId);
                }


var test2 = client.ClearScroll(x=>x.ScrollId(results.ScrollId)); 

//清除滚动

通过上面的代码,我正在获取数据 但如果我将大小从 10 更改为 1000,则没有记录。 不确定问题是否出在数据量上,因为我的 ES 数据库只有 12-15 个文档。

【问题讨论】:

    标签: sorting elasticsearch scroll nest


    【解决方案1】:

    NEST 2.x 版本有SearchType.Scan,因为 NEST 2.x 版本兼容所有 Elasticsearch 2.x 版本,所以在使用 NEST 2.x 对 Elasticsearch 2.0 时需要存在搜索类型。在以后的版本中发送搜索类型不会有任何效果。

    使用滚动检索文档的最有效方法是按_doc 排序,但您可以在滚动时指定任何排序参数。

    使用滚动 API 时,您应该在下一次滚动调用中使用上一个请求中的 scroll_id 来获取下一组结果。一旦你完成了一个卷轴,最好通过调用ClearScroll() 来清除它。您的电话看起来正确;也许scroll_id 在您做出明确呼叫时已经过期?

    【讨论】:

    • 我已经用代码更新了问题。我可以知道我们如何检查 scroll_id 是否过期?和“在针对 Elasticsearch 2.0 使用 NEST 2.x 时需要存在搜索类型” - 可以使用搜索类型并一起排序,因为我已经读过它会影响性能?
    • 您只需拨打ClearScroll 并处理404 Not Found 响应;认为我们可能希望允许 404 作为ClearScroll 的有效响应。在 Elasticsearch 2.1.0+ 中指定 search_type=scan 将被忽略。按_doc 排序将是最有效的,按其他排序将不那么有效。减少多少取决于很多因素。
    • 感谢您的回复,好的也会保持清晰的滚动和扫描类型。我发现了一个奇怪的行为,如果我不使用“扫描类型”并将大小传递为 1000 则得到,没有上述问题所述的结果。
    • 你看到这种行为了吗? stackoverflow.com/a/38494371/1831
    • No 有一点不同,1) 我没有通过 searchtype 扫描,按 _doc 排序 &2) 记录大小 10 它有效。现在,如果我将大小更改为 1000 不起作用。作为说明,我的 es 只有 10-15 条记录。一旦通过搜索类型扫描,它就适用于大小 10 或 1000
    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 2022-11-29
    • 1970-01-01
    • 2021-12-26
    • 2017-02-28
    • 2015-05-01
    • 2013-03-28
    • 2016-11-26
    相关资源
    最近更新 更多