2013-07-30 6 views
7

Próbuję filtrować pole _id (indeks nie włączony) w elastycznym przeszukiwaniu według zakresu. Czy to możliwe? Jeśli tak, jak można to zrobić? Czytałem w dokumentacji elasticsearch, że możemy użyć "ids" do zapytania przez _id i type, ale nie widzę, jak można to zrobić za pomocą filtru zakresu. (Nie chcę włączać indeksu na _id).Filtr _id range in elasticsearch

{ 
    "from": 0, 
    "size": 20, 
    "query": { 
    "match_all": {} 
    }, 
    "filter": { 
     "range": { 
      "_id": { 
      "gt": "51f7b6b7710c42b136027581" 
      } 
     } 
    }, 
    "sort": { 
    "pubdate": { 
     "order": "desc" 
    } 
    } 
} 
+2

myślę, że nie można zrobić. Mam przeczucie, że '_id' jest zahartowany dla szybkiego wyszukiwania, gdy raz coś zhanglujesz, tracisz poczucie jego" wartości ". Musisz zapisać identyfikator w dokumencie. – ramseykhalaf

+0

Czy jesteś pewien co do ramsey przechowywania? Musisz indeksować identyfikator (co nie jest przypadkiem domyślnie), ponieważ zapytanie zakresu dopasowuje dokumenty do pól, które mają terminy w zdefiniowanym zakresie. – ThomasC

+0

Czy możesz zindeksować dokumenty o określonej (całkowitej) liczbie _id zamiast domyślnej opcji _id dostarczonej przez elastyczne? –

Odpowiedz

1

Może trochę za późno, ale staram się odpowiedzieć i być może odpowiedź jest dla ciebie przydatna.
widziany komentarze wykonane przez współpracowników, myślę, że dwie główne idee mogą być wyodrębnione:

  1. Generated id przez Elasticsearch nie mogą być używane do filtrowania lub wykonać dowolną operację inną niż GET o poszukiwaniu id.
  2. Index zwyczaj wartość uid jest domyślić (i tak właśnie bym spróbować rozwiązać ten problem)

Tak, mam zakodowane przykład sprawdzić, czy roztwór 2 jest możliwe. Główne części są takie:

#cluster node to query 
es = Elasticsearch(['localhost:9200',]) 
records = [ 
    #some custom data 
] 
for idx,r in enumerate(records): 
    _index_config = dict(index_config) 
    #set Elasticsearch uid 
    _index_config['_id'] = idx 
    #replicate in a document field to be able to filter for 
    r['id'] = idx 
    kwargs['body'].append({'index' : _index_config}) 
    kwargs['body'].append(r) 

_ = es.bulk(**kwargs) 

Kiedy już indeksowane pole id można filtrować przez nią, jak chcesz. range filtr jest jednym z nich

elasticsearch_query = { 
    "query": { 
     "filtered": { 
      "filter": { 
       "range": { 
        "id": { 
         "gte" : 3, 
         "lt" : 5 
        } 
       } 
      } 
     } 
    } 
} 

można zobaczyć przykład pracę w this notebook

Powiązane problemy