【问题标题】:Elasticsearch search query to retrieve all records NESTElasticsearch 搜索查询以检索所有记录 NEST
【发布时间】:2016-06-13 01:44:27
【问题描述】:

我的文件夹中的文档很少,我想检查该文件夹中的所有文档是否都已编入索引。为此,对于文件夹中的每个文档名称,我想对 ES 中索引的文档运行一个循环并进行比较。所以我想检索所有的文档。

同一个问题很少有其他可能的重复项,例如retrieve all records in a (ElasticSearch) NEST queryenter link description here,但它们对我没有帮助,因为从那时起文档已经发生了变化。(当前文档中没有关于扫描的内容)

我尝试使用 client.search<T>() 。但根据文档,检索到的默认数量为 10 个结果。我想获取所有记录而不提及记录的大小? (因为索引的大小发生了变化)

或者是否可以先获取索引的大小,然后将此数字作为输入发送到大小以获取所有文档并循环遍历?

【问题讨论】:

  • 嗨,拉斯。我尝试使用它并且能够获得scrollId。一旦我得到一个scrollId,我不知道如何再次运行搜索查询(我相信这会产生更多的scrollId),直到我检索到所有文档列表。我没有在 NEST 中找到任何相同的示例。 (我正在检查 2.x 版本的文档。无论如何都会尝试使用您发布的链接中给出的示例)谢谢。
  • 第一条评论中的链接有一个例子——它执行一个搜索,指定搜索类型为scroll,然后使用滚动ID来获取第一页的结果。然后它使用从最后一个响应返回的滚动 ID 循环获取所有文档。您还可以结合使用fields 来为每个结果只返回文档的一个字段,而不是返回整个文档
  • 试过了,它的工作原理......非常感谢拉斯。但是SearchType(Nest.SearchType.Scan) 似乎不起作用。我不得不使用SearchType(Elasticsearch.Net.SearchType.Scan)。使用卷轴后我必须删除卷轴还是在上述时间后将它们清除?

标签: c# elasticsearch nest


【解决方案1】:

这是我解决问题的方法。希望这可以帮助。 (参考https://www.elastic.co/guide/en/elasticsearch/client/net-api/1.x/scroll.htmlhttps://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html#scroll-search-context

List<string> indexedList = new List<string>();
var scanResults = client.Search<ClassName>(s => s
                .From(0)
                .Size(2000)
                .MatchAll()
                .Fields(f=>f.Field(fi=>fi.propertyName)) //I used field to get only the value I needed rather than getting the whole document
                .SearchType(Elasticsearch.Net.SearchType.Scan)
                .Scroll("5m")
            );

        var results = client.Scroll<ClassName>("10m", scanResults.ScrollId);
        while (results.Documents.Any())
        {
            foreach(var doc in results.Fields)
            {
                indexedList.Add(doc.Value<string>("propertyName"));
            }

            results = client.Scroll<ClassName>("10m", results.ScrollId);
        }

编辑

var response = client.Search<Document>(s => s
                         .From(fromNum)
                         .Size(PageSize)
                         .Query(q => q ....

【讨论】:

  • 我不太明白你的逻辑。您的第一个 matchAll 查询将仅返回 2000 个文档。您是否只滚动了 2000 个文档?如果我有 5000 个文档怎么办?
  • @batmaci 那个数字 2000 不是记录的总数。它是每次获取的记录数,在滚动中提到的一段时间内有效。 (例如:首先我将获取 0-10 条记录,然后我将获取 11-20 条记录等等。所以 2000 只是一个示例。)
  • 你知道是否可以设置这个高数字或任何性能问题都可能导致。据我所知,10 000 是搜索查询的最大计数
  • @ASN 第一次使用“5m”,然后使用“10m”的滚动时间有什么区别?他们各自做什么?
  • @wnbates 滚动参数告诉 Elasticsearch 将搜索上下文保持打开另一个 5m 或 10m。
【解决方案2】:

您可以轻松地执行以下操作来获取索引中的所有记录:

var searchResponse = client.Search<T>(s => s
                                    .Index("IndexName")
                                    .Query(q => q.MatchAll()
                                           )
                                     );

var documents = searchResponse.Documents.Select(f => f.fieldName).ToList();

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 2021-12-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多