Эластичный поиск вложенных многопоточных запросов
Поэтому моя проблема в основном такая же, как описано здесь, однако она по-прежнему остается без ответа в группе.
Мое отображение:
{
"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"]
}
}
]
}
}
Я также не уверен, что повышение будет работать так, как ожидалось, обеспечивая его установку в разных запросах. Любые предложения оценили.