带有聚合前缀的 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"
          }
        }
      }
    }
  }
}