ElasticSearch: объединить все inner_hits для вложенных запросов - PullRequest
0 голосов
/ 18 мая 2018

Я довольно новичок вasticsearch и пытался создать запрос, который вернул бы мне запись, которая соответствует всем must условиям bool-запроса.Bool-запрос заключен в constant_score: filter.

Мое сопоставление для объекта выглядит следующим образом:

{
    "mappings": {
        "doc": {
            "properties": {
                "available_qty": {
                    "type": "long"
                },
                "brand": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "components": {
                    "type": "nested",
                    "properties": {
                        "available_qty": {
                            "type": "long"
                        },
                        "brand": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "id": {
                            "type": "long"
                        },
                        "incoming_qty": {
                            "type": "long"
                        },
                        "name": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "on_hand_qty": {
                            "type": "long"
                        },
                        "outgoing_qty": {
                            "type": "long"
                        },
                        "parent_id": {
                            "type": "long"
                        },
                        "product_stores": {
                            "type": "nested",
                            "properties": {
                                "channel_id": {
                                    "type": "long"
                                },
                                "price": {
                                    "type": "float"
                                },
                                "store_id": {
                                    "type": "long"
                                }
                            }
                        },
                        "product_warehouses": {
                            "type": "nested",
                            "properties": {
                                "available_qty": {
                                    "type": "long"
                                },
                                "incoming_qty": {
                                    "type": "long"
                                },
                                "outgoing_qty": {
                                    "type": "long"
                                },
                                "warehouse_id": {
                                    "type": "long"
                                }
                            }
                        },
                        "quantity_in_bundle": {
                            "type": "long"
                        },
                        "sku": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "status": {
                            "type": "long"
                        },
                        "tenantId": {
                            "type": "long"
                        },
                        "type": {
                            "type": "long"
                        }
                    }
                },
                "id": {
                    "type": "long"
                },
                "image": {
                    "properties": {
                        "id": {
                            "type": "long"
                        },
                        "isDefault": {
                            "type": "boolean"
                        },
                        "thumbnail": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "url": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        }
                    }
                },
                "incoming_qty": {
                    "type": "long"
                },
                "tags": {
                    "type": "nested",
                    "properties": {
                        "name": {
                            "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                        },
                        "color": {
                            "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                        },
                        "id": {
                            "type": "long"
                        }
                    }
                },
                "members": {
                    "type": "nested",
                    "properties": {
                        "available_qty": {
                            "type": "long"
                        },
                        "brand": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "id": {
                            "type": "long"
                        },
                        "image": {
                            "properties": {
                                "id": {
                                    "type": "long"
                                },
                                "isDefault": {
                                    "type": "boolean"
                                },
                                "url": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                }
                            }
                        },
                        "incoming_qty": {
                            "type": "long"
                        },
                        "tags": {
                            "type": "nested",
                            "properties": {
                                "name": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                },
                                "color": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                },
                                "id": {
                                    "type": "long"
                                }
                            }
                        },
                        "master_id": {
                            "type": "long"
                        },
                        "name": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "on_hand_qty": {
                            "type": "long"
                        },
                        "outgoing_qty": {
                            "type": "long"
                        },
                        "parent_id": {
                            "type": "long"
                        },
                        "product_stores": {
                            "type": "nested",
                            "properties": {
                                "channel_id": {
                                    "type": "long"
                                },
                                "price": {
                                    "type": "float"
                                },
                                "product_url": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                },
                                "store_id": {
                                    "type": "long"
                                }
                            }
                        },
                        "product_warehouses": {
                            "type": "nested",
                            "properties": {
                                "available_qty": {
                                    "type": "long"
                                },
                                "incoming_qty": {
                                    "type": "long"
                                },
                                "outgoing_qty": {
                                    "type": "long"
                                },
                                "warehouse_id": {
                                    "type": "long"
                                }
                            }
                        },
                        "sku": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "status": {
                            "type": "long"
                        },
                        "tenantId": {
                            "type": "long"
                        },
                        "type": {
                            "type": "long"
                        }
                    }
                },
                "name": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "on_hand_qty": {
                    "type": "long"
                },
                "outgoing_qty": {
                    "type": "long"
                },
                "product_stores": {
                    "type": "nested",
                    "properties": {
                        "channel_id": {
                            "type": "long"
                        },
                        "price": {
                            "type": "float"
                        },
                        "product_url": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "store_id": {
                            "type": "long"
                        }
                    }
                },
                "product_warehouses": {
                    "type": "nested",
                    "properties": {
                        "available_qty": {
                            "type": "long"
                        },
                        "incoming_qty": {
                            "type": "long"
                        },
                        "outgoing_qty": {
                            "type": "long"
                        },
                        "warehouse_id": {
                            "type": "long"
                        }
                    }
                },
                "sku": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "status": {
                    "type": "long"
                },
                "tenantId": {
                    "type": "long"
                },
                "type": {
                    "type": "long"
                }
            }
        }
    }
}

Я запрашиваю этот индекс, используя следующий запрос:

{
    "from": 0,
    "size": 20,
    "query": {
        "constant_score": {
            "filter": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "tenantId": {
                                    "value": 88,
                                    "boost": 1
                                }
                            }
                        },
                        {
                            "terms": {
                                "type": [
                                    2
                                ],
                                "boost": 1
                            }
                        },
                        {
                            "bool": {
                                "should": [
                                    {
                                        "terms": {
                                            "status": [
                                                2
                                            ],
                                            "boost": 1
                                        }
                                    },
                                    {
                                        "nested": {
                                            "query": {
                                                "terms": {
                                                    "members.status": [
                                                        2
                                                    ],
                                                    "boost": 1
                                                }
                                            },
                                            "path": "members",
                                            "ignore_unmapped": false,
                                            "score_mode": "avg",
                                            "boost": 1,
                                            "inner_hits": {
                                                "name": "members",
                                                "ignore_unmapped": false,
                                                "from": 0,
                                                "size": 100,
                                                "version": false,
                                                "explain": false,
                                                "track_scores": false,
                                                "_source": false
                                            }
                                        }
                                    }
                                ],
                                "adjust_pure_negative": true,
                                "minimum_should_match": "1",
                                "boost": 1
                            }
                        },
                        {
                            "bool": {
                                "should": [
                                    {
                                        "nested": {
                                            "query": {
                                                "terms": {
                                                    "product_stores.store_id": [
                                                        20889
                                                    ],
                                                    "boost": 1
                                                }
                                            },
                                            "path": "product_stores",
                                            "ignore_unmapped": false,
                                            "score_mode": "avg",
                                            "boost": 1
                                        }
                                    },
                                    {
                                        "nested": {
                                            "query": {
                                                "nested": {
                                                    "query": {
                                                        "terms": {
                                                            "members.product_stores.store_id": [
                                                                20889
                                                            ],
                                                            "boost": 1
                                                        }
                                                    },
                                                    "path": "members.product_stores",
                                                    "ignore_unmapped": false,
                                                    "score_mode": "avg",
                                                    "boost": 1
                                                }
                                            },
                                            "path": "members",
                                            "ignore_unmapped": false,
                                            "score_mode": "avg",
                                            "boost": 1,
                                            "inner_hits": {
                                                "name": "members",
                                                "ignore_unmapped": false,
                                                "from": 0,
                                                "size": 100,
                                                "version": false,
                                                "explain": false,
                                                "track_scores": false,
                                                "_source": false
                                            }
                                        }
                                    }
                                ],
                                "adjust_pure_negative": true,
                                "minimum_should_match": "1",
                                "boost": 1
                            }
                        },
                        {
                            "bool": {
                                "should": [
                                    {
                                        "nested": {
                                            "query": {
                                                "terms": {
                                                    "tags.id": [
                                                        1001
                                                    ],
                                                    "boost": 1
                                                }
                                            },
                                            "path": "tags",
                                            "ignore_unmapped": false,
                                            "score_mode": "avg",
                                            "boost": 1
                                        }
                                    },
                                    {
                                        "nested": {
                                            "query": {
                                                "nested": {
                                                    "query": {
                                                        "terms": {
                                                            "members.tags.id": [
                                                                1001
                                                            ],
                                                            "boost": 1
                                                        }
                                                    },
                                                    "path": "members.tags",
                                                    "ignore_unmapped": false,
                                                    "score_mode": "avg",
                                                    "boost": 1
                                                }
                                            },
                                            "path": "members",
                                            "ignore_unmapped": false,
                                            "score_mode": "avg",
                                            "boost": 1,
                                            "inner_hits": {
                                                "name": "members",
                                                "ignore_unmapped": false,
                                                "from": 0,
                                                "size": 100,
                                                "version": false,
                                                "explain": false,
                                                "track_scores": false,
                                                "_source": false
                                            }
                                        }
                                    }
                                ],
                                "adjust_pure_negative": true,
                                "minimum_should_match": "1",
                                "boost": 1
                            }
                        }
                    ],
                    "adjust_pure_negative": true,
                    "boost": 1
                }
            },
            "boost": 1
        }
    },
    "sort": [
        {
            "_id": {
                "order": "desc"
            }
        }
    ]
}

То, что я пытаюсь достичь с помощью этого, - это выбрать объект, у которого есть хотя бы один вложенный объект, который соответствует всем условиям must в основном запросе bool.Но я получаю записи, даже если нет ни одного объекта, который соответствует всем 3. Например, если есть запись, которая соответствует только status и tags, но не store_ids, этот упругий поиск вернет ее, несмотря навсе условия являются частью must.Может кто-нибудь объяснить, пожалуйста, поведение этого запроса?Я пытался читать документы, но я в растерянности.

Любой указатель или руководство будет высоко ценится.

Спасибо!

ОБНОВЛЕНИЕ:

Я исправил эту проблему, объединив все вложенные объекты в одну вложенную необходимость.

1 Ответ

0 голосов
/ 18 мая 2018

В своем запросе вы используете предложение should, которое будет возвращать результаты, даже если они не соответствуют всем условиям предложения should.Ваше предложение must имеет приоритет над предложением should.

В соответствии с документацией Bool Query , вы можете отрегулировать минимум в соответствии с параметром .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...