2016-05-04 13 views
1

Elastic search .Net NESTクライアントを使用しています。 私がしようとしているのは、スコアリングする前に日付範囲で結果をフィルタリングすることです。日付範囲でElasticsearch NESTフィルタ

オブジェクトイニシャライザの構文を使用しています。これは私に最も適しているためです。

私は私が望むものを達成しています

 var filter = new FilteredQuery(); 

     var queryForm = new TermQuery(); 
     queryForm.Field = "id"; 
     queryForm.Value = filterModel.Id; 

     filter.Query &= queryForm; 

     var rangeQuery = new DateRangeQuery(); 
     rangeQuery.Field = "datetime"; 
     rangeQuery.GreaterThanOrEqualTo = filterModel.DateBegin.Value.AddDays(-1); 
     rangeQuery.LessThanOrEqualTo = filterModel.DateEnd.Value.AddDays(1); 
     filter.Filter = rangeQuery; 

     // Use boolean query 
     searchRequest.Query = new BoolQuery() && filter; 

これは私が期待してのようなJSONを要求できます:

{ 
    "from": 0, 
    "size": 0, 
    "query": { 
    "filtered": { 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "id": { 
        "value": "XXXX" 
       } 
       } 
      } 
      ] 
     } 
     }, 
     "filter": { 
     "range": { 
      "datetime": { 
      "gte": "2015-12-31T00:00:00", 
      "lte": "2016-05-05T00:00:00" 
      } 
     } 
     } 
    } 
    } 
} 

しかし、ドキュメンテーションを約filtered query「2.0.0-beta1の中で推奨されていませんと言う使用してください。 boolの代わりにクエリのための句とフィルタのフィルタ句を使用します。

これはフィルタを含むことがわかった唯一の方法であるため、NEST Objectイニシャライザの構文でこれを行うより良い方法がありますか? どのように私は "フィルタ句をフィルタに使用する"または私は範囲のクエリを使用してフィルタを忘れる必要がありますか?

ありがとうございます!

答えて

5

ES 2.0に付属しているNEST 2.0の変更点を説明しているblog postがあります。

オブジェクト初期化子の構文を使用してbool/filterクエリにごtermrangeフィルタを追加するためには、あなたはtermクエリがboolクエリのフィルタ句内にラップされるようになります新しい+特別な構築物でそれを行うことができますが。

var queryForm = +new TermQuery(); 
    queryForm.Field = "id"; 
    queryForm.Value = filterModel.Id; 

    var rangeQuery = +new DateRangeQuery(); 
    rangeQuery.Field = "datetime"; 
    rangeQuery.GreaterThanOrEqualTo = filterModel.DateBegin.Value.AddDays(-1); 
    rangeQuery.LessThanOrEqualTo = filterModel.DateEnd.Value.AddDays(1); 

    searchRequest.Query = queryForm && rangeQuery 

使用例にリンクするためhere

+0

++の詳細を参照してください:) –

関連する問題