У меня есть набор данных в следующей структуре:
[
{
"productId": "ProductId1",
"customerNumbers": [
"customer": {
"name": "Prod1Cust1",
"totalOrders": 23
},
"customer": {
"name": "Prod2Cust1",
"totalOrders": 5
},
"customer": {
"name": "Prod3Cust1",
"totalOrders": 5
}
]
},
{
"productId": "ProductId2",
"customerNumbers": [
"customer": {
"name": "Prod2Cust1",
"totalOrders": 23
},
"customer": {
"name": "Prod2Cust1",
"totalOrders": 5
}
]
}
]
, и мне нужно выбрать все записи, которые имеют префикс of "Prod1, как в поле name (в приведенном примере избегать следует возвращать только первую запись, например ProductId1). Кроме того, при возврате данных мне нужно просто выбрать номер клиента, префикс которого равен Prod1, то есть:
Правильный вывод:
{
"productId": "ProductId1",
"customerNumbers": [
"customer": {
"name": "Prod1Cust1",
"totalOrders": 23
}
]
}
Вместо:
{
"productId": "ProductId1",
"customerNumbers": [
"customer": {
"name": "Prod1Cust1",
"totalOrders": 23
},
"customer": {
"name": "Prod2Cust1",
"totalOrders": 5
},
"customer": {
"name": "Prod3Cust1",
"totalOrders": 5
}
]
}
Я могу получить записи, чье Имя * Префикс 1021 * - это «Prod1» с использованием вложенного запроса в сочетании с MatchPhrasePrefixQuery (это возвращает мне результат со всеми номерами клиентов). Как я могу дополнительно отфильтровать данные, чтобы получить номера клиентов с префиксом Name «Prod1».
Следующий мой запрос:
{
"from": 0,
"size": 10,
"sort": [
{
"name.keyword": {
"missing": "_first",
"order": "asc"
}
}
],
"query": {
"bool": {
"must": [
{
"bool": {
"must": [
{
"nested": {
"query": {
"bool": {
"must": [
{
"match": {
"customerNumbers.name": {
"query": "Prod1",
"type": "phrase_prefix"
}
}
}
]
}
},
"path": "customerNumbers"
}
}
]
}
}
]
}
}
}
PS: я использую ElasticSearch 5.x с Nest.