我正在使用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/