2013-07-23 10 views
5

Voglio le query per restituire un punteggio che viene calcolato come:Come calcolare il punteggio in base al numero di termini di ricerca in elasticsearch?

verificarsi di ogni termine di ricerca nel titolo + Descrizione/numero di termini di ricerca

ad esempio

EbSearch.add [ 
new_job(id: 1, title: "Java Programmierer", 
description: "Java Programmierer") 
] 

res = EbSearch.search("Java Programmierer").results.first.score.should == 4 

nel momento in cui output 8, perché fa la query per ogni termine e lo riassume. Potrei semplicemente dividere in seguito, ma non ho i termini della query analizzati, quindi i composti potrebbero rovinare il punteggio.

La query è strutturato come segue:

search = Tire.search index_name do 
    query do 
    dis_max do 
     query { string query, fields: ['title^3', 'description.with_synonyms^0.5'], use_dis_max: false, default_operator: "OR" } 
     query { string query, fields: ['title^3', 'description.without_synonyms'], use_dis_max: false, default_operator: "OR"} 
    end 
    end 
end 

Qualsiasi idea di come potrei risolvere questo problema è molto apprezzato.

EDIT

ho capito che non fornito abbastanza contesto.

Ecco alcuni altri frammenti che ho già elaborato. Ho scritto un CustomityProvider personalizzato per disabilitare idf e normalizzazione. https://gist.github.com/outsmartin/6114175

Il codice pneumatico completo si trova qui https://gist.github.com/6114186. È un po 'più complicato dell'esempio, ma dovrebbe essere comprensibile.

+0

Per composti intendi come la frase di ricerca "ricerca elastica" potrebbe essere tokenizzata in 2 token? Volete dividerlo per 2 allora? – ramseykhalaf

+0

Ad esempio, ma poiché ho molti termini in tedesco, devo dividere anche "Javaprogrammierer" in Java e Programmierer. Poiché la query viene eseguita con tutti i termini, voglio che il punteggio rimanga tra 0 e 4 nell'esempio. – outsmartin

+0

Sono ancora un po 'confuso ... Dalla tua descrizione di cui sopra, ho capito che la ricerca di "Java Programmierer" dovrebbe avere un punteggio di: (4: occorrenza di ogni termine di ricerca nel titolo + descrizione)/(2: numero di termini della query) = 2. Ma tu dici che vuoi che il punteggio sia 4. Sono un po 'confuso. – ramseykhalaf

risposta

3

È possibile ottenere facilmente un elenco di termini analizzati per la query utilizzando il comando analyze. Tuttavia, devo dire che il punteggio di Elasticsearch è molto più complicato di quanto possa sembrare quando esegui i tuoi test su piccoli indici. Puoi trovare la formula che Elasticsearch sta utilizzando in Lucene documentation ed è possibile utilizzare il comando explain per vedere come questa formula viene applicata ai risultati. Vorrei anche suggerire di testare e sintonizzare il tuo algoritmo di punteggio su un indice con un singolo frammento o usando il tipo di ricerca dfs_query_then_fetch, che produce risultati più precisi su piccoli indici.

+0

Ho aggiornato la domanda con qualche altra informazione. L'idea con il comando analizza sembra promettente, l'unico inconveniente è un'altra richiesta al server elasticsearch. – outsmartin

+0

ha funzionato, grazie mille – outsmartin

Problemi correlati