【问题标题】:Elastic NEST returns inconsistent resultsElastic NEST 返回不一致的结果
【发布时间】:2020-08-17 10:06:37
【问题描述】:

我正在尽最大努力了解 NEST 的工作原理,但我认为我有一些工作......部分。我已将 10.000 个文档导入本地 Elastic。所有时间戳都是 3 天前的。当我使用 Kibana 获取结果时,我有一个简单的查询:hostname:www.website.com 并且我已经将日期设置为 1 个月到现在,所以我得到了所有的结果。该特定查询为我提供了 44 个结果,我也在 CSV 文件中验证了这些结果是正确的。

现在,当我尝试为 NEST 库编写相同的代码时,我得到了各种结果。我得到 33、34、43 和 44 个结果。可能还有其他金额。它主要发生在我启动我的应用程序之后,通常不会在我多次调用我的代码时发生。

public async Task Test()
{
    var model = new Model() 
    {
        Domain = "www.website.com"
    };

    var timestamp = DateTimeOffset.UtcNow.AddMonths(-1).ToUnixTimeSeconds();

    var nodes = new[]
    {
        new Uri("http://localhost:9200"),
    };

    var pool = new StaticConnectionPool(nodes);
    var settings = new ConnectionSettings(pool);
    settings = settings.BasicAuthentication("username", "password");
    var client = new ElasticClient(settings);

    var documents = new List<IReadOnlyCollection<ApacheRequest>>();

    Time processTimePerScroll = "2s";
    var numberOfSlices = Environment.ProcessorCount;
    if (numberOfSlices > 3) numberOfSlices = 3;

    var scrollAllObservable = client.ScrollAll<ApacheRequest>(processTimePerScroll, numberOfSlices, sc => sc
        .MaxDegreeOfParallelism(numberOfSlices)
        .Search(s => s
            .Index("apache-requests")
            .Query(q => 
                        q.Range(r => r.GreaterThanOrEquals(timestamp)) &&
                        q.Term(t => t.Servername, model.Domain)
            )
            .Sort(so => so.Field(f => f.Field(fi => fi.Timestamp)))
        )
    );

    var waitHandle = new ManualResetEvent(false);

    var scrollAllObserver = new ScrollAllObserver<ApacheRequest>(
        response =>
        {
            documents = documents.Concat(response.SearchResponse.Documents).ToList();
        },
        e =>
        {
            waitHandle.Set();
            throw new Exception(e.Message);
        },
        () => waitHandle.Set()
    );


    scrollAllObservable.Subscribe(scrollAllObserver);

    waitHandle.WaitOne();

    var requests = documents;

    var count = requests.Count(); //33, 34, 43, 44, and so on
}

当我针对生产数据进行测试时,有时会得到 10k+ 的结果,所以我需要使用滚动。

我在这里做错了什么?我从不向观察者抛出异常。

【问题讨论】:

  • 您是否观察到任何分片上的任何失败或所有分片都成功?
  • @SaiGummaluri 我不知道如何获得这些碎片的成功代码或任何东西。我的响应或调用都不是分片,所以我不确定
  • 很高兴您找到了解决方案。另一方面,对于您将来的参考,NEST 生成的响应有一个名为DebugInformation 的属性。这包括生成什么查询以及它从 ES 收到的响应。如果任何分片出现故障,您可以在响应中看到。
  • @SaiGummaluri 哦,太好了。谢谢你的建议。我肯定会用那个:)
  • 观察者的一个问题是onError 中抛出的异常将被吞没,不会像预期的那样冒泡。它需要在观察者内部被捕获并被扔到外面。查看滚动文档(ScrollAllObservable 下的第二个示例):elastic.co/guide/en/elasticsearch/client/net-api/current/…。我不知道这是否会导致您看到的问题。您使用的是哪个版本的 NEST? 2 秒是否足以处理从每个滚动响应返回的文档?也可以在onNext 中查看response 的详细信息

标签: c# elasticsearch nest


【解决方案1】:

我的那个例子似乎有问题。一方面它不是异步的,但我知道这一点。我找到了一个更好的示例并根据我的需要对其进行了调整,并且每次都能完美运行。

https://stackoverflow.com/a/56261657/2098652

【讨论】:

    猜你喜欢
    • 2021-05-20
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多