突出显示在Elasticsearch和PHP中不起作用

时间:2016-10-29 08:34:01

标签: php elasticsearch elasticsearch-5

我刚刚在Windows机器上下载并安装了最新版本的Elasticsearch。我做了我的第一次搜索查询,一切似乎都正常。然而。当我试图突出搜索结果时,我失败了。所以,这就是我的查询的样子:

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

总的来说,查询本身效果很好 - 结果被过滤掉了。在我看到的控制台中,所有文档的field1字段中确实包含“23”值。但是,这些标记 - <em></em>根本不会添加到结果中。我看到的只是field1中的原始值,例如“some text 23”,“23 another text”。这不是我期望看到的 - “some text <em>23</em>”,“<em>23</em> another text”。那么,这有什么问题,我该如何解决?

1 个答案:

答案 0 :(得分:12)

From the manual

  1. pre_tagspost_tags的值应该是一个数组(但是如果您不想更改em标记,则可以忽略它们,它们已经设置为默认值)。
  2. fields值应为数组,key为字段名称,值为带字段选项的数组。
  3. 尝试此修复:

    $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']
    4.   

      需要注意的重要事项是,高强度结果会进入highlight数组 - $res['hits']['hits'][0]['highlight']