elasticsearch - Elasticsearch中的过滤器/查询支持

标签 elasticsearch

Elasticsearch文档指出The top_hits aggregation returns regular search hits, because of this many per hit features can be supported最重要的是,该列表包括Named filters and queries
但是尝试添加任何过滤器或查询会抛出SearchParseException: Unknown key for a START_OBJECT
用例:我有带有嵌套注释列表的项目

项目{id}->评论{日期,评分}

我想在上周获得每个项目的最高评价。

{
 "query": {
   "match_all": {}
  },
  "aggs": {
    "items": {
      "terms": {
        "field": "id",
        "size": 10
      },
      "aggs": {
        "comment": {
          "nested": {
            "path": "comments"
          },
          "aggs": {
            "top_comment": {
              "top_hits": {
                "size": 1,
                //need filter  here to select only comments of last week
                "sort": {
                  "comments.rating": {
                    "order": "desc"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

那么文档是否错误,或者有什么方法可以添加过滤器?

https://www.elastic.co/guide/en/elasticsearch/reference/2.1/search-aggregations-metrics-top-hits-aggregation.html

最佳答案

您确定已将它们映射为Nested吗?我只是试图对我的数据执行这样的查询,它确实工作正常。

如果是这样,您可以在嵌套聚合之后添加一个过滤器聚合(希望我没有弄乱大括号):

POST data/_search
{
  "size": 0,
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "nested": {
          "path": "comments",
          "query": {
            "range": {
              "comments.date": {
                "gte": "now-1w",
                "lte": "now"
              }
            }
          }
        }
      }
    }
  },
  "aggs": {
    "items": {
      "terms": {
        "field": "id",
        "size": 10
      },
      "aggs": {
        "nested": {
          "nested": {
            "path": "comments"
          },
          "aggs": {
            "filterComments": {
              "filter": {
                "range": {
                  "comments.date": {
                    "gte": "now-1w",
                    "lte": "now"
                  }
                }
              },
              "aggs": {
                "topComments": {
                  "top_hits": {
                    "size": 1,
                    "sort": {
                      "comments.rating": "desc"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

附言始终为嵌套对象包括FULL路径。

因此,此查询将:
  • 过滤注释少于一周的文档,以缩小文档范围以进行汇总并查找那些实际上具有此类注释的文档(过滤查询)
  • 基于id字段
  • 进行术语聚合
  • 打开嵌套的子文档(注释)
  • 按日期过滤它们
  • 返回最糟糕的一个(评分最高)
  • 关于elasticsearch - Elasticsearch中的过滤器/查询支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34319337/

    相关文章:

    本地主机 Java 客户端错误 : MasterNotDiscoveredException[waited for [30s]] 上的 Elasticsearch 2.1.1

    elasticsearch - elasticsearch和过滤器优化

    php - PHP Elasticsearch “Set”映射

    elasticsearch - 如何在所有文档中查询与键关联的值?

    logging - Elasticsearch 索引比它索引的日志的实际大小大得多?

    elasticsearch - 根据Elasticsearch中的最佳字段匹配进行搜索

    windows - ElasticSearch:在Windows 64位环境中安装ES插件

    python - curl 请求以恢复 Elasticsearch 中的快照有效,但python中的相同请求不起作用

    java - 如何使用java在elasticsearch SearchQuery中指定 "start"文档? (跳过文件数量)

    elasticsearch - 如何通过同义词进行搜索