2015-10-20 18 views
9

Sto provando a interrogare un indice Elasticsearch per un intervallo di tempo, e inoltre ho un termine abbinato a un valore stringa specifico.Interrogare Elasticsearch combinando un intervallo e un termine match json format

Ho cercato questa domanda, che sembra abbastanza semplice:

{ 
    "query" : { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "method": "/customer/help" 
      } 
     }, 
     { 
      "range" : { 
      "startTime": { 
       "from" : "2015-10-20T13:00-04:00", 
       "to" : "2015-10-20T14:00-04:00" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

In questo caso, voglio che tutti i documenti all'interno di un determinato intervallo di tempo che hanno anche un valore metodo "/customer/help".

Nei miei risultati, sto ricevendo risultati che rientrano nell'intervallo di tempo, ma sto ricevendo documenti con vari valori per il campo "method", quando voglio solo risultati con "/customer/help" in quel campo.

+1

I vari valori per i valori di campo "metodo" che hanno "cliente" o "aiuto" insieme ai risultati che hanno l'atteso "cliente/aiuto"? In quel caso il problema è che Elasticsearch sta analizzando il campo (probabilmente analizzatore standard se non hai specificato la mappatura). Se non si prevede di utilizzare l'analizzatore per quel campo in futuro, è possibile impostare la proprietà "index": "not_analyzed" per quel campo. – eemp

+0

Gli altri valori hanno cliente/ ma ciò che è strano è che se eseguo una query separatamente dove sto escludendo l'intervallo, ottengo solo risultati dove il metodo = "cliente/aiuto". –

+0

Cosa stai passando per la dimensione param? È solo una coincidenza e stai vedendo solo un sottoinsieme di tutti i risultati quando tagli la query di intervallo? – eemp

risposta

13

Nella tua mappatura è necessario avere method come not_analyzed (o analizzati con keyword analizzatore) e la query dovrebbe usare term. In questo modo, il testo che indice nel metodo è indicizzato come è come un unico token e term si assicura che il testo di ricerca corrisponde esattamente il token indicizzato in method:

"method": { 
     "type": "string", 
     "index": "not_analyzed" 
    } 

e la query è necessario utilizzare:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "method": "/customer/help" 
      } 
     }, 
     { 
      "range": { 
      "startTime": { 
       "from": "2015-10-20T13:00-04:00", 
       "to": "2015-10-20T14:00-04:00" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Sì, si scopre che è stata la tokenizzazione di quella stringa che ha quindi distorto i risultati. Questa risposta è corretta, e grazie! Inoltre ho pensato che sarebbe stato utile sottolineare che l'utilizzo della query "match_phrase" invece della query "match" ha ottenuto anche i risultati corretti senza modificare l'indice. –

Problemi correlati