У меня проблема с поиском в индексированных вложенных сопоставлениях в ElasticSearch 5.6 (High Rest Client - Java API).Когда я запрашиваю вложенные объекты, он не возвращает результатов.Когда я запрашиваю поля, которые являются стандартными (wikiField - text, и template.id - long), он возвращает этот процесс правильно.
Ниже я прилагаю свое отображение, индексированный объект и метод, используемый для поиска метаданных.Я запустил тест для параметра: карта с размером 1 ключ TSL_ATS и значение Proc
Отображение:
{
"mappings": {
"process": {
"dynamic": "strict",
"properties": {
"meta": {
"dynamic": "false",
"type": "object",
"properties": {
"ID": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"mdWrap": {
"type": "nested",
"properties": {
"test.metadata": {
"type": "nested",
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"content": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
},
"template": {
"properties": {
"id": {
"type": "long"
}
}
},
"wikiField": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
Индексированный объект, возвращаемый из индекса:
{
"_index": "testindex",
"_type": "process",
"_id": "2",
"_version": 7,
"found": true,
"_source": {
"wikiField": "problem",
"template.id": 1,
"meta": [
{
"mdWrap": {
"MDTYPE": "MODS",
"xmlData": {
"test": {
"test": "http://meta.test.org/v1/",
"metadata": [
{
"name": "TitleDocMain",
"content": "Second process"
},
{
"name": "TitleDocMainShort",
"content": "Second"
},
{
"name": "TSL_ATS",
"content": "Proc"
}
]
}
}
},
"ID": "DMDLOG_0000"
},
{
"mdWrap": {
"MDTYPE": "MODS",
"xmlData": {
"test": {
"test": "http://meta.test.org/v1/",
"metadata": {
"name": "pathimagefiles",
"content": "file:/2/images/Sec_Proc_tif"
}
}
}
},
"ID": "DMDPHYS_0000"
}
]
}
}
Метод запроса процесса с определенными метаданными:
public List<ProcessDTO> findByMetadata(Map<String, String> metadata) throws Exception {
String key = "meta.mdWrap.xmlData.test.metadata.";
BoolQueryBuilder query = new BoolQueryBuilder();
for (Map.Entry<String, String> entry : metadata.entrySet()) {
query.must(matchQuery(key + "name", entry.getKey()));
query.must(matchQuery(key + "content", entry.getValue()));
}
return findByQuery(query, true);
}