2013-06-24 12 views
13

Sto usando ElasticSearch e mi sto chiedendo se posso usare la sfaccettatura per recuperare alcune statistiche sui miei risultati, in particolare, le persone più citate nei miei risultati. Ho già un campo che contiene quell'informazione. Ma in questo momento, i miei risultati di sfaccettatura rompono i dati in quel campo per termine quando vorrei raggrupparlo in più parole.Ottenere le faccette ElasticSearch per il trattamento di contenuto di più campi come termine atomico

Ie: se l'utente cerca John, vorrei ottenere dati come

{ 
    [...] 
    "facets" : { 

     "topPeople" : { 
     "_type" : "terms", 
     "missing" : 0, 
     "total" : 1739884, 
     "other" : 1705319, 
     "terms" : [ { 
      "term" : "John Smith", 
      "count" : 13954 
      }, { 
      "term" : "John Snow", 
      "count" : 1432 
      }, { 
      "term" : "John Baird", 
      "count" : 770 
      }] 
     } 
    } 

Invece, elasticsearch rompe i risultati per durata e restituisce qualcosa di simile:

{ 
    [...] 
    "facets" : { 

     "topPeople" : { 
     "_type" : "terms", 
     "missing" : 0, 
     "total" : 1739884, 
     "other" : 1705319, 
     "terms" : [ { 
      "term" : "John", 
      "count" : 1739884 
      }, { 
      "term" : "Smith", 
      "count" : 13954 
      }, { 
      "term" : "Snow", 
      "count" : 1432 
      }] 
     } 
    } 

I leggere da qualche parte che se si imposta l'indice per non essere analizzato, ElasticSearch dovrebbe restituire la stringa completa di parole. Tuttavia, voglio comunque che l'utente sia in grado di effettuare ricerche sul campo. Vorrei evitare di duplicare il campo per avere uno non analizzato. C'è un modo per ottenere raggruppamenti per campo con ElasticSearch?

Attualmente sto usando la seguente query sfaccettatura:

{ 
"query" : { 
    [...] 
}, 
"facets" : { 
    "topPeople" : { 
    "terms" : { 
     "field" : "people", 
     "size" : 3 
     } 
    } 
    } 
} 

risposta

14

Sei sulla strada giusta. Hai bisogno di un indice che non sia analizzato per fare ciò che stai chiedendo, ma non devi sacrificare il modo in cui l'utente cerca sul campo. La risposta qui (per le versioni < 1.x) è Multi Field Type. Per il vostro esempio, si vorrà la mappatura a guardare qualcosa di simile:

"topPeople" : { 
     "type" : "multi_field", 
     "fields" : { 
      "topPeople" : {"type" : "string", "index" : "analyzed"}, 
      "raw" : {"type" : "string", "index" : "not_analyzed"} 
     } 
    } 

Quando si cerca, si può continuare per cercare topPeople, ma quando si sfaccettatura, si sfaccettare su topPeople.raw.

+1

Ho usato molti campi "not_analyzed" – Gizzmo

+2

ora questo viene fatto usando il parametro fields. Essenzialmente qualsiasi tipo di campo principale (escluso oggetto e nidificato) ora accetta un parametro di campo. [per riferimento] (https://www.elastic.co/guide/en/elasticsearch/reference/1.6/_multi_fields.html) – gigaDIE

Problemi correlati