如果存在带有_id的文档,最有效的测试方法是什么?
我显然可以这样做:
curl -XGET localhost:9200/my_index/my_doctype/<_id>?fields=_id'.
或者我可以选择: How do I check for duplicate data on ElasticSearch? 并且发送一份空文件,我想。
更有效率吗?
答案 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