带有聚合前缀的 ElasticSearch 查询
ElasticSearch query with prefix for aggregation
我正在尝试在 "must" 子句中为我的 ES 查询添加前缀条件。
我当前的查询看起来像这样:
body = {
"query": {
"bool": {
"must":
{ "term": { "article_lang": 0 }}
,
"filter": {
"range": {
"created_time": {
"gte": "now-3h"
}
}
}
}
},
"aggs": {
"articles": {
"terms": {
"field": "article_id.keyword",
"order": {
"score": "desc"
},
"size": 1000
},
"aggs": {
"score": {
"sum": {
"field": "score"
}
}
}
}
}
}
我需要在我的查询中添加一个强制条件来过滤 ID 以 "article-" 开头的文章。
到目前为止,我已经试过了:
{
"query": {
"bool": {
"should": [
{ "term": { "article_lang": 0 }},
{ "prefix": { "article_id": {"value": "article-"} }}
],
"filter": {
"range": {
"created_time": {
"gte": "now-3h"
}
}
}
}
},
"aggs": {
"articles": {
"terms": {
"field": "article_id.keyword",
"order": {
"score": "desc"
},
"size": 1000
},
"aggs": {
"score": {
"sum": {
"field": "score"
}
}
}
}
}
}
我是 ES 的新手,从在线文档中,我知道 "should" 用于 "OR" 条件,"must" 用于 "AND"。这是 return 给我一些数据,但根据条件,它将由 article_lang=0 或以 article- 开头的文章组成。当我使用 "must" 时,它不会 return 任何东西。
我确定有 id 以此前缀开头的文章,因为目前,我们正在遍历此结果以过滤掉此类文章。我在这里错过了什么?
在您的 prefix
查询中,您需要使用 article_id.keyword
字段,而不是 article_id
。此外,你应该更喜欢 filter
而不是 must
因为你只是在做 yes/no 匹配(又名过滤器)
{
"query": {
"bool": {
"filter": [ <-- change this
{
"term": {
"article_lang": 0
}
},
{
"prefix": {
"article_id.keyword": { <-- and this
"value": "article-"
}
}
}
],
"filter": {
"range": {
"created_time": {
"gte": "now-3h"
}
}
}
}
},
"aggs": {
"articles": {
"terms": {
"field": "article_id.keyword",
"order": {
"score": "desc"
},
"size": 1000
},
"aggs": {
"score": {
"sum": {
"field": "score"
}
}
}
}
}
}
我正在尝试在 "must" 子句中为我的 ES 查询添加前缀条件。 我当前的查询看起来像这样:
body = {
"query": {
"bool": {
"must":
{ "term": { "article_lang": 0 }}
,
"filter": {
"range": {
"created_time": {
"gte": "now-3h"
}
}
}
}
},
"aggs": {
"articles": {
"terms": {
"field": "article_id.keyword",
"order": {
"score": "desc"
},
"size": 1000
},
"aggs": {
"score": {
"sum": {
"field": "score"
}
}
}
}
}
}
我需要在我的查询中添加一个强制条件来过滤 ID 以 "article-" 开头的文章。
到目前为止,我已经试过了:
{
"query": {
"bool": {
"should": [
{ "term": { "article_lang": 0 }},
{ "prefix": { "article_id": {"value": "article-"} }}
],
"filter": {
"range": {
"created_time": {
"gte": "now-3h"
}
}
}
}
},
"aggs": {
"articles": {
"terms": {
"field": "article_id.keyword",
"order": {
"score": "desc"
},
"size": 1000
},
"aggs": {
"score": {
"sum": {
"field": "score"
}
}
}
}
}
}
我是 ES 的新手,从在线文档中,我知道 "should" 用于 "OR" 条件,"must" 用于 "AND"。这是 return 给我一些数据,但根据条件,它将由 article_lang=0 或以 article- 开头的文章组成。当我使用 "must" 时,它不会 return 任何东西。
我确定有 id 以此前缀开头的文章,因为目前,我们正在遍历此结果以过滤掉此类文章。我在这里错过了什么?
在您的 prefix
查询中,您需要使用 article_id.keyword
字段,而不是 article_id
。此外,你应该更喜欢 filter
而不是 must
因为你只是在做 yes/no 匹配(又名过滤器)
{
"query": {
"bool": {
"filter": [ <-- change this
{
"term": {
"article_lang": 0
}
},
{
"prefix": {
"article_id.keyword": { <-- and this
"value": "article-"
}
}
}
],
"filter": {
"range": {
"created_time": {
"gte": "now-3h"
}
}
}
}
},
"aggs": {
"articles": {
"terms": {
"field": "article_id.keyword",
"order": {
"score": "desc"
},
"size": 1000
},
"aggs": {
"score": {
"sum": {
"field": "score"
}
}
}
}
}
}