【发布时间】: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