Задать вопрос
lancer_serega
@lancer_serega
PHP Developer

Не могу составить запрос, уже голову сломал. Что я делаю не так?

Здравствуйте. Немного предистории...
Есть курсы у курсов есть список тегов.
Делаю индекс:
'mappings' => [

    'properties' => [

        'id' => [

            'type' => 'integer',

        ],

        'name' => [

            'type' => 'text',

            'analyzer' => 'course',

        ],

        'format' => [

            'type' => 'keyword',

            'null_value' => '',

        ],

        'tags' => [

            'type' => 'nested',

            'properties' => [

                'id' => [

                    'type' => 'integer',

                ],

                'name' => [

                    'type' => 'text',

                    'analyzer' => 'tags',

                ],

            ],

        ],

    ],

]


Я пытаюсь составить запрос на получение курсов по списку идентификаторов (идентификатор курса совпадает с идентификатором документа) и потом в них нужно найти искомое слово в названии курса или в названии тега. На sql я бы сделал так:
...
WHERE id IN(...) and (name like '...' or tags.name like '...');


Вот что получил из последних результатов пробования составить данный запрос на эластике (он не правильный)
'query' => [

    'bool' => [

        'must' => [

            ['terms' => ['id' => $options['course_ids']]],

        ],

        'should' => [

            ['match' => [

                'name' => ['query' => $searchable],

            ]],


            ['nested' => [

                'path',

                'query' => [

                    'bool' => [

                        'must' => [

                            ['match' => ['tags.name' => ['query' => $searchable]]],

                        ],

                    ]

                ],

            ]],

        ],

    ],

],



Подскажите пожалуйста где я ошибся? Как его довести "до ума"?
  • Вопрос задан
  • 40 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
lancer_serega
@lancer_serega Автор вопроса
PHP Developer
Решил сам. Вот ответ если кому интересно.
{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "id": [
                 111,
                 222,
                 333
            ]
          }
        },
        {
          "bool": {
            "should": [
              {
                "match": {
                  "name": {
                    "query": "курс"
                  }
                }
              },
              {
                "nested": {
                  "path": "tags",
                  "query": {
                    "match": {
                      "tags.name": {
                        "query": "курс"
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@siri0s
Nested тут необязателен, т.к. поиск в нем по одному полю.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы