javascript - 尝试在ElasticSearch中进行查询和汇总,但无法正常工作-Elasticsearch.js客户端

标签 javascript node.js elasticsearch elasticsearch-aggregation

我试图查询我的数据集有两个目的:

  • 匹配术语(可转售=真)
  • 按价格排序结果
    最低到最高

  • 数据集/文档为:
    "data" : {
                "resellable" : true,
                "startingPrice" : 0,
                "id" : "4emEe_r_x5DRCc5",
                "buyNowPrice" : 0.006493, //Changes per object
                "sub_title" : "test 1",
                "title" : "test 1",
                "category" : "Education",
          
              }
    
    //THREE OBJECTS WITH THE VALUES OF 0.006, 0.7, 1.05 FOR BUYNOWPRICE
    
    我有三个带有不同buyNowPrice的对象
    用agg查询是:
    {
        "query": {
            "bool": {
                "must": [
                    {
                        "term": {
                            "data.resellable": true
                        }
                    }
                ]
            }
        },
        "from": 0,
        "size": 5,
        "aggs": {
            "lowestPrice": {
                "terms": {
                    "field": "data.buyNowPrice",
                    "order": {
                        "lowest_price": "desc"
                    }
                },
                "aggs": {
                    "lowest_price": {
                        "min": {
                            "field": "data.buyNowPrice"
                        }
                    },
                    "lowest_price_top_hits": {
                        "top_hits": {
                            "size": 5,
                            "sort": [
                                {
                                    "data.buyNowPrice": {
                                        "order": "desc"
                                    }
                                }
                            ]
                        }
                    }
                }
            }
        }
    }
    
    该查询工作正常,结果是3个具有resellable = true的对象
    问题是,agg没有根据最低的立即购买价格来组织结果。
    每个结果的buyNowPrice顺序为:1.06、0.006、0.7-顺序不正确。
    切换到desc没有任何影响,所以我不认为agg完全可以运行吗?
    编辑:
    使用下面的建议,我的查询现在看起来像:
    {
        "query": {
            "bool": {
                "must": [
                    {
                        "term": {
                            "data.resellable": true
                        }
                    }
                ]
            }
        },
        "from": 0,
        "size": 5,
        "aggs": {
            "lowestPrice": {
                "terms": {
                    "field": "data.buyNowPrice",
                    "order": {
                        "lowest_price": "asc"
                    }
                },
                "aggs": {
                    "lowest_price": {
                        "min": {
                            "field": "data.buyNowPrice"
                        }
                    },
                    "lowest_price_top_hits": {
                        "top_hits": {
                            "size": 5
                        }
                    }
                }
            }
        }
    }
    
    
    查询结果为:
      total: { value: 3, relation: 'eq' },
      max_score: 0.2876821,
      hits: [
        {
          _index: 'education',
          _type: 'listing',
          _id: '4emEe_r_x5DRCc5', <--- buyNowPrice of 0.006
          _score: 0.2876821,
          _source: [Object]
        },
        {
          _index: 'education',
          _type: 'listing',
          _id: '4ee_r_x5DRCc5', <--- buyNowPrice of 1.006
          _score: 0.18232156,
          _source: [Object]
        },
        {
          _index: 'education',
          _type: 'listing',
          _id: '4444_r_x5DRCc5', <--- buyNowPrice of 0.7
          _score: 0.18232156,
          _source: [Object]
        }
      ]
    }
    
    
    编辑2:
    除去对resellable = true的查询,聚合将正确排序并按正确顺序返回项目。但是,如果包含可转售的查询,则不会。
    我假设这与覆盖ggt排序的_score属性有关?如何解决

    最佳答案

    You can use a bucket sort aggregation that is a parent pipeline aggregation which sorts the buckets of its parent multi-bucket aggregation. Zero or more sort fields may be specified together with the corresponding sort order.


    添加工作示例(使用与问题中给出的索引数据相同的索引数据),搜索查询和搜索结果
    搜索查询:
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "data.resellable": true
              }
            }
          ]
        }
      },
      "from": 0,
      "size": 5,
      "aggs": {
        "source": {
          "terms": {
            "field": "data.buyNowPrice"
          },
          "aggs": {
            "latest": {
              "top_hits": {
                "_source": {
                  "includes": [
                    "data.buyNowPrice",
                    "data.id"
                  ]
                }
              }
            },
            "highest_price": {
              "max": {
                "field": "data.buyNowPrice"
              }
            },
            "bucket_sort_order": {
              "bucket_sort": {
                "sort": {
                  "highest_price": {
                    "order": "desc"
                  }
                }
              }
            }
          }
        }
      }
    }
    
    搜索结果:
    "buckets": [
            {
              "key": 1.0499999523162842,
              "doc_count": 1,
              "highest_price": {
                "value": 1.0499999523162842
              },
              "latest": {
                "hits": {
                  "total": {
                    "value": 1,
                    "relation": "eq"
                  },
                  "max_score": 0.08701137,
                  "hits": [
                    {
                      "_index": "stof_64364468",
                      "_type": "_doc",
                      "_id": "3",
                      "_score": 0.08701137,
                      "_source": {
                        "data": {
                          "id": "4emEe_r_x5DRCc5",
                          "buyNowPrice": 1.05          <-- note this
                        }
                      }
                    }
                  ]
                }
              }
            },
            {
              "key": 0.699999988079071,
              "doc_count": 1,
              "highest_price": {
                "value": 0.699999988079071
              },
              "latest": {
                "hits": {
                  "total": {
                    "value": 1,
                    "relation": "eq"
                  },
                  "max_score": 0.08701137,
                  "hits": [
                    {
                      "_index": "stof_64364468",
                      "_type": "_doc",
                      "_id": "2",
                      "_score": 0.08701137,
                      "_source": {
                        "data": {
                          "id": "4emEe_r_x5DRCc5",
                          "buyNowPrice": 0.7         <-- note this
                        }
                      }
                    }
                  ]
                }
              }
            },
            {
              "key": 0.006000000052154064,
              "doc_count": 1,
              "highest_price": {
                "value": 0.006000000052154064
              },
              "latest": {
                "hits": {
                  "total": {
                    "value": 1,
                    "relation": "eq"
                  },
                  "max_score": 0.08701137,
                  "hits": [
                    {
                      "_index": "stof_64364468",
                      "_type": "_doc",
                      "_id": "1",
                      "_score": 0.08701137,
                      "_source": {
                        "data": {
                          "id": "4emEe_r_x5DRCc5",
                          "buyNowPrice": 0.006         <-- note this
                        }
                      }
                    }
                  ]
                }
              }
            }
          ]
    
    更新1:
    如果您将搜索查询修改为:
    {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "data.resellable": true
              }
            }
          ]
        }
      },
      "aggs": {
        "lowestPrice": {
          "terms": {
            "field": "data.buyNowPrice",
            "order": {
              "lowest_price": "asc"        <-- change the order here 
            }
          },
          "aggs": {
            "lowest_price": {
              "min": {
                "field": "data.buyNowPrice"
              }
            },
            "lowest_price_top_hits": {
              "top_hits": {
                "size": 5
              }
            }
          }
        }
      }
    }
    
    同时运行上面的搜索查询,您将获得所需的结果。

    关于javascript - 尝试在ElasticSearch中进行查询和汇总,但无法正常工作-Elasticsearch.js客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64364468/

    相关文章:

    javascript - 如何正确展开多个面板?

    javascript - HTML 中的 JQuery 类计数

    c# - NodeJS 3DES ECB 加密不等于 C# 加密

    java - 更新错误 :org. elasticsearch.ElasticsearchIllegalArgumentException:执行脚本失败

    python - ElasticSearch Python 索引和别名创建

    javascript - 如何创建简单的 div 和网站其余部分透明?

    javascript - react 中的简单时间计数器

    node.js - ExpressJS 上的子域

    node.js - express.js 连接模块出现问题

    java - Elasticsearch-6.6.0 无法在 Windows 上启动