2014-04-24 12 views
5

Siamo la memorizzazione di un campo title nel nostro indice e si desidera utilizzare il campo per due scopi:Come ordinare sul campo analizzato/tokenizzato in Elasticsearch?

  1. Stiamo analizzando con un filtro Ngram modo da possiamo fornire completamento automatico e risultati immediati
  2. Vogliamo essere in grado di elencare i risultati utilizzando un ordinamento ASC sul campo title anziché sul punteggio.

L'indice/filtro/analizzatore è definito in questo modo:

array(
    'number_of_shards' => $this->shards, 
    'number_of_replicas' => $this->replicas, 
    'analysis' => array(
     'filter' => array(
      'nGram_filter' => array(
       'type' => 'nGram', 
       'min_gram' => 2, 
       'max_gram' => 20, 
       'token_chars' => array('letter','digit','punctuation','symbol') 
      ) 
     ), 

     'analyzer' => array(
      'index_analyzer' => array(
       'type' => 'custom', 
       'tokenizer' =>'whitespace', 
       'char_filter' => 'html_strip', 
       'filter' => array('lowercase','asciifolding','nGram_filter') 
      ), 
      'search_analyzer' => array(
       'type' => 'custom', 
       'tokenizer' =>'whitespace', 
       'char_filter' => 'html_strip', 
       'filter' => array('lowercase','asciifolding') 
      ) 
     ) 
    ) 
), 

Il problema che stiamo vivendo è risultati imprevedibili quando abbiamo Ordina sul campo title. Dopo aver fatto un po 'di ricerca, abbiamo trovato questo alla fine della pagina sort uomo al elasticsearch ... (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html#_memory_considerations)

Per i tipi di corda a base, il campo ordinato in base non dovrebbe essere analizzato/token.

Come possiamo entrambi analizzare il campo e ordinare in seguito? Abbiamo bisogno di memorizzare il campo due volte con uno utilizzando not_analyzed per ordinare? Poiché il campo _source memorizza anche il valore title nello stato originale, è possibile non utilizzarlo per l'ordinamento?

risposta

7

È possibile utilizzare il concetto integrato di Multi Field Type in Elasticsearch.

Il tipo multi_field consente di mappare più core_type dello stesso valore. Questo può essere molto utile, ad esempio, quando si desidera mappare un tipo di stringa, una volta quando viene analizzato e una volta quando non è analizzato.

Nel Riferimento Elasticsearch, consultare la guida String Sorting and Multi Fields su come impostare ciò che è necessario.

Si noti che la configurazione di mappatura multi campo è cambiata tra Elasticsearch 0.90.X e 1.X. Utilizzare la seguente guida appropriata in base alla versione:

+1

Esattamente quello che stavo cercando, grazie! Mi piace soprattutto la parte relativa a "L'approccio ingenuo di indicizzare la stessa stringa in due modi sarebbe quello di includere due campi separati nel documento" su una pagina correlata a quella a cui ci si è collegati;) – oucil

+0

Se si ha lo slug del titolo memorizzato , probabilmente questo è un campo "not_analyzed", quindi puoi ordinare per slug. – Liko

+0

Conosci la risposta per la seconda parte della domanda: "Poiché il campo _source sta anche memorizzando il valore del titolo nel suo stato originale, non può essere usato per ordinare?" Sono curioso di sapere perché in questo caso non è possibile ordinare per valore di origine? –

Problemi correlati