ElasticPress - 搜索元和高级自定义字段不起作用
ElasticPress - searching meta and Advanced Custom Fields not working
我们将 Wordpress 4.9.5 与 ElasticPress 2.5 和 Searchly 结合使用。
默认搜索工作正常。但是,我们正在索引数十万个零件号,每个零件号在 wordpress 中都是一个 post。与许多零件号一样,它们的标题如 ABC-12-B23-QQ。
我们开箱即用地使用 ElasticPress。它被宣传为开箱即用,但...
它似乎只搜索 post 个标题。它根本没有搜索我们的高级自定义字段。我们将 ACF 用于所有零件细节,例如长度、颜色和光洁度,因此我们能够搜索这些字段非常重要。
如何让 Elasticpress 搜索我的自定义字段?我需要使用自定义映射吗?
https://github.com/10up/ElasticPress
注意:我正在 posting 这个,所以它包含在 Whosebug 中,以供以后搜索的其他人使用。如果我在搜索开始时就在 Whosebug 上找到它,那会节省我几个小时。 :)
事实证明,是的,ElasticPress 会自动映射所有元字段,但默认情况下,它不会搜索它们。
根据文档 (https://github.com/10up/ElasticPress),
"以下是只有ElasticPress支持的特殊参数
search_fields (array)
If not specified, defaults to array( 'post_title', 'post_excerpt', 'post_content' ).
这是我的问题。要解决,你必须告诉 ElasticPress 要搜索哪些字段。
ElasticPress 文档包含此示例使用 WP_Query:
new WP_Query( array(
's' => 'meta search phrase',
'search_fields' => array(
'post_title',
'post_content',
'post_excerpt',
'meta' => array( 'meta_key_1', 'meta_key_2' ),
),
) );
我真的需要连接到现有的搜索查询,所以这是我使用 pre_get_posts 操作所做的示例:
function my_search_filter($query) {
if ( !is_admin() && $query->is_main_query() ) {
if ($query->is_search() ) {
$query->set('search_fields', array(
'post_title',
'meta' => array( 'bin_part_number',
'shelf_part_number',
)));
}
}
}
add_action('pre_get_posts','my_search_filter',1);
目前,唯一真正有效的方法是使用 ep_search_fields
挂钩。注意:您必须确保该字段已被索引,但默认情况下会添加所有 ACF 字段。您可以使用以下代码。经过长时间的努力,关键是它必须提供为 meta.yourfield.value
add_filter( 'ep_search_fields', 'update_search_fields', 11, 2 );
/**
* Updates fields to search against.
*
* @param array $fields List of searchable fields.
* @param array $args List of arguments provided.
*
* @return array
*/
function update_search_fields( array $fields, array $args ): array {
$fields[] = 'meta.mfr_part.value';
return $fields;
}
还有一个更复杂的示例,它允许您提供一个字段数组,因为这个数组可以由辅助函数生成并在其他地方使用。
/**
* ElasticSearch: Modify available search fields
*/
add_filter( 'ep_search_fields', function($search_fields, $args ) {
$fields = ['my_field'];
foreach($acf_fields as $key => $label) {
$fields[] = 'meta.'.$key.'.value';
}
return array_merge( $search_fields, $fields );
}, 10,2 );
我们将 Wordpress 4.9.5 与 ElasticPress 2.5 和 Searchly 结合使用。
默认搜索工作正常。但是,我们正在索引数十万个零件号,每个零件号在 wordpress 中都是一个 post。与许多零件号一样,它们的标题如 ABC-12-B23-QQ。
我们开箱即用地使用 ElasticPress。它被宣传为开箱即用,但...
它似乎只搜索 post 个标题。它根本没有搜索我们的高级自定义字段。我们将 ACF 用于所有零件细节,例如长度、颜色和光洁度,因此我们能够搜索这些字段非常重要。
如何让 Elasticpress 搜索我的自定义字段?我需要使用自定义映射吗?
https://github.com/10up/ElasticPress
注意:我正在 posting 这个,所以它包含在 Whosebug 中,以供以后搜索的其他人使用。如果我在搜索开始时就在 Whosebug 上找到它,那会节省我几个小时。 :)
事实证明,是的,ElasticPress 会自动映射所有元字段,但默认情况下,它不会搜索它们。
根据文档 (https://github.com/10up/ElasticPress),
"以下是只有ElasticPress支持的特殊参数
search_fields (array)
If not specified, defaults to array( 'post_title', 'post_excerpt', 'post_content' ).
这是我的问题。要解决,你必须告诉 ElasticPress 要搜索哪些字段。
ElasticPress 文档包含此示例使用 WP_Query:
new WP_Query( array(
's' => 'meta search phrase',
'search_fields' => array(
'post_title',
'post_content',
'post_excerpt',
'meta' => array( 'meta_key_1', 'meta_key_2' ),
),
) );
我真的需要连接到现有的搜索查询,所以这是我使用 pre_get_posts 操作所做的示例:
function my_search_filter($query) {
if ( !is_admin() && $query->is_main_query() ) {
if ($query->is_search() ) {
$query->set('search_fields', array(
'post_title',
'meta' => array( 'bin_part_number',
'shelf_part_number',
)));
}
}
}
add_action('pre_get_posts','my_search_filter',1);
目前,唯一真正有效的方法是使用 ep_search_fields
挂钩。注意:您必须确保该字段已被索引,但默认情况下会添加所有 ACF 字段。您可以使用以下代码。经过长时间的努力,关键是它必须提供为 meta.yourfield.value
add_filter( 'ep_search_fields', 'update_search_fields', 11, 2 );
/**
* Updates fields to search against.
*
* @param array $fields List of searchable fields.
* @param array $args List of arguments provided.
*
* @return array
*/
function update_search_fields( array $fields, array $args ): array {
$fields[] = 'meta.mfr_part.value';
return $fields;
}
还有一个更复杂的示例,它允许您提供一个字段数组,因为这个数组可以由辅助函数生成并在其他地方使用。
/**
* ElasticSearch: Modify available search fields
*/
add_filter( 'ep_search_fields', function($search_fields, $args ) {
$fields = ['my_field'];
foreach($acf_fields as $key => $label) {
$fields[] = 'meta.'.$key.'.value';
}
return array_merge( $search_fields, $fields );
}, 10,2 );