Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Highlighting does not work in Elasticsearch and PHP

I've just downloaded and installed the last version of Elasticsearch on my Windows machine. I did my first search queries and everything seemed to work ok. However. when I try to highlight the search results, I fail. So, this is how my query looks like:

$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);

On the whole the query itself works nice - the results are filtered. In the console I see, that all documents indeed contain "23" value in their field1 field. However, these tags - <em></em> are simply not added to the result. What I see is just the raw value in field1 like "some text 23", "23 another text". It is not what I expect to see - "some text <em>23</em>", "<em>23</em> another text". So, what is wrong with that and how can I fix it?

like image 924
Jacobian Avatar asked Oct 29 '16 08:10

Jacobian


1 Answers

From the manual:

  1. The value of pre_tags and post_tags should be an array (however if you don't want to change the em tags you can ignore them, they already set as default).
  2. The fields value should be an array, key is the field name and the value is an array with the field options.

Try this fix:

$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']);

update

  1. Did a double check, the value of the field in the fields array should be an object (which is a requirement, not exactly the same as other options).
  2. The pre/post_tags can also be strings (and not array).
  3. Did you check the correct response? $res['hits']['hits'][0]['highlight']

The important thing to notice is that the highligted results goes into the highlight array - $res['hits']['hits'][0]['highlight'].

like image 113
Dekel Avatar answered Nov 01 '22 13:11

Dekel