elasticsearch,scroll,nest,Sorting,elasticsearch,Scroll,Nest" /> elasticsearch,scroll,nest,Sorting,elasticsearch,Scroll,Nest" />

Sorting elasticseach 2.4:使用scroll检索满足所有搜索标准的所有记录

Sorting elasticseach 2.4:使用scroll检索满足所有搜索标准的所有记录,sorting,elasticsearch,scroll,nest,Sorting,elasticsearch,Scroll,Nest,我第一次使用弹性搜索,基于需求,我对scroll有一些疑问和问题 检索满足所有搜索条件的所有数据 1) 我正在尝试使用scroll,但在搜索时找到了它 我发现搜索类型扫描已弃用 但NEST正在支持它 那么我应该使用“搜索类型扫描”还是“按文档排序”?(我使用的是弹性搜索2.4) 2) 使用滚动时,我可以使用“在任何字段上排序”吗 3) 在执行清除滚动时 var test2=client.clearcroll(x=>x.ScrollId(results.ScrollId)) 获取错误如下所示: 从

我第一次使用弹性搜索,基于需求,我对scroll有一些疑问和问题

检索满足所有搜索条件的所有数据 1) 我正在尝试使用scroll,但在搜索时找到了它 我发现搜索类型扫描已弃用 但NEST正在支持它 那么我应该使用“搜索类型扫描”还是“按文档排序”?(我使用的是弹性搜索2.4)

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

3) 在执行清除滚动时 var test2=client.clearcroll(x=>x.ScrollId(results.ScrollId))

获取错误如下所示: 从删除时不成功的低级调用生成的无效嵌套响应:/\u搜索/滚动

此API调用的审核跟踪:
  • [1] 错误响应:节点:take:00:00.0160110

    OriginalException:System.Net.WebException:远程服务器返回错误:(404)未找到。 在System.Net.HttpWebRequest.GetResponse()中 在C:\Users\russ\source\Elasticsearch-Net-2.x\src\Elasticsearch.Net\Connection\HttpConnection.cs中的Elasticsearch.Net.HttpConnection.Request[TReturn](RequestData RequestData)处:第141行

    请求:
{“scroll_id”:[“c2nhbjswoze7dg90ywxfalg0czoxmjs=“]”

答复: {}

所以这是清除滚动条的正确方法吗

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

 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)); 
List indexedList=new List();
ISearch响应列表结果=
client.Search(Search=>Search
.Index(常数.ES_索引)
.Type(常量.ES_类型)
.From(listingSearch.StartIndex)
.尺寸(10)
.Source(s=>s.Include(i=>i.Fields(outputfields)))
.Query(Query=>Query)。
布尔值(boolean=>boolean。
必须(
must=>must.Term(t=>t.Field(“已删除”).Value(false))
)
.Sort(x=>x.Field(“\u doc”,SortOrder.升序))
.滚动(“60秒”)
);
列表索引列表=新列表();
var结果=client.Scroll(“60s”,listingResult.ScrollId);
while(results.Documents.Any())
{
foreach(results.Hits中的var文档)
{
添加索引列表(doc);
}
结果=client.Scroll(“60s”,results.ScrollId);
}
var test2=client.clearcroll(x=>x.ScrollId(results.ScrollId));
//清晰卷轴

通过上面的代码,我得到了数据 但如果我把大小从10改为1000,就不会有记录了。
不确定问题是否在于数据量,因为我的ES db只有12-15个文档。

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

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


使用scroll API时,您应该在下一次scroll调用中使用上一个请求中的
scroll\u id
,以获取下一组结果。完成滚动后,最好通过调用
ClearScroll()将其清除
您正在执行的操作。您的呼叫看起来是正确的;
scroll\u id
可能在您发出明确呼叫时已经过期了?

我已经用代码更新了问题。我可以知道如何检查scroll\u id是否过期吗?以及“对Elasticsearch 2.0使用NEST 2.x时需要存在搜索类型”-可以将搜索类型和排序放在一起,因为我已经读到它会影响性能?您可以只调用
ClearCroll
并处理404 Not Found响应;认为我们可能希望允许404作为
ClearCroll
的有效响应。在Elasticsearch 2.1中指定
search\u type=scan
将被忽略.0+。按
\u doc
排序将是最有效的,按其他任何方式排序将更少。减少多少将取决于许多因素。感谢您的回复,ok将保持清晰的滚动和扫描类型。我发现一个奇怪的行为,如果我不使用“扫描类型”通过大小为1000,然后得到,没有如上所述的结果。你看到这种行为了吗?没有什么不同,1)我没有通过searchtype扫描,按_doc排序,2)记录大小10它可以工作。现在,如果我将大小更改为1000,则不起作用。值得注意的是,我的es只有10-15条记录。一旦通过搜索类型扫描,它可以使用10号或1000号