Как найти объекты с внутренними объектами, имеющими несколько полей по определенным значениям в эластичном поиске

#elasticsearch

#elasticsearch

Вопрос:

У меня есть индекс с объектами с именем «DynamicFields», и у каждого из них есть внутренние объекты с именем «Fields», подобные этому:

  {
                "DynamicFields": [
                    {
                        "Fields": [
                            {
                                "DFieldVal": "Value1",
                                "Owned": 0,
                                "DFieldRelCode": 181254,
                                "DFieldCode": 1835
                            },
                            {
                                "DFieldVal": "Value2",
                                "Owned": 0,
                                "DFieldRelCode": 181255,
                                "DFieldCode": 1836
                            },
                            {
                                "DFieldVal": "Value3",
                                "Owned": 1,
                                "DFieldRelCode": 181256,
                                "DFieldCode": 1837
                            },
                            {
                                "DFieldVal": "Value4",
                                "Owned": 0,
                                "DFieldRelCode": 181257,
                                "DFieldCode": 1838
                            }
                        ]
                    }
                ]
            }
  

Мне нужно найти объекты «DynamicFields», у которых есть внутренние объекты «Fields» с этими точными значениями:

«DFieldCode»: 1837

и

«Принадлежит»: 0

Я использую этот запрос для этого, но он дает мне неверный результат, он должен возвращать пустой результат, потому что нет ни одного внутреннего объекта «Поля», имеющего оба значения:

 {
  "from":0,
  "size":10,
  "query": {
    "bool":{
        "must":[
            { "terms": { "DynamicFields.Fields.Owned" : [0] } },
            { "terms": { "DynamicFields.Fields.DFieldCode" : [1837] } }
        ]
    }
  }
}
  

Я думаю, проблема в том, что эластичный поиск рассматривает свойства внутренних объектов как обычное свойство для корневого объекта, поэтому он возвращает объекты, которые имеют упомянутые поля во всех внутренних объектах, независимо от того, в одном и том же внутреннем объекте.

РЕДАКТИРОВАТЬ: я обобщил данные, чтобы упростить их отображение, — это полная карта данных:

 {
"marketplace": {
    "mappings": {
        "object": {
            "properties": {
                "Addresses": {
                    "properties": {
                        "AddrID": {
                            "type": "long"
                        },
                        "AddressText": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "AddressTree": {
                            "properties": {
                                "AddrFieldRelID": {
                                    "type": "long"
                                },
                                "AddrTitleName": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                },
                                "AddrTitlePersianName": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                },
                                "AddrValName": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                },
                                "Latitude": {
                                    "type": "float"
                                },
                                "Longitude": {
                                    "type": "float"
                                }
                            }
                        },
                        "Latitude": {
                            "type": "float"
                        },
                        "Longitude": {
                            "type": "float"
                        },
                        "Tel": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        }
                    }
                },
                "DelFlag": {
                    "type": "long"
                },
                "DynamicFields": {
                    "properties": {
                        "DynamicDefCode": {
                            "type": "long"
                        },
                        "DynamicDefDataTypeName": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "DynamicDefName": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "DynamicValKind": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "Fields": {
                            "properties": {
                                "DFieldCode": {
                                    "type": "long"
                                },
                                "DFieldRelCode": {
                                    "type": "long"
                                },
                                "DFieldVal": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                },
                                "Owned": {
                                    "type": "boolean"
                                }
                            }
                        }
                    }
                },
                "GFRefCode": {
                    "type": "long"
                },
                "GoodsDesc": {
                    "properties": {
                        "FName": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "GoodsFullName": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "Supplier": {
                            "properties": {
                                "Barcode": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                },
                                "GPackDayPrice": {
                                    "type": "long"
                                },
                                "GoodsEnterDate": {
                                    "type": "date"
                                },
                                "GoodsFinalCode": {
                                    "type": "long"
                                },
                                "GoodsFullName": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                },
                                "GoodsWHStock": {
                                    "type": "long"
                                },
                                "StoreName": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                },
                                "UserName": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                },
                                "WHName": {
                                    "type": "text",
                                    "fields": {
                                        "keyword": {
                                            "type": "keyword",
                                            "ignore_above": 256
                                        }
                                    }
                                },
                                "WareHouseCode": {
                                    "type": "long"
                                }
                            }
                        },
                        "UserName": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        }
                    }
                },
                "GoodsFinalCode": {
                    "type": "long"
                },
                "Images": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "IsMainObject": {
                    "type": "boolean"
                },
                "ObjectDetailPackID": {
                    "type": "long"
                },
                "ObjectKind": {
                    "type": "long"
                },
                "Prices": {
                    "properties": {
                        "Barcode": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "GPWeight": {
                            "type": "float"
                        },
                        "GpackDayPrice": {
                            "type": "long"
                        },
                        "PackingName": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        }
                    }
                },
                "RefGoodsFinalCode": {
                    "type": "long"
                },
                "TreePath": {
                    "properties": {
                        "DFieldCode": {
                            "type": "long"
                        },
                        "DFieldRelCode": {
                            "type": "long"
                        },
                        "DFieldVal": {
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
  

}

Спасибо.

Комментарии:

1. Каков тип данных поля Fields ? Это object или nested ?

2. Извините, я новичок в эластичном поиске, я не знаю разницы между object и nested

3. Можете ли вы добавить отображение индекса? Используйте GET <index>/_mappings

4. я не добавлял никакого сопоставления к индексу при его создании, вы думаете, проблема в сопоставлении индекса?

5. Извините, мой плохой, это должно быть _mapping , а не _mappings

Ответ №1:

Поскольку ваш индекс показывает, что вы сохранили свой массив как объект, подробнее об этом читайте здесь

В основном, если не указано иное, elasticsearch выравнивает массивы при сохранении, в результате чего объекты в массивах теряют свою структуру. вы должны определить тип полей как вложенных, чтобы избежать этого.