2013-08-14 34 views
33

Ho un campo in un campo ElasticSearch che non voglio analizzare, io. e. dovrebbe essere memorizzato e confrontato alla lettera. I valori conterranno lettere, numeri, spazi bianchi, trattini, barre e forse altri personaggi.Come non analizzare in ElasticSearch?

Se non fornisco un analizzatore nella mia mappatura per questo campo, il predefinito utilizza ancora un tokenizer che esegue l'hacking della mia stringa letterale in blocchi di parole. Non lo voglio

C'è un analizzatore super semplice che, fondamentalmente, non analizza? O c'è un modo diverso di denotare che questo campo non deve essere analizzato?

Io creo solo l'indice, non faccio altro. Posso usare analizzatori come "inglese" per altri campi che sembrano nomi incorporati per analizzatori preconfigurati. C'è una lista di altri nomi? Forse ce n'è uno adatto ai miei bisogni (ovvero non fare nulla con l'input).

Questo è il mio mappatura attualmente:

{ 
    "my_type": { 
    "properties": { 
     "my_field1": { "type": "string", "analyzer": "english" }, 
     "my_field2": { "type": "string" } 
    } 
    } 
} 

my_field1 è dipendente dalla lingua; questo sembra funzionare. my_field2 deve essere testuale. Mi piacerebbe dare un analizzatore lì che semplicemente non fa nulla.

Un valore di esempio per my_field2 sarebbe "B45c 14/04".

risposta

47
"my_field2": { 
    "properties": { 
     "title": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
    } 
} 

Controlla qui, https://www.elastic.co/guide/en/elasticsearch/reference/1.4/mapping-core-types.html, per ulteriori informazioni.

+0

Ah! Questo è quello che stavo cercando. Mi sono imbattuto in più volte in "not_analyzed", ma ho sempre pensato che usarlo significherebbe che non può essere per niente cercato (apparentemente questo è il significato di "no"). Il link alla documentazione è stato illuminante, grazie! (E dato il tempo accetterò questa risposta a meno che non appaia ancora più utile.) – Alfe

+1

@Alfe, puoi avere a [questa risposta per maggiori informazioni] (http://stackoverflow.com/questions/16911633/not-indexed-field -is-stored-in-index/16923084 # 16923084) inclusa l'opzione 'indice: no' – ramseykhalaf

+2

Possiamo impostarlo globalmente in modo che non analizzi il tipo di stringa per tutti? – coderek

2

L'analizzatore keyword può anche essere utilizzato.

// don't actually use this, use "index": "not_analyzed" instead 
{ 
    "my_type": { 
    "properties": { 
     "my_field1": { "type": "string", "analyzer": "english" }, 
     "my_field2": { "type": "string", "analyzer": "keyword" } 
    } 
    } 
} 

Come notato qui: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-keyword-analyzer.html, ha più senso per contrassegnare quei campi come not_analyzed.

Ma l'analizzatore keyword può essere utile quando è impostato di default per l'intero indice.

UPDATE: Come detto in commenti, string non è più supportato in 5.X

+3

, l'analizzatore 'keyword' analizza il campo, ma solo una volta nel suo insieme. potrebbe non essere desiderato quando questo è impostato su alcuni grandi campi di testo come ~ MB contenuti - andrà nell'indice e mangerà delle risorse. – ulkas

+1

Inoltre, il campo 'stringa' non è supportato per gli indici creati in 5.x in favore dei campi' text' e 'keyword'. – lifeisfoo

3

Questo non è più vero a causa della rimozione del string (sostituito da keyword e ``) tipo descritto here. Invece dovresti usare "index": true | false. Per esempio VECCHIO:

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

diventa il nuovo:

{ 
    "foo": { 
    "type" "keyword", 
    "index": true 
    } 
} 

Questo significa che il campo viene indicizzato, ma come viene digitato come keyword non analizzati in modo implicito.