问题描述
我正在尽最大的努力来理解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 +的结果,因此我需要使用滚动。
我在这里做错了什么?我从未在观察者中抛出异常。
解决方法
我的示例似乎有问题。首先,它不是异步的,但我知道这一点。我找到了一个更好的示例,并使其适应了我的需求,并且每次都能完美地运行。