【问题标题】:Count filtered data in Elasticsearch(ElasticClient nest)统计 Elasticsearch 中过滤后的数据(ElasticClient 嵌套)
【发布时间】:2016-09-06 07:30:20
【问题描述】:

我正在使用 ElasticClient 2.4.4。

我有一个问题

var sample = client.Search<TestMenuItem>(s => s
            .Query(q =>
                q.Term(p => p.RegionSegments, "s1")
                && q.Term(p => p.RegionSegments, "s2")
                 && q.Term(p => p.RegionSegments, "s3")
            ));

比我想用 RegionSegments = s1 计算有多少项目。 据我了解,我应该使用聚合,但找不到如何解决这个问题的好例子。有什么想法吗?

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    如果您只需要计数 s1s2s3 RegionSegment 文档中的每一个,那么您可以为此执行 multi_search,为所有文档指定计数 search_type

    var multiSearchResponse = client.MultiSearch(ms => ms
        // this is the default index for multi_search. Can override
        // on each Search call if needed
        .Index<TestMenuItem>()
        // this is the default type for mulit_search. Can override
        // on each search call if needed
        .Type<TestMenuItem>()
        // this is the default search_type. Can override on
        // each search call if needed
        .SearchType(SearchType.Count)
        .Search<TestMenuItem>("s1", s => s
            .Query(q => +q.Term(p => p.RegionSegments, "s1"))
        )
        .Search<TestMenuItem>("s2", s => s
            .Query(q => +q.Term(p => p.RegionSegments, "s2"))
        )
        .Search<TestMenuItem>("s3", s => s
            .Query(q => +q.Term(p => p.RegionSegments, "s3"))
        )
    );
    

    这会产生以下请求

    POST http://localhost:9200/testmenuitem-index/testmenuitem/_msearch?search_type=count 
    {}
    {"query":{"bool":{"filter":[{"term":{"regionSegments":{"value":"s1"}}}]}}}
    {}
    {"query":{"bool":{"filter":[{"term":{"regionSegments":{"value":"s2"}}}]}}}
    {}
    {"query":{"bool":{"filter":[{"term":{"regionSegments":{"value":"s3"}}}]}}}
    

    获取每个搜索结果的总数类似于以下内容

    var s1Total = multiSearchResponse.GetResponse<TestMenuItem>("s1").Total;
    

    【讨论】:

    • 不完全是。首先我需要得到一些查询结果,然后根据这个查询结果进行计算。
    • RegionSegments 是这样的字符串 's1 s2 s3' 或 's3 s2'
    • 是否分析了RegionSegments?您是否需要在s1s2s3完全匹配
    • Russ Cam,你是对的,首先匹配而不是根据这个查询结果进行计算。
    • @user1541069 另一种方法是将.Search()multiple filter aggregations 用于您想要计数的每个区域段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2020-08-05
    • 2018-01-30
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多