检查弹性搜索中是否存在文档的奇特/有效方法

时间:2013-06-12 06:35:33

标签: elasticsearch

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

我显然可以这样做:

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

或者我可以选择: How do I check for duplicate data on ElasticSearch? 并且发送一份空文件,我想。

更有效率吗?

3 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:6)

如果在2.1之前的版本上,您可以使用“搜索存在API”。

一个例子:

通过用户“kimchy”

在Twitter索引中搜索推文类型
$ 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" }
    }
}'

回复将是相同的。

答案 2 :(得分:2)

如果对象不存在,我会使用get api返回404,否则返回对象本身。如果您使用Java API,则会在isExists对象中找到GetResponse方法。

如果您所指的_id字段未包含在您的文档中,则说fields=_id不会返回_source或{{1}下的任何特定字段}。但是无论如何你都会在回复的标题中找回fields

如果您使用的是REST API,则可以使用以下命令:

_id

它不会返回文件,但如果没有找到则只返回404,否则返回200。响应的主体也将包含exists标志,具有相同的含义。

有趣的是,使用HEAD方法在内部映射到get请求,这就是为什么它没有直接暴露给Java API,但是您可以使用以下代码创建curl -XHEAD 'http://localhost:9200/twitter/tweet/1的相同行为:

GetRequest