Выделение не работает в Elasticsearch и PHP

Я только что загрузил и установил последнюю версию Elasticsearch на моем компьютере с Windows. Я выполнил свои первые поисковые запросы, и все, казалось, работало нормально. Однако. когда я пытаюсь выделить результаты поиска, я терплю неудачу. Итак, так выглядит мой запрос:

$params = [
    'index' => 'test_index',
    'type' => 'test_index_type',
    'body' => [
        'query' => [
            'bool' => [
                'should' => [ 'match' => [ 'field1' => '23' ] ]
            ]
        ],
        'highlight' => [
            'pre_tags' => "<em>", 
            'post_tags' => "</em>",
            'fields' => (object)Array('field1' => new stdClass),
            'require_field_match' => false
        ]
     ]     
]

$res = $client->search($params);

В целом сам запрос работает хорошо - результаты фильтруются. На консоли я вижу, что все документы действительно содержат значение "23" в поле field1. Однако эти теги - <em></em> просто не добавляются к результату. То, что я вижу, это просто исходное значение в field1, как "some text 23", "23 another text". Это не то, что я ожидаю увидеть - "some text <em>23</em>", "<em>23</em> another text". Итак, что не так с этим и как я могу это исправить?

Ответ 1

Из руководства:

  • Значение pre_tags и post_tags должно быть массивом (однако, если вы не хотите изменять теги em, вы можете их игнорировать, они уже заданы как по умолчанию).
  • Значение fields должно быть массивом, ключ - это имя поля, а значение - это массив с параметрами поля.

Попробуйте это исправление:

$params = [
    'index' => 'test_index',
    'type' => 'test_index_type',
    'body' => [
        'query' => [
            'bool' => [
                'should' => [ 'match' => [ 'field1' => '23' ] ]
            ]
        ],
        'highlight' => [
            // 'pre_tags' => ["<em>"], // not required
            // 'post_tags' => ["</em>"], // not required
            'fields' => [
                'field1' => new \stdClass()
            ],
            'require_field_match' => false
        ]
     ]     
];

$res = $client->search($params);
var_dump($res['hits']['hits'][0]['highlight']);

Обновление

  • Была ли двойная проверка, значение поля в массиве fields должно быть объектом (это требование, а не то же самое, что и другие параметры).
  • pre/post_tags также может быть строками (а не массивом).
  • Вы проверили правильный ответ? $res['hits']['hits'][0]['highlight']

Важно отметить, что highligted результаты попадают в массив highlight - $res['hits']['hits'][0]['highlight'].