批量搜索文件弹性搜索

batch search for documents elastic search

我正在使用这个效率极低的代码来确定文档是否已编入索引:

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) 发送端点?谢谢

好的!

您可以使用 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 字段,这样您就不会浪费带宽 return 完整文档:

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 不 return 任何结果,只使用响应用于计算匹配文档数量的元数据:

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