NEST 搜索整个文档 C# Elasticsearch
Posted
技术标签:
【中文标题】NEST 搜索整个文档 C# Elasticsearch【英文标题】:NEST Search whole document C# Elasticsearch 【发布时间】:2018-02-13 10:44:44 【问题描述】:我想使用 Nest 在 Elasticsearch 中查询超过一百万个文档。我的代码:
var response = client.Search<MyObject>(s => s
.Index("test")
.Type("one")
.Query(q => q.
Term(
t => t.name, "A"
)
)
.Size(10000)
.Scroll("10m")
.Pretty()
);
我的 MyObject 类:
public class MyObject
public int id get; set;
public int age get; set;
public string lastname get; set;
public string name get; set;
问题是当在前 10k 文档中没有找到此查询时,它不会继续搜索结果滚动 API 的其余部分。
我的问题是如何实现这一点(即在 Scroll API 中移动整个页面,尽管没有命中..)?
【问题讨论】:
var response = client.Search查询将搜索所有文档,但只会返回前.Size
数量的文档。
您可以使用.From()
和.Size()
对结果进行分页,但是,当对超过一百万个文档进行分页时,深度分页 可能是一个问题。为此,您最好使用scroll API 来有效地检索100 万个文档。 NEST 有一个可观察的助手 ScrollAll()
来帮助解决这个问题
var client = new ElasticClient();
// number of slices in slice scroll
var numberOfSlices = 4;
var scrollObserver = client.ScrollAll<MyObject>("1m", numberOfSlices, s => s
.MaxDegreeOfParallelism(numberOfSlices)
.Search(search => search
.Index("test")
.Type("one")
.Term(t => t.name, "A")
)
).Wait(TimeSpan.FromMinutes(60), r =>
// do something with documents from a given response.
var documents = r.SearchResponse.Documents;
);
【讨论】:
它对我有用,只需将字母“A”更改为“a”,就像 silambarsan 所说的那样。你到底想做什么?把每一页分成4片?并搜索与新页面相同的切片? 我知道这已经很老了,但我正在使用 ScrollAll 并且需要在我的回复中获得全部结果。我试过TrackTotalHits
但这只是返回每片的总数。有没有好的内置方法可以做到这一点?
@RussCam 这个ScrollAll 与SearchAfter 不同吗?大型数据集的性能差异是什么?除了this 和this,我在哪里可以找到 SearchAfter 的工作示例。
@FlorinVîrdol 最好将此作为一个新问题提出。从本质上讲,ScrollAll
是对滚动 API 的可观察实现,它是一种以只进、游标样式方式检索大量文档的有效方法。它确实需要跟踪滚动在服务器端的位置,因此不建议在任何时候运行 1000 个滚动,并在滚动开始时返回存在的文档。
@FlorinVîrdol SearchAfter
是一种获取文档的有效方式,不需要在服务器端进行跟踪,可用于下一个/上一个深度分页。文档视图在请求后每次搜索都是实时的,因此如果新添加的文档出现在当前文档窗口之前,它可能会返回重复的文档。以上是关于NEST 搜索整个文档 C# Elasticsearch的主要内容,如果未能解决你的问题,请参考以下文章
为弹性搜索指定和使用带有 C# NEST 客户端的 NGramTokenizer