Подсветка не работает в 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". Итак, что с этим не так и как я могу это исправить?


person Jacobian    schedule 29.10.2016    source источник
comment
Похоже, что pre_tags и post_tags могут ожидать массив... можете ли вы попробовать обернуть оба в em строки в []?   -  person Sam    schedule 01.11.2016
comment
Вы пытались выполнить этот запрос вне PHP? (Например, с помощью плагина Sense в Kibana или простой команды curl.) Работает ли подсветка?   -  person Andrei Stefan    schedule 01.11.2016
comment
@Андрей Штефан. Нет, этого я еще не пробовал.   -  person Jacobian    schedule 02.11.2016
comment
@Сэм. Это не помогает. Я проверил это. Я получаю отфильтрованные результаты, но без выделения   -  person Jacobian    schedule 02.11.2016
comment
@Андрей Штефан. Я попробовал curl, но в Windows он работает ужасно. Я не могу делать запросы, которые содержат флаг -d и некоторое тело json - в этом случае в Windows я получаю некоторые ошибки синтаксического анализа.   -  person Jacobian    schedule 02.11.2016


Ответы (1)


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

  1. Значение pre_tags и post_tags должно быть массивом (однако, если вы не хотите изменять теги em, вы можете их игнорировать, они уже установлены по умолчанию).
  2. Значение 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']);

Обновить

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

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

person Dekel    schedule 02.11.2016
comment
Спасибо! Я проверю это через минуту. - person Jacobian; 02.11.2016
comment
К сожалению, это не работает. Теперь я получаю это сообщение об ошибке [highlight_field] Expected START_OBJECT but was: START_ARRAY. Итак, я думаю, что в вашем примере есть некоторые проблемы с 'field1' => []. Кстати, в документах это выглядит так "fields" : { "content" : {} }. Я не вижу здесь массивов. - person Jacobian; 02.11.2016
comment
Пока эта структура работает - 'fields' => ['field1' => (object)[]]. Но все равно не работают ни pre_tags и post_tags по умолчанию (когда я их игнорирую), ни неявные 'pre_tags' => ['<em>'], 'post_tags' => ['</em>']. - person Jacobian; 02.11.2016
comment
@Jacobian, проверьте обновление, пожалуйста. Какую версию библиотеки php вы используете? - person Dekel; 02.11.2016
comment
Я установил библиотеку с помощью composer. Файл выглядит как {"require": { "elasticsearch/elasticsearch": "~5.0" }} - person Jacobian; 02.11.2016
comment
Кажется правильным. Вы проверили $res['hits']['hits'][0]['highlight'] выделенные результаты? - person Dekel; 02.11.2016
comment
Я только что проверил! Теперь я вижу, что это то, что мне нужно! Спасибо! Я не знал, что выделенные результаты идут отдельно от _source. Но все равно спасибо! - person Jacobian; 02.11.2016
comment
Добавил уточнение по этому поводу :) - person Dekel; 02.11.2016