如果存在具有 _id 的文档,最有效的 oof 测试方法是什么?
我显然可以这样做:
curl -XGET localhost:9200/my_index/my_doctype/<_id>?fields=_id'.
或者我可以选择: 如何检查 ElasticSearch 上的重复数据? 并发送一个空文件,我猜。
有什么更高效的吗?
如果存在具有 _id 的文档,最有效的 oof 测试方法是什么?
我显然可以这样做:
curl -XGET localhost:9200/my_index/my_doctype/<_id>?fields=_id'.
或者我可以选择: 如何检查 ElasticSearch 上的重复数据? 并发送一个空文件,我猜。
有什么更高效的吗?
您可以使用 HTTP HEAD 动词仅检索标头。
curl -XHEAD --dump-header - localhost:9200/index/type/doc
它将为您提供 200 或 404,而不包含文档正文的任何部分。
如果在 之前的版本上2.1
,您可以使用“Search Exists API”。
一个例子:
在推特索引中搜索用户“kimchy”的推文类型
$ curl -XGET 'http://localhost:9200/twitter/tweet/_search/exists?q=user:kimchy'
如果该用户有任何推文,则响应正文将包含 true 或 false:
{
"exists" : true
}
您也可以像这样在请求正文中发送查询(POST 或 GET 都可以):
curl -XGET 'http://localhost:9200/twitter/tweet/_search/exists' -d '
{
"query" : {
"term" : { "user" : "kimchy" }
}
}'
响应将是相同的。
如果对象不存在,我将只使用返回 404 的get api ,否则返回对象本身。如果您使用 Java API,您会在对象中找到一个isExists
方法 。GetResponse
如果_id
您所指的字段未包含在您的文档中,fields=_id
那么说不会给您返回._source
下的任何特定字段或任何特定字段fields
。_id
但是无论如何,您都会在响应的标题中取回。
如果您使用的是 REST api,则可以使用以下内容:
curl -XHEAD 'http://localhost:9200/twitter/tweet/1
它不会返回文档,但如果找不到则返回 404,否则返回 200。响应的主体也将包含存在标志,含义相同。
有趣的是,使用 HEAD 方法在内部映射到 get 请求,这就是它不直接暴露给 Java API 的原因,但您可以GetRequest
使用以下代码创建相同的行为:
GetRequest getRequest = new GetRequest("index", "type", "id");
// don't get any fields back...
getRequest.fields(new String[0]);