2013-07-30 13 views
7

Sto provando a filtrare _id campo (indice non abilitato) in elasticsearch per intervallo. È possibile? Se sì, come può essere fatto? Ho letto nella documentazione di elasticsearch che possiamo usare 'id' per interrogare da _id e digitare, ma non riesco a vedere come può essere fatto con il filtro intervallo. (Non voglio abilitare l'indice su _id).Filter _id range in elasticsearch

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

credo che questo non può essere fatto. Ho la sensazione che '_id' sia un hash per una rapida ricerca, una volta che hai cancellato qualcosa perdi tutto il senso del suo" valore ". È necessario memorizzare l'id nel documento. – ramseykhalaf

+0

Sei sicuro dello storage ramsey? È necessario indicizzare l'id (che non è il caso per impostazione predefinita) poiché la query di intervallo corrisponde a documenti con campi che hanno termini nell'intervallo definito. – ThomasC

+0

Puoi indicizzare i tuoi documenti con un _id specificato (intero) invece del _id predefinito fornito da elastico? –

risposta

1

Forse è un po 'tardi, ma cerco di rispondere e forse la risposta è ancora utile per voi.
Visto i commenti fatti per colleghi, credo che due idee principali possono essere estratti:

  1. ID generato da elasticsearch non può essere utilizzato per filtrare o eseguire qualsiasi operazione diversa da GET o di ricerca id.
  2. Indice personalizzato valore uid è indovinato (e questo è il modo in cui mi piacerebbe provare a risolvere il problema)

Così, ho codificato un esempio per verificare se la soluzione 2 è possibile. parti fondamentali sono questi:

#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) 

Dopo aver indicizzato il campo id, è possibile filtrare per come si desidera. range filtro è uno di loro

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

Si può vedere un esempio di lavoro in this notebook