gpt4 book ai didi

elasticsearch - 具有自身字段值的Elasticsearch查询

转载 作者:行者123 更新时间:2023-12-03 02:00:44 25 4
gpt4 key购买 nike

我的elasticsearch映射已创建为支持以下数据结构:

"commodities" : [
{
"name" : "commodity1",
"displayPrice" : "price1",
"prices" : [
"price" : {
"type" : "price1",
"amount" : "1000"
},
"price" : {
"type" : "price2",
"amount" : "1100"
}
"price" : {
"type" : "price3",
"amount" : "1200"
}
]
},
{
"name" : "commodity2",
"displayPrice" : "price2",
"prices" : [
"price" : {
"type" : "price1",
"amount" : "1300"
},
"price" : {
"type" : "price2",
"amount" : "1100"
}
"price" : {
"type" : "price3",
"amount" : "1500"
}
]
}
]



价格对象是嵌套类型。
“displayPrice”为“not_analyzed”。
prices.price.type是“not_analyzed”。

现在,我想在这里做两件事:
1.当用户搜索价格时,DSL查询应该能够找到并返回显示价格,例如,如果用户要搜索显示价格在950和1150之间的商品,则他应该同时获得商品1和商品2,因为对于商品1,displayPrice为“price1”,而price.type =“price1”的值为1000。
2.当用户想要按价格对商品进行分类时,DSL应该能够基于单个商品的displayPrice进行分类。

任何帮助/指针将不胜感激。

谢谢。

================================================== ================

编辑,详细要求的详细信息:

非常感谢您解决问题并准备代码。我理应做到这一点。我相信我引错了我的问题。让我重新表述这个问题:
根据给定的数据集,我有两个要求:

  • 当用户搜索价格范围为950-1150的商品时,系统应首先检查“displayPrice”的值是什么,然后使用该值作为查询来查找具有“price.type”的“price”对象。因此,例如,对于商品1,“displayPrice”是“price1”。 “价格”下的相应“价格”对象(“price.type” =“price1”)的金额为“1000”。因此,应退还该商品。同样,对于商品2,其“显示价格”为“价格2”。商品2中“价格”(带有“price.type” =“price2”)下的相应“价格”对象的金额为“1100”。因此,应退还该商品。

  • 当用户按价格对商品进行排序时,应选择“displayPrice”的值。具有“price.type”作为该值的“price”对象应用于排序。因此,在商品1中,应使用“1000”(针对“price1”),在商品2中,应使用“1100”(针对“price2”)。
  • 最佳答案

    我不得不稍微更改一下数据的结构,但是我认为以下设置将为您提供所需的内容。

    为了进行测试,我创建了一个类型为"commodities"的索引,该索引具有嵌套的"prices"数据结构:

    PUT /test_index
    {
    "mappings": {
    "commodities": {
    "properties": {
    "displayPrice": {
    "type": "string"
    },
    "name": {
    "type": "string"
    },
    "prices": {
    "type": "nested",
    "properties": {
    "amount": {
    "type": "integer"
    },
    "type": {
    "type": "string"
    }
    }
    }
    }
    }
    }
    }

    还要注意 "amount"的类型为 "integer"。然后(在调整数量和 "prices"嵌套对象的结构之后)我为您的两个文档建立了索引:
    PUT /test_index/commodities/1
    {
    "name": "commodity1",
    "displayPrice": "price1",
    "prices": [
    {
    "type": "price1",
    "amount": 1000
    },
    {
    "type": "price2",
    "amount": 1100
    },
    {
    "type": "price3",
    "amount": 1200
    }
    ]
    }

    PUT /test_index/commodities/2
    {
    "name": "commodity2",
    "displayPrice": "price2",
    "prices": [
    {
    "type": "price1",
    "amount": 1300
    },
    {
    "type": "price2",
    "amount": 1100
    },
    {
    "type": "price3",
    "amount": 1500
    }
    ]
    }

    现在,此查询似乎返回您要的内容:
    POST /test_index/_search
    {
    "query": {
    "filtered": {
    "filter": {
    "nested": {
    "path": "prices",
    "filter": {
    "range": {
    "prices.amount": {
    "from": 950,
    "to": 1150
    }
    }
    }
    }
    }
    }
    },
    "sort": [
    {
    "displayPrice": {
    "order": "desc"
    }
    }
    ]
    }
    ...
    {
    "took": 4,
    "timed_out": false,
    "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
    },
    "hits": {
    "total": 2,
    "max_score": null,
    "hits": [
    {
    "_index": "test_index",
    "_type": "commodities",
    "_id": "2",
    "_score": null,
    "_source": {
    "name": "commodity2",
    "displayPrice": "price2",
    "prices": [
    {
    "type": "price1",
    "amount": 1300
    },
    {
    "type": "price2",
    "amount": 1100
    },
    {
    "type": "price3",
    "amount": 1500
    }
    ]
    },
    "sort": [
    "price2"
    ]
    },
    {
    "_index": "test_index",
    "_type": "commodities",
    "_id": "1",
    "_score": null,
    "_source": {
    "name": "commodity1",
    "displayPrice": "price1",
    "prices": [
    {
    "type": "price1",
    "amount": 1000
    },
    {
    "type": "price2",
    "amount": 1100
    },
    {
    "type": "price3",
    "amount": 1200
    }
    ]
    },
    "sort": [
    "price1"
    ]
    }
    ]
    }
    }

    如果您不想返回整个文档,则可以使用 "fields" parameter,例如:
    POST /test_index/_search
    {
    "fields": [
    "name", "displayPrice"
    ],
    "query": {
    ...

    这是我用来测试的代码:

    http://sense.qbox.io/gist/8f60bcd96e27eedd0dc0af780d4e2f8bed028445

    关于elasticsearch - 具有自身字段值的Elasticsearch查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32842818/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com