使用PIT(时间点)ID和Search_After API-NEST ElasticSearch



我一直在阅读时间点API,并希望在我的.net应用程序中使用NEST实现它。然而,在阅读这篇文章(.net应用程序超链接(时,我看到了Fluent DSL示例,如下所示。有没有一种方法可以找到那个ID,而不必去控制台上的kibana并进行查询搜索来获得ID,然后稍后将该ID放在";时间点-id";?或者做";a-point-in-time-id";这对你来说像映射到ID吗?

s => s
.PointInTime("a-point-in-time-id", p => p
.KeepAlive("1m"))

我知道在kibanacli控制台中,如果你这样做:

POST /app-logs*/_pit?keep_alive=5m它会给你一个PIT(时间点(id。你如何在NEST中检索它

以及当阅读search_after并尝试使用Fluent DSL示例使用.net客户端的search-after用法来实现它时。我注意到他们说";项目";但它没有说什么";Project在示例中。那到底是什么?

s => s
.Sort(srt => srt
.Descending(p => p.NumberOfCommits)
.Descending(p => p.Name)
)
.SearchAfter(
Project.First.NumberOfCommits,
Project.First.Name
)

在这里,我尝试实现.PointInTime().Sort().SearchAfter(),但被卡住了。

var response = await _elasticClient.SearchAsync<Source>(s => s
.Size(3000) // must see about this
.Source(src => src.Includes(i => i
.Fields(f => f.timestamp,
fields => fields.messageTemplate,
fields => fields.message)))
.Index("app-logs*"
.Query(q => +q
.DateRange(dr => dr
.Field("@timestamp")
.GreaterThanOrEquals("2021-06-12T16:39:32.727-05:00")
.LessThanOrEquals(DateTime.Now))))
.PointInTime("", p => p
.KeepAlive("5m"))
.Sort(srt => srt
.Ascending(p => p.timestamp))
.SearchAfter()

我知道当你使用PIT ID时,你不需要在搜索中使用索引,但在超链接示例中,它没有显示你将如何实现它。所以只是有点迷失了如何做到这一点。任何指针/指导/教程都会很棒!


但只是想看看我如何在NEST中做到这一点,但如果你说这是XPACK的一部分,我会理解的。

我能够将PIT和SearchAfter与下面的代码示例结合起来:

var pit = string.IsNullOrEmpty(pitId) ? client.OpenPointInTime(new OpenPointInTimeDescriptor().KeepAlive(ServerDetail.TTL).Index(Indices.Index(Name))) : null;
var request = new SearchRequest(Name)
{
SearchAfter = string.IsNullOrEmpty(pitId) ? null : new string[] { last },
Size = ServerDetail.PageSize,
PointInTime = new PointInTime(pit == null ? pitId : pit.Id)
};
List<FieldSort> sorts = new List<FieldSort>();
foreach (var item in sortBy)
{
sorts.Add(new FieldSort() { Field = item.Field, Order = item.Direction == SortDirection.Asc ? SortOrder.Ascending : SortOrder.Descending });
}
request.Sort = sorts.ToArray();

SearchAfter值应该是上一个搜索结果的最后一个对象的排序字段中的值。

对于第一个搜索,pitId为空,因此会创建一个新的搜索,对于后续请求,会传递pitId。

希望这对你有用吗?

最新更新