2013-06-12 7 views
8

_id içeren bir belgenin var olup olmadığını sınamanın en etkili yolu nedir?Bir belgenin elasticsearch'te var olup olmadığını kontrol etmenin fantezi/etkin yolu

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

Ya birlikte gidebiliriz: Açıkçası could

do How do I check for duplicate data on ElasticSearch? ve boş belge göndermek sanırım.

Her şey daha verimli?

+0

https://www.elastic.co/guide/en/elasticsearch/guide/current/doc-exists.html – coderz

cevap

15

Yalnızca üstbilgileri almak için HTTP HEAD fiilini kullanabilirsiniz.

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

Bu belge, belge gövdesinin herhangi bir parçası olmadan 200 veya 404 sağlayacaktır.

2

Yalnızca nesne yoksa 404 döndüren get api kullanırım, aksi halde nesnenin kendisi. Java API'sini kullanırsanız, GetResponse nesnesinde isExists yöntemini bulabilirsiniz.

Eğer fields=_id geri vermezdim diyerek Dokümanlarınızdaki dahil değildir kastediyoruz _id alan ya _source ne de fields altında herhangi bir spesifik alan. Ama yine de cevabın başlığında _id'u geri alırsınız.

REST API aşağıdaki kullanabilirsiniz kullanıyorsanız: bulunmazsa sorunun geri ama sadece 404 belgeyi döndürmez

curl -XHEAD 'http://localhost:9200/twitter/tweet/1

, 200 aksi. Yanıtın gövdesi aynı zamanda da var olan bayrağı da içerecektir. ilginç olan şey

doğrudan Java API maruz değil, o yüzden BAŞ yöntemi kullanarak içten bir get isteği eşleştiren, ancak şu koduyla bir GetRequest oluşturarak aynı davranışı elde edebilirsiniz:

GetRequest getRequest = new GetRequest("index", "type", "id"); 
// don't get any fields back... 
getRequest.fields(new String[0]); 
+0

Bunun olacağından emin misiniz? Demek istediğim, "_id" yine de geri döndü, değil mi? Diğer endişe, belge büyükse, yalnızca daha yüksek bir ağ trafiğidir – eran

+1

Soruyu yanlış anlamış olabilirim, ancak bir belgeyi kimliğe göre aldığınızda yanıttaki kimliğe neden önem veriyorsunuz? Ağ trafiğine ilişkin endişeler, büyük belgeleriniz varsa makul olur, o zaman sunucu tarafında kaynağın ayrıştırılması maliyetini ödemeye değer olabilir. – javanna

+0

Yanıttaki _id hakkında umurumda değil, sadece '_id' cevabın içinde yer aldığından beri, "fields = _id" sunucusunun SADECE bunu almasını söylemeye hizmet edeceğini düşündüm. alan ve iş eklememek (yani, '_source' ayrıştırmak için bir ihtiyaç) – eran

6

2.1'dan önceki bir sürümde "Varolan Arama API'sını" kullanabilirsiniz.

Bir örnek:

konusu kullanıcı tarafından herhangi bir tweetler varsa cevap gövdesi doğru veya yanlış içerecektir

$ curl -XGET 'http://localhost:9200/twitter/tweet/_search/exists?q=user:kimchy' 

kullanıcı "kimchy" tarafından bir tweet türü için twitter endeksi Arama:

{ 
    "exists" : true 
} 

Ayrıca (hem işi POST veya GET) şöyle isteği gövdesine sorgu gönderebilirsiniz:

curl -XGET 'http://localhost:9200/twitter/tweet/_search/exists' -d ' 
{ 
    "query" : { 
    "term" : { "user" : "kimchy" } 
    } 
}' 

Yanıt, aynı olacaktır.

+2

Sadece bir hatırlatma, resmi bir belge, "Mevcut 2.1.0 sürümünde" Arama Mevcut API'sı diyor. HEAD'in tavsiye edilen yolu: https://www.elastic.co/guide/en/elasticsearch/guide/current/doc-exists.html – coderz