我的映射如下所示,我正在对名称和其他属性进行bool应该查询,如下所示,但我需要的是,我希望在响应时根据CustomerId过滤CustomerPrices。每个产品都有相同的CustomerID,所以Eaxample;
product1 -CustomerPrice( CustomerId :1234 -Price:4)
CustomerPrice( CustomerId :567-Price:5)
.
.
Product2 - CustomerPrice(CustomerId :1234 -Price:8)
CustomerPrice(CustomerId :567-Price:10)
.
.
因此,根据我查询Product1时,响应应该只有CustomerId:1234的customerPrice
{
"Product": {
"properties": {
"CustomerPrices": {
"type": "nested",
"properties": {
"Price": {
"store": true,
"type": "float"
},
"CustomerId": {
"type": "integer"
}
}
},
"Name": {
"index": "not_analyzed",
"store": true,
"type": "string"
}
}
}
}
我尝试了以下查询,但这不是过滤嵌套对象。我想它过滤产品对象是有意义的,因为所有产品都有CustomerID:1234
"query":{
"bool":{
"should":[
{
"multi_match":{
"type":"best_fields",
"query":"product 1",
"fields":[
"Name^7"]
}
},
{
"multi_match":{
"type":"best_fields",
"query":"product 1",
"operator":"and",
"fields":[
"Code^10",
"ShortDescription^6"]
}
},
{
"nested":{
"query":{
"term":{
"CustomerPrices.CustomerId":{
"value":1234
}
}
},
"path":"CustomerPrices"
}
}]
}
},
我在您的问题上花了一些时间,因为如何实现这一点很有趣,目前我找到的唯一解决方案是依赖于inner_hits,它给出了匹配对象的确切嵌套对象。我还停用了不再使用的_source。
因此,给定您的映射,并有两个产品,如:
PUT product/Product/product1
{
"CustomerPrices": [
{
"CustomerId": 1234,
"Price": 4
},
{
"CustomerId": 567,
"Price": 5
}
],
"Name": "John"
}
PUT product/Product/product2
{
"CustomerPrices": [
{
"CustomerId": 1234,
"Price": 8
},
{
"CustomerId": 567,
"Price": 10
}
],
"Name": "Bob"
}
当运行以下查询时:(使用must只是为了查看1个结果,也可以使用should)
GET product/_search
{
"_source": false,
"query": {
"bool": {
"must": [
{ "match": { "Name": "Bob"}}
],
"filter": [
{
"nested" : {
"path" : "CustomerPrices",
"score_mode" : "avg",
"query" : {
"bool" : {
"should" : [
{ "match" : {"CustomerPrices.CustomerId" : 1234}}
]
}
},
"inner_hits": {}
}
}
]
}
}
}
我能够从ID1234的客户那里得到只有“price”的结果:
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "product",
"_type": "Product",
"_id": "product2",
"_score": 0.2876821,
"inner_hits": {
"CustomerPrices": {
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "product",
"_type": "Product",
"_id": "product2",
"_nested": {
"field": "CustomerPrices",
"offset": 0
},
"_score": 1,
"_source": {
"CustomerId": 1234,
"Price": 8
}
}
]
}
}
}
}
]
}
}
无法找到只使用匹配的嵌套对象返回文档部分结果的正式方法。也许我们需要通知elasticsearch的人在下一个版本中考虑的东西。希望对你有帮助。
好吧,这一个对你们中的一个超级棒的弹性搜索专家来说可能不会太难。我得到了这个嵌套查询,我希望嵌套查询在一个非嵌套字段(状态)上进行过滤。我不知道把过滤器放在哪里。我试着把它放在一个查询中(如下),但没有给出正确的结果。你能帮我吗?
作为这个答案的后续(关于方法1),我想更进一步: 我想根据某些标准筛选子对象。我尝试了下面的查询,但它仍然没有筛选出孙实体下的对象。 关联类实体 类关系ParentEntity<1-OneTomany-x>ChildEntity<1-OneTomany-x>GrandChildEntity
我试图在嵌套筛选器聚合中使用嵌套查询筛选器。当我这样做时,聚合返回时没有任何项。如果我将查询更改为简单的旧match_all筛选器,我确实会在bucket中获得项。 下面是我正在使用的映射的简化版本: 该查询在聚合上使用match_all筛选器:
我是Elasticsearch的新手,我试图创建一个过滤器来检索具有特定属性的文档。 属性在映射中定义为嵌套对象,如下所示: 我试图以以下形式执行一个复杂的查询: 这是elasticsearch 2.x。我做错了什么?
我正忙于在Java Spring中为ElasttiSearch创建过滤查询。我有以下Elasticsearch映射: Elasticsearch中的数据如下所示:
示例文档 索引定义 内部无源过滤的响应良好。 响应包含嵌套属性的所有属性。即开始时间、结束时间和文本行。如何在响应中仅返回endtime和startTime? 查询失败 错误HTTP/1.1 400错误请求内容类型:application/json;字符集=UTF-8内容长度:265 {"错误":{"root_cause":[{"type":"illegal_argument_exception"