突出显示在 Elasticsearch 和 PHP 中不起作用
Highlighting does not work in Elasticsearch and PHP
我刚刚在我的 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
”。那么,这有什么问题,我该如何解决?
pre_tags
和 post_tags
的值应该是一个数组(但是如果你不想更改 em
标签你可以忽略它们,它们已经设置为默认值).
fields
值应该是一个数组,key是字段名,value是一个包含字段选项的数组。
试试这个修复:
$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']
The important thing to notice is that the highligted results goes into the highlight
array - $res['hits']['hits'][0]['highlight']
.
我刚刚在我的 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
”。那么,这有什么问题,我该如何解决?
pre_tags
和post_tags
的值应该是一个数组(但是如果你不想更改em
标签你可以忽略它们,它们已经设置为默认值).fields
值应该是一个数组,key是字段名,value是一个包含字段选项的数组。
试试这个修复:
$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']
The important thing to notice is that the highligted results goes into the
highlight
array -$res['hits']['hits'][0]['highlight']
.