2013-01-16 11 views
8

का उपयोग करके लोचदार खोज 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; } 
} 

कहाँ वर्ष प्रविष्टि, जैसे 2012 के वर्ष है, और पुरस्कार एंट्री जीता के प्रकार, जो अशक्त हो सकता है।

मैं फिर विभिन्न गुणों के लिए बूस्टिंग का उपयोग करके इन प्रविष्टियों को खोजना चाहता हूं। निम्नलिखित कोड में, मैं विवरण पर मिलान करने वाले लोगों की तुलना में, शीर्षक पर मिलान करने वाले परिणामों को उच्च स्थान पर रखना चाहता हूं।

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)))); 
} 

मैं अब उन है जो पुरस्कार जीता द्वारा परिणामों को बढ़ावा, और भी नए प्रविष्टियां (वर्ष तक यानी) बढ़ाने के लिए कहा गया है।

मैं यह कैसे कर सकता हूं? क्या यह ऐसा कुछ है जो अनुक्रमण सेवा के हिस्से के रूप में या खोज के हिस्से के रूप में किया जाना चाहिए?

उत्तर

12

आप एक boosting क्वेरी और custom_score क्वेरी का एक संयोजन

के बजाय बढ़ाने साल के माध्यम से इस लक्ष्य को हासिल कर सकते हैं हम वर्ष के आधार पर स्कोर को बदल क्योंकि:

(_score + 2013) > (_score + 1999) 

नए परिणाम शीर्ष करने के लिए तैर सकती है ।

एक बढ़ती क्वेरी का उपयोग करके हम पुरस्कार क्षेत्र को खोने वाले परिणामों को प्रभावी ढंग से हटा सकते हैं। वर्तमान डॉक्स से निश्चित रूप से और अधिक उपयोगी - 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

इस Martijn पोस्ट करने के लिए धन्यवाद:

देखते हैं। –

+1

यह ध्यान दिया जाना चाहिए कि यह केवल Elasticsearch <1.0 के साथ काम करेगा। आपको Elasticsearch> = 1.0 में फ़ंक्शन स्कोर क्वेरी का उपयोग करना चाहिए। https://www.elastic.co/guide/en/elasticsearch/reference/0.90/query-dsl-function-score-query.html। Https://www.elastic.co/guide/en/elasticsearch/reference/0.90/query-dsl-function-score-query.html के समाधान भी देखें –

संबंधित मुद्दे