我正在使用这种毫无希望的低效率代码来确定文档是否已被索引:
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)敲击端点?谢谢。
答案 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