批量搜索文档弹性搜索

时间:2019-07-14 10:35:43

标签: c# elasticsearch nest

我正在使用这种毫无希望的低效率代码来确定文档是否已被索引:

foreach (var entry in dic)
{
    var response = client.Search<Document>(s => s.Query(q => q.QueryString(d => 
    d.Query(string.Format("{0}", entry.Key)))));

    if (response.Documents.Count == 0)
    {
        not_found++;
    }
    else
    {
        found++;
    }
}

我想知道,是否可以一次发送多个entry.Key而不是为每个id(entry.Key)敲击端点?谢谢。

1 个答案:

答案 0 :(得分:1)

当然!

您可以使用terms过滤器:

client.Search<Document>(s => s.Query(
  q => q.Terms(
    c => c
      .Field(doc => doc.Id)
      .Terms(keys)))

如果您要专门查找ID,则可以使用ids过滤器:

client.Search<Document>(s => s.Query(
  q => q.Ids(c => c.Values(keys))
);

如果您仅对文档是否已编入索引感兴趣,请考虑limiting the returned fields仅用于ID字段,以免浪费带宽返回完整文档:

response = client.Search<Document>(s => s
  .Query(q => q.Ids(c => c.Values(keys))  // look for these IDs
  .StoredFields(sf => sf.Fields(doc => doc.Id))  // return only the Id field
);  

最后,如果您只对匹配文档的数量感兴趣,则可以要求Elasticsearch不返回任何结果,而仅使用响应元数据来计算匹配的文档数量:< / p>

response = client.Search<Document>(s => s
  .Query(q => q.Ids(c => c.Values(keys)))  // look for these IDs
  .Size(0)  // return 0 hits
);
found += response.Total; // number of total hits