gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:52:12 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com