c# - 弹性NEST返回不一致的结果

标签 c# elasticsearch nest

我正在尽最大努力了解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 +的结果,因此我需要使用滚动。
我在这里做错了什么?我从未在观察者中抛出异常。

最佳答案

好像我的那个例子有问题。首先,它不是异步的,但我知道这一点。我找到了一个更好的示例,并使其适应了我的需求,并且每次都能完美地运行。
https://stackoverflow.com/a/56261657/2098652

关于c# - 弹性NEST返回不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63448688/

相关文章:

c# - ElasticSearch NEST-查找带有特殊字符的结果

C# 动态执行函数的名称?

mongodb - 为什么将 ElasticSearch 与 Mongodb 一起使用?

java - Elasticsearch Rest 客户端更新操作

c# - 在Elasticsearch中分组搜索结果

c# - 使用 NEST 6.0 for Elasticsearch 枚举动态命中结果

c# - 向 Linq-to-SQL 对象添加功能以执行常见选择

c# - 在 XPather.com 上使用 XML 命名空间的奇怪 XPath 行为?

c# - Angular 9 组件和 .NET Core 应用程序未作为 SPA 运行

elasticsearch - 3个字母后在Elastic Search中自动建议