2013-08-28 14 views
18

Esiste un modo in elasticsearch per aumentare l'importanza della frase esatta che appare nel documento? Ad esempio, se cercassi la frase "sviluppatore web" e se le parole "sviluppatore web" fossero apparse insieme, sarebbero state potenziate di 5 rispetto a "web" e "sviluppatore" che apparivano separatamente in tutto il documento. In tal modo ogni documento che conteneva "sviluppatore web" insieme apparirebbe prima nei risultati.elasticsearch aumenta l'importanza dell'esatta corrispondenza a frase

risposta

24

È possibile combinare diverse query insieme utilizzando uno bool query e si può anche dare un ulteriore impulso. Supponiamo che tu abbia un regolare match query per entrambi i termini, indipendentemente dalle loro posizioni, e quindi una query a frase con una maggiore spinta.

Qualcosa di simile a quanto segue:

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "field": "web developer" 
      } 
     }, 
     { 
      "match_phrase": { 
      "field": "web developer", 
      "boost": 5 
      } 
     } 
     ], 
     "minimum_number_should_match": 1 
    } 
    } 
} 
+1

ma cosa succede quando voglio effettuare tale interrogazione su più indici e un insieme variabile di campi? Per quanto ne so, match_phrase funziona solo con un nome di campo specifico. Nel mio caso ho bisogno (genericamente parlando) di usare qualcosa come '{" query_string ": {" query ":" la mia frase esatta "," campi ": [" tipoA.fieldA "," tipoB.fieldB "]}}} – leandroico

7

In alternativa alla risposta s' javanna, si potrebbe fare qualcosa di simile con must e should clausole all'interno di una query bool:

{ 
    "query": { 
    "bool": { 
     "must": { 
      "match": { 
      "field": "web developer", 
      "operator": "and" 
      } 
     }, 
     "should": { 
      "match_phrase": { 
      "field": "web developer" 
      } 
     } 
    } 
    } 
} 

testato , ma credo che la clausola must corrisponda ai risultati che contengono sia "web" e "devel" oper 'e la clausola should aumenterà il punteggio delle frasi che corrispondono allo' sviluppatore web '.

+0

Sì, questo ha una maggiore rilevanza per un documento con 'web developer' in esso, ma l'OP voleva controllare l'importanza relativa (usando il numero' 5'). Ad esempio, forse in un caso raro, un documento con tonnellate di token 'web' e' developer' che appaiono dappertutto potrebbe battere un documento con un singolo 'sviluppatore web '. Con questa risposta date uguale importanza a entrambe queste domande ([ref] (https://www.elastic.co/guide/en/elasticsearch/guide/corrent/bool-query.html#_score_calculation)). – Garrett

1

Ho usato sotto la query di esempio nel mio caso che funziona. Porta risultati esatti + sfocati ma quelli esatti sono potenziati!

{ "query": { 
"bool": { 
    "should": [ 
    { 
     "match": { 
     "name": "pala" 
     } 
    }, 
    { 
     "fuzzy": { 
     "name": "pala" 
     } 
    } 
    ] 
}}} 
0

Penso che il suo comportamento predefinito già con query di ricerca "o" operatore. Filtra prima la frase "sviluppatore web" e poi termini come "web" o "develeper". Sebbene tu possa aumentare la tua query usando le risposte sopra. Correggimi se sbaglio.

2

Si potrebbe provare a utilizzare il punto di riferimento per eseguire un'esatta corrispondenza esatta sui risultati iniziali. Dai documenti:

"Il Rescoring può aiutare a migliorare la precisione riordinando solo i primi (es. 100 - 500) documenti restituiti dalle fasi query e post_filter, utilizzando un algoritmo secondario (solitamente più costoso), invece di applicare il costoso algoritmo a tutti i documenti nell'indice. "

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-rescore.html

Problemi correlati