Nest - ElasticSearch.Net - 如何拆分搜索属性返回的FacetFilter命中计数

时间:2015-03-09 11:42:11

标签: c# elasticsearch nest

我有一个NEST查询;

            var desciptor  = new SearchDescriptor<SomePoco>()
             .TrackScores()
             .From(request.Page == 1 ? 0 : (request.Page - 1) * request.PageSize)
             .Size(request.PageSize)
             .MatchAll()
             .FacetFilter("some_name", a => new FilterContainer(new AndFilter { Filters = CreatePocoSearchFilter(request) }))
             .SortDescending("_score");


var results = _client.Search<SomePoco>(x => descriptor);

FacetFilter从我的查询中返回HITS的总数。我想在搜索请求中使用属性拆分这些命中。所以,在搜索请求中我有一个int列表。我想知道该列表中每个int返回了多少次匹配。

我希望这是有道理的。

我已尝试添加FacetTerm,这为我提供了int查询值的每个值的总点击次数,而不仅仅是与搜索相关的值。我理解查询,过滤阶段,并试图相应地更改描述符,没有运气。

感谢。

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。我的建议是使用过滤后的查询,然后在结果上使用术语聚合或方面(不建议使用方面,因此我建议远离这些方面)。

使用聚合:

POST /_search
{
  "query": {
    "filtered": {
      "query": { "match_all": {}},
      "filter": {
        "terms": {
          "<FIELD_NAME>": [1, 2, 3, 42]
        }
      }
    }
  },
  "aggs": {
    "countOfInts": {
      "terms": {
        "field": "<FIELD_NAME>",
        "size": 10
      }
    }
  }
}

有一个方面:

POST /_search
{
  "query": {
    "filtered": {
      "query": { "match_all": {}},
      "filter": {
        "terms": {
          "<FIELD_NAME>": [1, 2, 3, 42]
        }
      }
    }
  },
  "facets": {
    "countOfInts": {
      "terms": {
        "field": "<FIELD_NAME>",
        "size": 10
      }
    }
  }
}

您也可以通过使用match_all执行普通查询来执行相同的操作,然后在构面或聚合内部执行过滤。我在上面列出它的方式会更好一点,因为它会在构建agg / facet之前减少工作集。

我没有包含NEST的代码,因为根据您使用的dll的版本,格式可能会有所不同。