Эластичный поиск вложенных многопоточных запросов

Поэтому моя проблема в основном такая же, как описано здесь, однако она по-прежнему остается без ответа в группе.

Мое отображение:

{
    "abstract": {
        "properties": {
            "summary": {
                "type": "string"
            }
        }
    },
    "authors": {
        "type": "nested",
        "properties": {
            "first_name": {
                "type": "string"
            },
            "last_name": {
                 "type": "string"
            }
        }
    }
}

И я хотел бы выполнить полнотекстовый поиск по обоим этим полям, возможно, неравномерно взвешенным. Запрос, который приходит мне на ум, но, к сожалению, не работает, будет следующим:

{
    "query": {
        "bool": {
            "should": [{
                "multi_match": {
                    "query": "higgs boson",
                    "fields": ["abstract.summary^5", "author.last_name^2"]
                }
            }]
        }
    }
}

Из поля авторов я не получаю никаких результатов из-за его вложенного отображения. Я также не могу избавиться от вложенного свойства - я использую его для агрегации. Любая элегантная идея, как ее решить?

Ответы

Ответ 1

Изменение вашего сопоставления на следующий, который использует include_in_root: true, позволит вам использовать запрос, который вы оригинал написал:

{
    "abstract": {
        "properties": {
            "summary": {
                "type": "string"
            }
        }
    },
    "authors": {
        "type": "nested",
        "include_in_root": true,
        "properties": {
            "first_name": {
                "type": "string"
            },
            "last_name": {
                 "type": "string"
            }
        }
    }
}

Вы можете индексировать внутренние объекты как вложенные поля, так и в виде сглаженных полей объекта. Этого можно добиться, установив include_in_parent в true. - Ссылка

Примечание: include_in_root может быть устаревшим в будущих версиях elasticsearch в пользу copy_to.

Ответ 2

Единственное решение, которое мне удалось решить, что не удобно и элегантно, но как-то работает, - это такой запрос:

"query": {
    "bool": {
        "should": [
            {
                "nested": {
                    "path": "authors",
                    "query": {
                        "multi_match": {
                            "query": "higgs",
                            "fields": ["last_name^2"]
                        }
                    }
                } 
            },
            {
                "multi_match": {
                    "query": "higgs",
                    "fields": ["abstract.summary^5"]
                }
            }
        ]
    }
}

Я также не уверен, что повышение будет работать так, как ожидалось, обеспечивая его установку в разных запросах. Любые предложения оценили.