2016-04-25 37 views
7

Dopo aver cercato ampiamente e imbattersi risposte come queste -Solr funzione di query: Come utilizzare "segnare" campo per la creazione su misura segnando

Solr: Sort by score & an int field value

Use function query for boosting score in Solr

Sono ancora in grado di risolvere il seguente problema:

Come utilizzare il campo "punteggio" di un documento per creare una nuova funzione di punteggio e classificare i risultati di conseguenza. Qualcosa di simile -

new_score = punteggio * my_other_field

corrente Query -

http://localhost:8984/solr/suggest_new/select?q=tom&wt=json&indent=true&bq=_val_:"product(score,count_of_searches)" 

Questo è qualcosa che avrei fatto in elasticsearch -

"script_score" : { 
    "script" : "_score * doc['my_numeric_field'].value" 
} 

Please help/indicare collegamenti corretti. Molte grazie ! (Nota: Solr Versione: 4.10.4)

+0

Puoi pubblicare la tua domanda completa sul tuo database solr? Sarebbe utile cos'altro stai inviando con la tua query. –

+0

@MichealHarker - Ho provato molte cose. Nessuno di loro sembra funzionare comunque! :(Ho scoperto la stessa cosa in Elasticsearch, ma non sono riuscito a trovare l'equivalente Solr –

+0

Potresti trovare questo link illuminante se non l'hai già visto: http: //opensourceconnections.com/blog/2014/01/20/build-your-own-custom-lucene-query-and-scorer/ Non sono sicuro che Solr possa fare ciò che vuoi nel modo esatto in cui lo vuoi, quindi avrai bisogno di essere un po 'flessibile – TMBT

risposta

5

Quando si utilizza Dismax o eDismax si dovrebbe essere in grado di utilizzare solo il bf parametro di campo (Funzioni Boost) e riempirlo con il nome del campo numerico.

Esempio

Ho un indice con i documenti che contengono tra gli altri campi un valore numerico denominato first_publication_year. Quando eseguo un matchAllQuery *:* contro il mio indice, tutti i documenti otterranno un punteggio pari a 1. Questo rende più semplice vedere l'effetto del parametro bf, poiché 1 è un divisore facile. L'esempio andrebbe comunque con qualsiasi domanda.

/select?q=*:* 

Risultato

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 1 
    }, 
    "response": { 
    "numFound": 10007277, 
    "start": 0, 
    "maxScore": 1, 
    "docs": [ 
     { 
     "first_publication_year": 2002, 
     "score": 1 
     } 
    ] 
    } 
} 

Ora voglio aumentare i documenti in base a quel campo, così aggiungo che il nome del campo come bf parameter

/select?q=*:*&bf=first_publication_year 

Risultato

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 1 
    }, 
    "response": { 
    "numFound": 10007277, 
    "start": 0, 
    "maxScore": 1425.5273, 
    "docs": [ 
     { 
     "first_publication_year": 2015, 
     "score": 1425.5273 
     } 
    ] 
    } 
} 

Se pensi che Se la spinta è troppo bassa, è possibile regolarla con function queries. Questo campione moltiplica il primo anno di pubblicazione con 10.

/select?q=*:*&bf=product(first_publication_year,10) 

Risultato

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 465 
    }, 
    "response": { 
    "numFound": 10007277, 
    "start": 0, 
    "maxScore": 14248.908, 
    "docs": [ 
     { 
     "first_publication_year": 2015, 
     "score": 14248.908 
     } 
    ] 
    } 
} 

Riferimenti

Questo è anche documentato in the Solr Reference Manual.

BF (Funzioni Boost) Parametro

Il parametro bf specifica le funzioni (con spinte opzionali) che verranno utilizzati per costruire FunctionQueries che saranno aggiunti alla query principale dell'utente come clausole opzionali che influenza il punteggio. È possibile utilizzare qualsiasi funzione supportata nativamente da Solr e un valore di incremento. Per esempio:

recip(rord(myfield),1,2,3)^1.5 
1

Penso che si dovrebbe fare il tempo indice di amplificazione per i documenti Solr. È necessario aggiungere un attributo boost opzionale al documento. Se si utilizza SolrJ, è possibile utilizzare document.setDocumentBoost (x) per aumentare i documenti di un fattore di spinta x

Potete anche seguire this collegamento per la descrizione dettagliata di indicizzazione e di query tempo aumentando di Solr Documenti.

+0

Non penso di essere alla ricerca di boost statico (tempo dell'indice). Sarebbe stato semplice. –

2

Utilizzare la funzione query() per ottenere il valore di 'punteggio'.

Quindi, se si sta provando per questo: new_score = punteggio * popolarità, utilizzare il seguente formato.

q = searchterm & sorta = prodotto (query ($ q), la popolarità) disc

query ($ q) - restituisce il punteggio TF-IDF per la query. Quindi questo è l'equivalente dell'uso del campo 'punteggio'.