在Elastic / Nest 6+中滚动和分页

时间:2018-06-27 02:37:33

标签: c# elasticsearch nest

简介

我将弹性版本升级到6.3(以前我们使用的是5.4。 我们的应用程序是用C#编写的,因此我们使用NEST.NET dll与Elastic服务器通信,因此我们还将其更新到版本6.0.0.0。

用例-之前

直到第5版,我才可以执行以下查询:

jsonStr =" 
   {
      "from": 16224,
      "size": 12,
      "query": {
        "bool": {
          "filter": [
            {
              "bool": {
                "must": [
                  {
                    "terms": {
                      "COMPANY": [
                        "AMP Services Ltd"
                      ]
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
}"

使用此NEST / C#代码:

Func<SearchRequestParameters, SearchRequestParameters> requestParameters = null;
requestParameters = a => a.Scroll(new TimeSpan(0, 1, 0));
response = Connection.Client.GetInstance().LowLevel.Search<dynamic>("myindex", new PostData<dynamic>(jsonStr), requestParameters);

这样,我就可以毫无问题地获取数据

用例-现在

现在,在版本6中,我正在尝试执行以下相同的查询:

jsonStr ="
{
  "from": 16224,
  "size": 12,
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "must": [
              {
                "terms": {
                  "COMPANY": [
                    "AMP Services Ltd"
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}"

使用此NEST / C#代码(因为以前的方法签名不再可用):

SearchRequestParameters searchRequest = new SearchRequestParameters();
searchRequest.Scroll = new TimeSpan(0, 1, 0);
response = Connection.Client.GetInstance().LowLevel.Search<StringResponse>("myindex", PostData.String(jsonStr), searchRequest);

我收到此错误: “验证失败:1:在滚动上下文中不允许使用[from];”

文档

我在此处(https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html)和此处(https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/sliced-scroll-search-usage.html)找不到任何内容来帮助我替换此逻辑。论坛也没有。

你们对此有什么见识吗?

谢谢

1 个答案:

答案 0 :(得分:2)

它似乎与validation change in Elasticsearch in 6.0.0有关;在5.x中,为滚动请求允许使用from参数,但无提示地忽略了该参数。现在,在6.0.0中,Elasticsearch更加严格,它会验证是否存在用于滚动请求的from,如果存在,则返回错误响应,并带有适当的验证错误。

由于from参数对于滚动请求没有意义,因此解决方案是执行这两个操作之一

  1. 使用滚动API时删除from参数
  2. 继续使用from参数,但不要使用Scroll API。

顺便说一句,如果您需要滚动许多文档,则可能需要使用ScrollAll() observable helper进行滚动。