2013-01-16 12 views
8

Utilizzo la ricerca elastica in C# utilizzando il client fortemente tipizzato NEST. Ho un indice contenente iscrizioni:Ricerca elastica utilizzando il potenziamento del campo NEST

[ElasticType(Name = "Entry", IdProperty = "Id")] 
public class Entry 
{ 
    public string Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string Award { get; set; } 
    public int Year { get; set; } 
} 

Dove anno è l'anno di entrata, ad esempio 2012, e il Premio è il tipo di premio vinto l'ingresso, che può essere nullo.

Quindi voglio cercare queste voci utilizzando l'aumento per proprietà diverse. Nel seguente codice, voglio che i risultati siano classificati più in alto rispetto al titolo, rispetto a quelli che corrispondono alla descrizione.

private IQueryResponse<Entry> GetMatchedEntries(string searchText) 
{ 
    return _elasticClient.Search<Entry>(
       body => 
       body.Query(q => 
          q.QueryString(qs => 
             qs.OnFieldsWithBoost(d => 
                   d.Add(entry => entry.Title, 5.0) 
                   .Add(entry => entry.Description, 2.0)) 
          .Query(searchText)))); 
} 

Mi è stato chiesto di amplificare i risultati da parte di coloro che hanno vinto premi, e anche aumentare le voci più recenti (ad esempio, sulla anno).

Come posso fare? È qualcosa che deve essere fatto come parte del servizio di indicizzazione o come parte della ricerca?

risposta

12

È possibile raggiungere questo obiettivo attraverso una combinazione di una query boosting query e custom_score

invece di incrementare anno alteriamo il punteggio in base all'anno perché:

(_score + 2013) > (_score + 1999) 

recenti risultati saranno galleggiare verso l'alto .

Utilizzando una query di potenziamento possiamo effettivamente abbassare di livello i risultati che mancano nel campo del premio.

vedere: http://www.elasticsearch.org/guide/reference/query-dsl/boosting-query.html http://www.elasticsearch.org/guide/reference/query-dsl/custom-score-query.html

_client.Search<Entry>(s=>s 
    .Query(q =>q 
     .Boosting(bq=>bq 
      .Positive(pq=>pq 
       .CustomScore(cbf=>cbf 
        .Query(cbfq=>cbfq 
         .QueryString(qs => qs 
          .OnFieldsWithBoost(d => 
           d.Add(entry => entry.Title, 5.0) 
           .Add(entry => entry.Description, 2.0) 
          ) 
          .Query(searchText) 
         ) 
        ) 
        .Script("_score + doc['year'].value") 
       ) 
      ) 
      .Negative(nq=>nq 
       .Filtered(nfq=>nfq 
        .Query(qq=>qq.MatchAll()) 
        .Filter(f=>f.Missing(p=>p.Award)) 
       ) 
      ) 
      .NegativeBoost(0.2) 
     ) 
    ) 
); 
+0

Grazie per questo distacco Martijn - sicuramente più utile la documentazione attuali. –

+1

Va notato che questo funzionerà SOLO con Elasticsearch <1.0. Dovresti utilizzare la query punteggio funzione invece in Elasticsearch> = 1.0. https://www.elastic.co/guide/en/elasticsearch/reference/0.90/query-dsl-function-score-query.html. Vedi anche la soluzione a https://www.elastic.co/guide/en/elasticsearch/reference/0.90/query-dsl-function-score-query.html –

Problemi correlati