#elasticsearch
#elasticsearch
Вопрос:
у меня есть это отображение в моем индексе elasticsearch:
{
"mappings": {
"properties": {
"title": {
"type": "keyword"
},
"description": {
"type": "text"
},
"content": {
"type": "text"
},
"author": {
"type": "keyword"
},
"completionTimeMinutes": {
"type": "integer"
},
"views": {
"type": "integer"
},
"questions": {
"type": "nested",
"properties": {
"question": {
"type": "keyword"
},
"answers": {
"type": "keyword"
},
"rightAnswer": {
"type": "integer"
}
}
}
}
}
}
И у меня есть некоторые проблемы с запросами из нескольких полей. В моем случае я хочу выполнить поиск по названию, описанию, содержанию, вопросам.вопрос, вопросы.ответ.
Мой запрос, который не работает, выглядит следующим образом:
{
"query": {
"bool": {
"must": {
"multi_match": {
"query": "text to search i put here",
"type": "cross_fields",
"fields": [
"title",
"description",
"content",
"questions.question",
"questions.answers"
],
"slop": 1
}
}
}
}
}
Я также пробовал {"query": { "nested": { "path": "questions", ......
, где …… находится над запросом, но если это так, я не могу выполнить поиск по названию, описанию, содержимому. Поэтому, пожалуйста, скажите мне, как выполнять запросы с нескольких вложенных уровней.
Комментарии:
1. пожалуйста, просмотрите мой ответ и дайте мне знать, была ли это ваша проблема?
Ответ №1:
Вам нужно объединить вложенные и не вложенные поисковые запросы. Обратитесь к официальной документации ES, чтобы узнать больше о запросах bool.
Добавление рабочего примера с индексными данными, поисковым запросом и результатом поиска
Индексировать данные:
{
"title": "a",
"description": "a",
"content": "b",
"questions": [
{
"question": "c",
"answers": "c"
}
]
}
Поисковый запрос:
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "a",
"type": "cross_fields",
"fields": [
"title",
"content"
],
"slop": 1
}
},
{
"nested": {
"path": "questions",
"query": {
"multi_match": {
"query": "c",
"type": "cross_fields",
"fields": [
"title",
"content",
"questions.question",
"questions.answers"
],
"slop": 1
}
}
}
}
],
"minimum_should_match":1
}
}
}
Результат поиска:
"hits": [
{
"_index": "stof_64155263",
"_type": "_doc",
"_id": "1",
"_score": 0.5753642,
"_source": {
"title": "a",
"description": "a",
"content": "b",
"questions": [
{
"question": "c",
"answers": "c"
}
]
}
}
]
Комментарии:
1. Хорошо, это работает, но не так, как я хочу. Вы можете мне помочь? Мне нужно искать одно и то же содержимое по всем полям. Например, я мог бы создать большую строку из всех полей и выполнить поиск в ней. Когда я выполняю поиск с помощью своего метода по объектам, которые имеют большую строку в поле содержимого, он работает нормально, но когда я выполняю поиск таким же образом с вашим методом, он возвращает пустой массив. Как можно объединить все значения из полей в одну большую строку и выполнять поиск только в ней?