使用 PIT(时间点)ID 和 Search_After API -NEST ElasticSearch
Using PIT (Point in Time) ID and Search_After API -NEST ElasticSearch
我一直在阅读 Point in time API and wanted to implement it using NEST in my .net application。但是,在阅读那篇文章(.net 应用程序超链接)时,我看到了 Fluent DSL 示例,如下所示。有没有一种方法可以找到该 ID,而无需转到控制台上的 kibana 并进行查询搜索以获取该 ID,然后将该 ID 放入“a-point-in-time-id”中?还是“a-point-in-time-id”为您做的是映射到 ID?
s => s
.PointInTime("a-point-in-time-id", p => p
.KeepAlive("1m"))
如果您这样做,我会在 kibana cli 控制台中知道:
POST /app-logs*/_pit?keep_alive=5m
它会给你一个 PIT(时间点)id。 你如何在 NEST 中检索它?
并且在使用 Fluent DSL 示例阅读 search_after and attempting to implement it using the search after usage 的 .net 客户端时。我注意到他们用了“项目”一词,但没有说明示例中的“项目”是什么。那到底是什么?
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 时,您不需要在搜索中使用索引,但在超链接示例中它没有显示您将如何实现它。所以只是有点迷失了如何去做。任何 pointers/guidance/tutorials 都会很棒!
但只是想看看我如何在 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 被传递。
希望对你有用?
我一直在阅读 Point in time API and wanted to implement it using NEST in my .net application。但是,在阅读那篇文章(.net 应用程序超链接)时,我看到了 Fluent DSL 示例,如下所示。有没有一种方法可以找到该 ID,而无需转到控制台上的 kibana 并进行查询搜索以获取该 ID,然后将该 ID 放入“a-point-in-time-id”中?还是“a-point-in-time-id”为您做的是映射到 ID?
s => s
.PointInTime("a-point-in-time-id", p => p
.KeepAlive("1m"))
如果您这样做,我会在 kibana cli 控制台中知道:
POST /app-logs*/_pit?keep_alive=5m
它会给你一个 PIT(时间点)id。 你如何在 NEST 中检索它?
并且在使用 Fluent DSL 示例阅读 search_after and attempting to implement it using the search after usage 的 .net 客户端时。我注意到他们用了“项目”一词,但没有说明示例中的“项目”是什么。那到底是什么?
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 时,您不需要在搜索中使用索引,但在超链接示例中它没有显示您将如何实现它。所以只是有点迷失了如何去做。任何 pointers/guidance/tutorials 都会很棒!
但只是想看看我如何在 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 被传递。
希望对你有用?