elasticsearch - 筛选器构面返回所有文档的计数,而不是范围

标签 elasticsearch faceted-search facet nest

我正在使用Elasticsearch和Nest创建一个查询特定时间范围内的文档以及做一些筛选方面。查询如下所示:

{
  "facets": {
    "notfound": {
      "query": {
        "term": {
          "statusCode": {
            "value": 404
          }
        }
      }
    }
  },
  "filter": {
    "bool": {
      "must": [
        {
          "range": {
            "time": {
              "from": "2014-04-05T05:25:37",
              "to": "2014-04-07T05:25:37"
            }
          }
        }
      ]
    }
  }
}

在特定情况下,搜索的总命中为21个文档,这适合Elasticsearch中该时间范围内的文档。但是“未找到”构面返回38,这与StatusCode值为404的ErrorDocuments的总数匹配。

据我了解的文档,构面从搜索中收集数据。在这种情况下,“未找到”构面永远不能返回高于21的计数。

我在这里做错了什么?

最佳答案

众所周知,过滤器/查询/ filtered_query /小平面过滤器有明显的区别。

顶级过滤器

{
    filter: {}
}

这充当后过滤器,这意味着它将在查询阶段结束后过滤结果。由于构面是查询阶段的一部分,因此筛选器不会影响构面的文档。过滤器不会改变得分,因此非常易于缓存。

顶级查询
{
    query: {}
}

查询会影响文档的分数,因此可缓存性低于过滤器。查询在查询阶段运行,因此也影响分面的文档。

过滤查询
{
    query: {
        filtered: {
           filter: {}
           query: {}
        }
    }
}

这使您可以在查询阶段运行筛选器,以利用其更好的可缓存性,并使它们影响多面文档。

构面过滤器
"facets" : {
    "<FACET NAME>" : {
        "<FACET TYPE>" : {
            ...
        },
        "facet_filter" : {
            "term" : { "user" : "kimchy"}
        }
    }
}

这使您可以将筛选器应用于构面经过的文档。请记住,除非您也同时在构面上指定global:true,否则它将是queryphase / facetfilter的组合。

查询构面/筛选器构面
{
    "facets" : {
        "wow_facet" : {
            "query" : {
                "term" : { "tag" : "wow" }
            }
        }
    }
}

@thomasardal在这种情况下使用的是一个很好的方面,它是一个方面类型,它返回一个值:查询命中计数。

您的Query Facet返回38而不是21的事实是因为您对时间范围使用了过滤器。

您可以通过在filtered_query阶段在query中进行过滤来解决此问题,或者将facet filter(而非filter_facet)应用于您的query_facet,尽管由于过滤器的缓存更好,所以您最好在过滤方面内使用facet过滤器。

使用搜索对象上的.FacetFilter()指定令人困惑的筛选器构面。我将在1.0中进行更改,以避免将来造成混淆。

可悲的是:NEST中的.FacetFilter().FacetQuery()不允许您像其他方面一样指定facet filter:
var results = typedClient.Search<object>(s => s
    .FacetTerm(ft=>ft
        .OnField("myfield")
        .FacetFilter(f=>f.Term("filter_facet_on_this_field", "value"))
    )
);

关于elasticsearch - 筛选器构面返回所有文档的计数,而不是范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22898780/

相关文章:

ruby-on-rails - elasticsearch-rails gem - 完成建议器

elasticsearch - 停止启动具有所有主要分片的elasticsearch实例

solr - SOLR 中的嵌套字段

mysql - 非文本搜索会从搜索引擎中受益吗?

r - 如何在facet ggplot的空白区域定位注释文本

solr - 从 Solr 结果中过滤掉不相关的方面

python - 弹性APM Python-系统指标不显示与流程相关的指标,例如Kibana上的内存

elasticsearch - 如何在ElasticSearch中显示DSL(查询)处理?

search - Solr 每个字段的多个方面

r - 在 grid.arrange 中使用 layout_matrix 时修复绘图区域宽度