2017-05-06 23 views
1

このElasticSearchクエリを使用して、インデックスデータの集計数を調べました。名前付きフィルタを使用したElasticSearch集約クエリをNESTに変換するC#

SEARCHTERM:リンゴ、オレンジ、バナナ

{ 
    "size": 0, 
    "_source": { 
    "excludes": [ 
     "chapterData" 
    ] 
    }, 
    "aggs": { 
    "asPerBookID": { 
     "terms": { 
     "field": "bookID", 
     "size": 100000 
     }, 
     "aggs": { 
     "asPerChapterIndex": { 
      "terms": { 
      "field": "chapterIndex", 
      "min_doc_count": 1, 
      "size": 10000 
      }, 
      "aggs": { 
      "asPerChapterData": { 
       "nested": { 
       "path": "chapterData" 
       }, 
       "aggs": { 
       "asPerChapterDatadotData": { 
        "filters": { 
        "filters": { 
         "apple": { 
         "query_string": { 
          "query": "apple", 
          "default_field": "chapterData.data" 
         } 
         }, 
         "orange": { 
         "query_string": { 
          "query": "orange", 
          "default_field": "chapterData.data" 
         } 
         }, 
         "banana": { 
         "query_string": { 
          "query": "banana", 
          "default_field": "chapterData.data" 
         } 
         } 
        } 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    }, 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "nested": { 
      "query": { 
       "bool": { 
       "should": [ 
        { 
        "query_string": { 
         "query": "apple", 
         "default_field": "chapterData.data" 
        } 
        }, 
        { 
        "query_string": { 
         "query": "orange", 
         "default_field": "chapterData.data" 
        } 
        }, 
        { 
        "query_string": { 
         "query": "banana", 
         "default_field": "chapterData.data" 
        } 
        } 
       ], 
       "minimum_number_should_match": 1 
       } 
      }, 
      "path": "chapterData", 
      "inner_hits": { 
       "size": 10000 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

このクエリは、検索用語 'リンゴオレンジバナナ' のために作成されています。したがって、3つの名前付きフィルタがあります。しかし、ユーザーが「リンゴオレンジバナナブドウ」を検索した場合は、名前付きフィルタが必要です。 NESTを使用して挿入します。

以下は、SearchTermの名前付きフィルタを作成するために実装したコードです。

string[] words = pSearchTerm.Split(' '); 
NamedFiltersContainer myFilters = new NamedFiltersContainer(); 
foreach (var str in words) 
{ 
     myFilters.Add(str, new QueryStringQuery() { Query = str, DefaultField = "chapterData.data", DefaultOperator = lOperator, Analyzer = "whitespace" }); 
} 

さて、問題は、私はElasticSearchでクエリを実行するために流暢DSLを使用していると私はそれでmyFiltersを追加する方法がわからないです。誰も助けることができますか?

私にとって、どんな種類の助けになるでしょうか?

ありがとうございます。ここでは、words変数が必要な名前や用語が含まれていることを、仮定し

答えて

1

は結果NESTクエリ

client.Search<Sample>(search => search 
    .Size(0) 
    .Source(
     source => source.Excludes(
      excludes => excludes.Field(i => i.ChapterData) 
     ) 
    ).Aggregations(aggs => aggs 
     .Terms("asPerBookID", terms => terms 
      .Field(i => i.BookID) 
      .Aggregations(bookIDAggs => bookIDAggs 
       .Nested("asPerChapterData", nested => nested 
        .Path(i => i.ChapterData) 
        .Aggregations(chapterDataAggs => chapterDataAggs 
         .Filters("asPerChapterDatadotData", filters => filters 
          .NamedFilters(named => words 
           .Aggregate(named, (_named, word) => _named 
            .Filter(word, filter => filter 
             .QueryString(queryString => queryString 
              .Query(word) 
              .DefaultField("chapterData.data") 
             ) 
            ) 
           ) 
          ) 
         ) 
        ) 
       ) 
      ) 
     ) 
    ).Query(query => query 
     .Nested(nested => nested 
      .Path(i => i.ChapterData) 
      .Query(nestedQuery => nestedQuery 
       .Bool(boolean => boolean 
        .Should(words 
         .Select(word => (QueryContainer)new QueryStringQuery 
         { 
          Query = word, 
          DefaultField = "chapterData.data" 
         }).ToArray() 
        ) 
       ) 
      ) 
     ) 
    ) 
); 

は、それが単一の条件

+1

のためのローミングサービスは行いませんので、私はまた、ルートmust条件を削除しましたですあなたの答えから新しいことを学びました!多くの助け!ありがとう@ランダム – Callisto

関連する問題