Мы используем Wordpress 4.9.5 с ElasticPress 2.5 и Searchly.

Поиск по умолчанию работает нормально. Однако мы индексируем сотни тысяч номеров деталей, каждый из которых является публикацией в wordpress. Как и у многих номеров деталей, они имеют такие названия, как ABC-12-B23-QQ.

Мы используем ElasticPress прямо из коробки. Рекламируется, что он отлично работает прямо из коробки, но ...

Похоже, что он ищет только заголовки сообщений. Он вообще не выполняет поиск в наших расширенных настраиваемых полях. Мы используем ACF для всех деталей детали, таких как длина, цвет и отделка, поэтому очень важно, чтобы мы могли выполнять поиск в этих полях.

Как заставить Elasticpress выполнять поиск в моих настраиваемых полях? Нужно ли мне использовать настраиваемое сопоставление?

https://github.com/10up/ElasticPress

ПРИМЕЧАНИЕ: я публикую это, чтобы оно было включено в stackoverflow для других, которые будут искать позже. Это сэкономило бы мне часы, если бы я нашел это в Stackoverflow в начале своего поиска. :)

2
dwlorimer 26 Апр 2018 в 17:38

2 ответа

Лучший ответ

Оказывается, да, 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);
3
dwlorimer 29 Мар 2019 в 13:51

На данный момент единственный метод, который действительно работает, - это использовать ловушку 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 );
2
shaneonabike 29 Ноя 2020 в 17:02