2017-09-14 50 views
0

我正在使用Nest從索引中檢索具有不同文檔類型的數據。這些文件是:聯繫人和發票。目前,搜索描述符分爲兩個不同的字段。我已經簡化了搜索描述符,以顯示排序是如何工作的:對Elasticsearch文檔的二級排序無法正常工作

descriptor.Index(index) 
     .Type(esDocumentTypes) 
     .Query(q => q 
      .Bool(bq => bq 
       .Must(BuildMustClause(typeCodesForFilters)) 
       .Should(BuildShouldClause(typeCodesForFilters)) 
       .MustNot(BuildMustNotClause()) 
       .MinimumShouldMatch(1) 
      ) 
       ) 
     .Routing(RoutingValue) 
     .Size(DefaultMaxResults) 
     .TrackScores() 
     .Sort(st => st.Field(f => f.Field("_score").Descending())) 
     .Sort(st => st.Field(f2 => f2.Field("invoiceDate").Descending().IgnoreUnmappedFields())) 

文檔類型接觸不包含字段「invoiceDate」(僅發票憑證一樣)。我發現,當添加第二種排序時,它會隨着聯繫人的排序(但不包含包含此信息的發票)而混亂,即只有單一的_score排序返回聯繫人中排名最高的文檔,但添加輔助排序字段( 「invoiceDate」)現在會導致最高分數的聯繫人文檔沒有按順序返回。

當我用一個實際接觸的輔助搜索字段(例如contactName)替換時,我發現返回了正確排序的結果。

回答

0

您可以使用Sort的Missing參數。您可以提供默認值0,其缺少invoiceDate

語法是有點像

.Sort(st => st.Field(f2 => f2.Field("invoiceDate").Descending().Missing(0).IgnoreUnmappedFields())) 

瞭解更多關於失蹤here

希望這對你有幫助!

+0

感謝您的反饋意見。沒有Missing方法,但我嘗試使用MissingValue(它接受一個字符串),它不起作用。我試了兩個字符串「0」和DateTime.Now.ToString(CultureInfo.InvariantCulture) – CorribView

+0

嘿,我可能會缺少的語法。我知道上面的JSON查詢版本。可以是'https:// www.elastic.co/guide/en/elasticsearch/client/net-api/current/sort-usage.html#_fluent_dsl_example_19'這可以幫助你。 – Richa

+0

Thaks。您粘貼的網址不能很好地解析(您發佈的第一篇文章中包含的超鏈接也不包括在內) – CorribView

相關問題