2013-06-12 15 views
8

Jaki jest najskuteczniejszy sposób sprawdzania, czy istnieje dokument z identyfikatorem _id?fantazyjny/skuteczny sposób sprawdzania, czy istnieje dokument pod elasticsearch

mogłem oczywiście zrobić:

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

Albo mogę iść z: How do I check for duplicate data on ElasticSearch? i wysłać pusty dokument, tak myślę.

Coś bardziej wydajnego?

+0

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

Odpowiedz

15

Możesz użyć nagłówka HTTP HEAD, aby pobrać tylko nagłówki.

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

Dostarczy Ci 200 lub 404 bez żadnej części dokumentu.

2

Po prostu użyłbym get api, który zwraca 404, jeśli obiekt nie istnieje, w przeciwnym razie sam obiekt. Jeśli korzystasz z interfejsu API Java, znajdziesz metodę isExists w obiekcie GetResponse.

Jeśli pole _id masz na myśli nie jest zawarty w dokumentach, mówiąc fields=_id nie oddać albo _source ani specyficzne pole pod fields. Ale i tak otrzymasz zwrot _id w nagłówku odpowiedzi.

Jeśli używasz API REST można użyć następujących:

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

nie wróci dokument z powrotem, ale tylko jeśli nie znaleziono 404, 200 inaczej. Ciało odpowiedzi będzie zawierało również flagę "istnieje" o tym samym znaczeniu.

Co ciekawe jest to, że przy użyciu metody HEAD mapy na zamówienie Pobierz wewnętrznie, dlatego nie jest bezpośrednio narażony na Java API, ale można uzyskać takie samo zachowanie tworząc GetRequest z następującego kodu:

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

Czy na pewno tak się stanie? Mam na myśli, że "_id" jest zwracany, nie? Innym problemem jest tylko większy ruch w sieci, jeśli dokument jest duży. – eran

+1

Być może źle zrozumiałem pytanie, ale dlaczego interesuje Cię identyfikator w odpowiedzi, gdy otrzymasz dokument po identyfikatorze? Obawy związane z ruchem sieciowym są uzasadnione, jeśli masz duże dokumenty, wtedy warto zapłacić koszty przetwarzania źródła po stronie serwera. – javanna

+0

Nie przejmuję się _id w odpowiedzi, po prostu zwracam uwagę, że ponieważ '_id' jest zawarty w odpowiedzi, pomyślałem, że podanie' fields = _id' będzie służyć do przekazania serwerowi TYLKO tego polecenia pole, a nie dodawanie pracy (tj. konieczność przeanalizowania "_source") – eran

6

Jeśli w wersji wcześniejszej niż 2.1, możesz użyć "API Search Exists".

Przykład:

Szukaj indeks Twitter typu tweet przez użytkownika „kimchy”

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

Ciało odpowiedź będzie zawierać prawdziwe, czy fałszywe, czy są jakieś tweets przez tego użytkownika:

{ 
    "exists" : true 
} 

można również wysłać zapytanie w organizmie żądanie jak SO (POST lub GET zarówno pracę):

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

Odpowiedź będzie taka sama.

+2

Przypominamy, że oficjalny dokument mówi, że API Search Exists "Przestarzałe w wersji 2.1.0". "HEAD" jest zalecany sposób: https://www.elastic.co/guide/en/elasticsearch/guide/current/doc-exists.html – coderz

Powiązane problemy