鉴于这些文件:
{
"id": "1"
"prices": [
{
"param1": "A",
"param2": "B",
"total": 100
},
{
"param1": "A",
"param2": "C",
"total": 200
}
]
},
{
"id": "2"
"prices": [
{
"param1": "A",
"param2": "B",
"total": 200
},
{
"param1": "A",
"param2": "C",
"total": 300
}
]
},
如何才能用它们的最小总价值来过滤它们的价格范围?
现在我的查询如下所示:
{
...
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "prices",
"query": {
"bool": {
"filter": [
{
"range": {
"prices.total": {
"gte": 200,
"lte": 300
}
}
}
]
}
}
}
}
]
}
}
}
所以它从逻辑上返回文档1和2,因为它们的价格都在这个范围内,但我只想得到文档2,因为我希望过滤器逻辑只应用于最低价格。
由于您不知道在筛选最小值时您不知道什么,所以从理论上讲,您可以想出一个查询时脚本来为您计算这个值。但这将是繁重和低效的。
相反,我建议在摄取前/摄取时计算局部最小值,这将大大加快查找时间。
_update_by_query
脚本为所有文档分配顶级MintotalPrice
:POST prices/_update_by_query
{
"query": {
"match_all": {}
},
"script": {
"source": """
def allTotals = ctx._source.prices.stream().map(group -> group.total).collect(Collectors.toList());
ctx._source.minTotalPrice = Collections.min(allTotals)
""",
"lang": "painless"
}
}
这大大简化了实际的范围查询:
GET prices/_search
{
"query": {
"range": {
"minTotalPrice": {
"gte": 200,
"lte": 300
}
}
}
}
在ingest管道中使用相同的脚本。它可以应用于第一次获取文档以及更新单个文档时(无论出于何种原因)。
使用copy_to
映射参数,正如我在这里解释的那样。但是您仍然需要一个查询时脚本来计算本地最小值。
我试图构造一个ElasticSearch查询,但没有得到预期的结果。任何帮助都将不胜感激! 映射详细信息: null null 目前,每个嵌套的轮班文档都包含一个嵌套的calendarBlock文档,其中包含开始和结束日期时间字段,以及一个可以注册该轮班的最大志愿者人数字段。 查询 我试图构造的查询是经过筛选的查询。从Web上的窗体传入查询字符串。然后,我需要以编程方式将至少三个筛选器附加到这个查
好吧,这一个对你们中的一个超级棒的弹性搜索专家来说可能不会太难。我得到了这个嵌套查询,我希望嵌套查询在一个非嵌套字段(状态)上进行过滤。我不知道把过滤器放在哪里。我试着把它放在一个查询中(如下),但没有给出正确的结果。你能帮我吗?
我想查询日期范围内的elasticsearch文档。我现在有两个选择,都很适合我。我已经测试了他们两个。1.范围查询2。距离滤波器 因为我现在有一个小数据集,所以无法测试它们的性能。这两者有什么区别?哪一种方法可以更快地检索文档和响应?
我希望通过第二个值(这里我将其标记为)过滤嵌套文件中的组。cointains 4个对象。我希望数组中第二个项大于0()的所有组。以下文档示例: 我的方法是使用,但由于某些原因,它不起作用。但是相同的脚本不在过滤器中,而是在中工作-下面是我的代码示例:
**我试图聚合和找到价格范围,如果在基础上的嵌套报价数组(嵌套数组)的sellerInfoES对象。内部字段是"offerPrice"。如何在Elasticsearch中的嵌套数组字段上编写聚合。我尝试了以下查询,但它不工作。获取此错误:解析失败[在[price_ranges]中找到两个聚合类型定义:[嵌套]和[过滤器]] 映射: 查询:
我是Elasticsearch的新手,我试图创建一个过滤器来检索具有特定属性的文档。 属性在映射中定义为嵌套对象,如下所示: 我试图以以下形式执行一个复杂的查询: 这是elasticsearch 2.x。我做错了什么?