2013-08-21 9 views
5

Qualcuno potrebbe consigliarmi su come eseguire il punteggio personalizzato in ElasticSearch quando si cerca una serie di parole chiave da una serie di parole chiave?ElasticSearch Custom Scoring con array

Per esempio, diciamo che v'è una serie di parole chiave in ogni documento, in questo modo:

{ // doc 1 
    keywords : [ 
      red : { 
        weight : 1 
       }, 
      green : { 
        weight : 2.0 
       }, 
      blue : { 
        weight: 3.0 
       }, 
      yellow : { 
        weight: 4.3 
       } 
     ] 
}, 
{ // doc 2 
    keywords : [ 
      red : { 
        weight : 1.9 
       }, 
      pink : { 
        weight : 7.2 
       }, 
      white : { 
        weight: 3.1 
       }, 
     ] 
}, 
... 

E voglio ottenere punteggi per ogni documenti sulla base di una ricerca che soddisfa le parole chiave contro questa matrice:

{ 
    keywords : [ 
      red : { 
        weight : 2.2 
       }, 
      blue : { 
        weight : 3.3 
       }, 
     ] 
} 

Ma invece di determinare se corrispondono, voglio usare un algoritmo di punteggio molto specifico:

enter image description here

Segnare un singolo campo è abbastanza facile, ma non so come gestirlo con gli array. qualche idea?

+0

Ciao @Aleksi Asikainen, hai trovato una soluzione a questo (usando elasticsearch)? –

+0

Paura di no, ma al giorno d'oggi ElasticSearch ha un migliore supporto per il punteggio delle funzioni, che ritengo possa essere sufficiente per ottenere questo risultato: http://www.elastic.co/guide/en/elasticsearch/reference/0.90/query-dsl- function-score-query.html –

risposta

1

Ah una domanda interessante! (E uno penso che possiamo risolvere con qualche comunicazione)

In primo luogo, hai considerato il punteggio degli script personalizzati? Sono abbastanza sicuro che tu possa fare questo lentamente con lo con quello. Se lo facessi, prenderei in considerazione la possibilità di fare un rescore phase dove il punteggio viene calcolato solo dopo che il documento è noto come hit.

Tuttavia, Penso che si possa fare questo con le macchine elasticsearch. Come posso capire, stai facendo un punto-prodotto tra i documenti, (dove i pesi sono in realtà a metà strada tra ciò che stai specificando e 1).

Quindi, il mio primo suggerimento rimuove il termine x/2n dal "punteggio personalizzato" (prodotto punto) e metti i pesi a metà tra 1 e il peso personalizzato (ad esempio 1.9 => 1,45).

... Mi dispiace dovrò tornare e modificare questa domanda. Stavo pensando di utilizzare documenti nidificati con un livello di spinta campo definito, ma ahimè, il parametro _boost mappatura è only available for the root doc

P.S. Hai solo pensato: potresti avere campi con livelli di boost definiti e memorizzare i termini, quindi puoi farlo facilmente ma perdi precisione. Un documento sarebbe quindi simile:

{ 
    "boost_1": ["aquamarine"], 
    "boost_2": null, //don't need to send this, just showing for clarity 
    ... 
    "boost_5": ["burgundy", "fuschia"] 
    ... 
} 

Si potrebbe quindi definire una questi boostings nella tua mappatura. Una cosa da notare è che un campo boost valorizza il campo _all, quindi ora hai un pacchetto di termini ponderati nel tuo campo _all, quindi potresti creare una query bool: should, con molte query term con boost differente (per pesi del secondo documento).

Fatemi sapere cosa ne pensate! Una domanda molto, molto interessante.

+0

Grazie per la lunga risposta. Penso che tu abbia ragione che il punteggio dovrebbe accadere tramite la fase di recupero, se non altro. Sfortunatamente, sono disponibili pochissime informazioni su come fare il risanamento con gli array, da qui la domanda ...Al momento ho scelto di cercare usando ElasticSearch e quindi eseguire il punteggio dei risultati in PHP. Questo è estremamente dispendioso, quindi preferirei spostare completamente il processo di scoring in ElasticSearch. –