2017-09-14 25 views
0

インデックスから異なるドキュメントタイプのデータを取得するのにNestを使用しています。書類は連絡先と請求書です。現在、検索ディスクリプタは2つの異なるフィールドでソートされます。私は、ソートがどのように機能するかを示すために、検索記述子を簡素化しました: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」(唯一の請求書ドキュメントはありません)のためのフィールドが含まれていません。私はこの2番目の並べ替えが追加されたときに連絡先(ただし、この情報を含む請求書ではない)のスコアの並べ替えを混乱させることがわかります。つまり、単一の_score並べ替えが連絡先の最高ランクの文書を返しますが、 "invoiceDate")により、最高スコア連絡文書が順番に返されなくなりました。

2次検索フィールドを実際に接触しているフィールド(例:contactName)に置き換えると、正しく並べ替えられた結果が返されます。

答えて

0

並べ替えの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。あなたがペーストしたURLは残念なことに解決しません(最初の投稿にハイパーリンクは含まれていません)。 – CorribView

関連する問題