2017-05-06 94 views
1

我編寫了此ElasticSearch查詢來查找索引數據中術語的聚合計數。針對搜索詞 '蘋果橘子香蕉' 創建蘋果橘子香蕉將具有命名過濾器的ElasticSearch聚合查詢轉換爲NEST C#

{ 
    "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 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

這個查詢:

SEARCHTERM。所以,有三個命名過濾器。但如果用戶搜索「蘋果橙香蕉葡萄」,應該有指定的過濾器。我想用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" }); 
} 

,問題是我用流利的DSL以執行ElasticSearch查詢,我不知道如何將它添加myFilters。誰能幫忙?

任何形式的幫助對我來說都很棒!

在此先感謝。

回答

1

假設,即words變量包含必需的名稱和術語,這裏是結果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() 
        ) 
       ) 
      ) 
     ) 
    ) 
); 

我也去掉根must條件,因爲它不會使SENCE單個條件

+1

從你的答案中學到了一些新的東西!幫助了很多!感謝@Random – Callisto

相關問題