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(搜索字符串,新 SearchUrlParameters Pretty = true );替换此查询 @silambarasanvediappan 你确定,默认弹性只启用 10000 个文档! 不,你定义的大小为10000,这是自定义 最大为 10K,所以我使用滚动 API 来处理每页 10k x 10k ... 哦!很好。这是因为词条查询找到了搜索字符串的确切词条 【参考方案1】:

查询将搜索所有文档,但只会返回前.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的主要内容,如果未能解决你的问题,请参考以下文章

使用 NEST C# 在弹性搜索中使用多个索引进行全文搜索

多词搜索 NEST C#

为弹性搜索指定和使用带有 C# NEST 客户端的 NGramTokenizer

使用 Elasticsearch NEST C# 索引 Json 文档

Nest Client c# 7.0 用于弹性搜索删除别名

为啥使用 C#/ElasticSearch 进行此 NEST 通配符搜索没有返回任何文档?