elasticsearch
2012-05-14 1 views 21 likes 
21

Ho il seguente campo nella mia definizione di mappatura:Perché il campo "not_analyzed" di Elasticsearch è suddiviso in termini?

... 
"my_field": { 
    "type": "string", 
    "index":"not_analyzed" 
} 
... 

Quando ho indice di un documento con valore my_field = 'test-some-another' tale valore è suddiviso in 3 termini: test, some, another.

Cosa sto sbagliando?

ho creato il seguente indice:

curl -XPUT localhost:9200/my_index -d '{ 
    "index": { 
    "settings": { 
     "number_of_shards": 5, 
     "number_of_replicas": 2 
    }, 
    "mappings": { 
     "my_type": { 
     "_all": { 
      "enabled": false 
     }, 
     "_source": { 
      "compressed": true 
     }, 
     "properties": { 
      "my_field": { 
      "type": "string", 
      "index": "not_analyzed" 
      } 
     } 
     } 
    } 
    } 
}' 

Poi ho indice il seguente documento:

curl -XPOST localhost:9200/my_index/my_type -d '{ 
    "my_field": "test-some-another" 
}' 

allora io uso il plugin https://github.com/jprante/elasticsearch-index-termlist con il seguente API: curl -XGET localhost:9200/my_index/_termlist Questo mi dà il seguente risposta:

{"ok":true,"_shards":{"total":5,"successful":5,"failed":0},"terms": ["test","some","another"]} 

+0

È possibile aggiungere un esempio più dettagliato che mostri il problema? Come hai determinato che il test-un-altro-altro è effettivamente suddiviso in 3 termini? – imotov

+0

Ho modificato la mia domanda per rispondere alla tua. Grazie per la rapida risposta! – Georgi

risposta

22

Verificare che la mappatura è in realtà sempre impostate eseguendo:

curl localhost:9200/my_index/_mapping?pretty=true

Il comando che crea l'indice sembra essere corretta. Non dovrebbe contenere "index" : { come elemento radice. Prova questo:

curl -XPUT localhost:9200/my_index -d '{ 
    "settings": { 
    "number_of_shards": 5, 
    "number_of_replicas": 2 
    }, 
    "mappings": { 
    "my_type": { 
     "_all": { 
     "enabled": false 
     }, 
     "_source": { 
     "compressed": true 
     }, 
     "properties": { 
     "my_field": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
     } 
    } 
    } 
}' 
+0

Grazie! La mia definizione di mappatura viene applicata ora. – Georgi

4

In elasticsearch un campo è indicizzato quando va all'interno dell'indice invertito, la struttura di dati che Lucene utilizza per fornire le sue grandi e veloci funzionalità di ricerca full-text. Se vuoi cercare su un campo, devi indicizzarlo. Quando indicizzi un campo puoi decidere se lo vuoi indicizzare così com'è, o se vuoi analizzarlo, il che significa decidere un tokenizzatore da applicare ad esso, che genererà un elenco di token (parole) e un elenco di token filtri che possono modificare i token generati (anche aggiungere o eliminare alcuni). Il modo in cui indicizzi un campo influisce su come puoi effettuare una ricerca su di esso. Se indicizzi un campo ma non lo analizzi e il suo testo è composto da più parole, sarai in grado di trovare quel documento solo alla ricerca di quel testo specifico esatto, spazi inclusi.

È possibile avere campi su cui si desidera effettuare la ricerca e non visualizzare mai: indicizzati e non memorizzati (predefinito in lucene). È possibile avere campi che si desidera cercare e anche recuperare: indicizzati e memorizzati. È possibile avere campi su cui non si desidera effettuare la ricerca, ma si desidera recuperarli per visualizzarli.

 Problemi correlati

  • Nessun problema correlato^_^