批量搜索文件弹性搜索
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
我正在使用这个效率极低的代码来确定文档是否已编入索引:
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