2013-08-08 21 views
5

{"query":{ "match" : { "content" : "2" } }} corrisponde a tutti i documenti l'intero contenuto contiene il numero 2, tuttavia vorrei che il contenuto fosse esattamente 2, né più né meno - pensa al mio requisito in uno spirito di Java's String. equivale.Corrispondenza esatta (non sottostringa) in Elasticsearch

Analogamente per la seconda query, desidero associarmi quando il contenuto del documento è esattamente "3 3" e nulla più o meno. {"query":{ "match" : { "content" : "3 3" } }}

Come è possibile eseguire la corrispondenza esatta (String.equals) in Elasticsearch?

risposta

2

Senza visualizzare il mapping del tipo di indice e dati di esempio, è difficile rispondere direttamente a questo, ma ci proverò.

Lì per lì, direi che questo è simile a questa risposta qui (https://stackoverflow.com/a/12867852/382774), in cui si imposta semplicemente l'opzione del campo contentindex al not_analyzed nella vostra mappatura:

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

Edit: non sono stato chiaro abbastanza con la mia risposta originale, mostrata sopra. Io non intendo dire che si dovrebbe aggiungere il codice di esempio per la vostra domanda, volevo dire che è necessario specificare nel vostro tipo di indice mappatura che il campo url è di tipo string ed è indicizzato, ma non analizzato (not_analyzed).

Ciò indica a Elasticsearch di non disturbare l'analisi (tokenizzazione o filtraggio token) del campo durante l'indicizzazione dei documenti: è sufficiente archiviarlo nell'indice così come esiste nel documento. Per ulteriori informazioni sui mapping, vedere http://www.elasticsearch.org/guide/reference/mapping/ per un'introduzione e http://www.elasticsearch.org/guide/reference/mapping/core-types/ per le specifiche su not_analyzed (consiglio: cercarlo su quella pagina).

+0

Grazie per la tua risposta. Quindi qual'è la sintassi esatta per la query json? Ad esempio '{" query ": { " corrispondenza ": { " contenuto ":" 2 2 " } }, " contenuto ": {" tipo ":" stringa "," indice ":" not_analyzed " } } 'non funziona. –

+0

Prima di eseguire qualsiasi indicizzazione e query, è necessario inserire una mappatura in ElasticSearch: http://www.elasticsearch.org/guide/reference/api/admin-indices-put-mapping/ Quando si avvia la ricerca con i dati hai memorizzato in ElasticSearch in questo momento non troverai nulla perché i documenti sono ancora analizzati in modo "vecchio" (ad esempio nello spazio bianco) – jvwilge

2

Official Doc

Si consiglia di utilizzare il filtro al posto di partita.

{ 
"query" : { 
    "constant_score" : { 
     "filter" : { 
      "term" : { 
       "content" : 2 
      } 
     } 
    } 
} 

E hai documenti il ​​cui contenuto è esatto, 2 invece di 20 o 2.1

Problemi correlati