9

如果存在具有 _id 的文档,最有效的 oof 测试方法是什么?

我显然可以这样做:

curl -XGET localhost:9200/my_index/my_doctype/<_id>?fields=_id'.

或者我可以选择: 如何检查 ElasticSearch 上的重复数据? 并发送一个空文件,我猜。

有什么更高效的吗?

4

3 回答 3

15

您可以使用 HTTP HEAD 动词仅检索标头。

curl -XHEAD --dump-header - localhost:9200/index/type/doc

它将为您提供 200 或 404,而不包含文档正文的任何​​部分。

于 2013-06-12T12:11:43.797 回答
6

如果在 之前的版本上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" }
    }
}'

响应将是相同的。

于 2014-11-07T17:21:30.593 回答
2

如果对象不存在,我将只使用返回 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]);
于 2013-06-12T07:40:11.387 回答