ElasticPress is een snelle en flexibele zoek- en query-engine voor WordPress. ElasticPress integreert met het WP_Query-object en retourneert resultaten vanuit Elasticsearch in plaats van MySQL. ElasticPress biedt voldoende hooks en filters om de zoekresultaten te beïnvloeden. Eerder schreef ik al een een introductie over Elasticsearch. Deze blog is wat technischer van aard en behandel ik de 5 meest interessante filters en hooks.
ep_elasticpress_enabled
Alle queries met de s
parameter maken automatisch gebruik van Elasticsearch. Evenals de post type archief pagina’s. Mocht je Elasticsearch voor een specifieke post type archief pagina willen uitschakelen is dat eenvoudig mogelijk met de ep_elasticpress_enabled
filter.
add_filter( 'ep_elasticpress_enabled', 'yourtheme_disable_ep_query', 10, 2 );
function yourtheme_disable_ep_query( $enabled, $query ) {
if ( $query->is_post_type_archive( 'your_post_type' ) ) {
return false;
}
return $enabled;
}
ep_prepare_meta_allowed_protected_keys
Verborgen metavelden worden standaard niet geïndexeerd door ElasticPress. Verborgen metavelden zijn velden met een underscore voor de naam. Bijvoorbeeld _yourtheme_post_rating
.
Mocht je de resultaten willen sorteren op basis van de waarde van een verborgen metaveld, is dat standaard niet mogelijk. Gelukkig geeft ElasticPress de mogelijkheid om verborgen metavelden toe te voegen aan de index met de ep_prepare_meta_allowed_protected_keys
filter.
add_filter( 'ep_prepare_meta_allowed_protected_keys', 'yourtheme_ep_meta_fields', 10, 2 );
function yourtheme_ep_meta_fields( $protected_keys, $post ) {
$protected_keys[] = '_yourtheme_post_rating';
return $protected_keys;
}
ep_search_fields
ElasticPress zoekt standaard in de titel, samenvatting en content van een bericht. Je kan echter zelf bepalen in welke data gezocht mag worden. Het is bijvoorbeeld mogelijk het samenvattingsveld uit te sluiten en te zoeken in tags. De ep_search_fields
filter is je vriend.
add_filter( 'ep_search_fields', 'yourtheme_ep_search_fields', 10, 2 );
function yourtheme_ep_search_fields( $search_fields, $args ) {
unset( $search_fields['post_excerpt'] );
$search_fields[] = 'terms.post_tag.name';
return $search_fields;
}
ep_fuzziness_arg
Met zogenaamde fuzzy queries kunnen de zoekresultaten beïnvloed worden. Bij fuzzy search kunnen bijvoorbeeld spelfouten worden opgespoord om zo toch de juiste resultaten te tonen. Deze fuzzy queries kunnen echter ook resulteren in ongewenste resultaten. ElasticPress geeft de optie om fuzziness in te stellen met de ep_fuzziness_arg
filter.
add_filter( 'ep_fuzziness_arg', 'yourtheme_disable_ep_fuzziness', 10, 3 );
function yourtheme_disable_ep_fuzziness( $fuzziness, $search_fields, $args ) {
return 0;
}
ep_formatted_args
Bij een zoekopdracht met meerdere woorden vindt Elasticsearch alle berichten waarin deze woorden voorkomen. Je kan dit beïnvloeden door de query operator te wijzigen naar ‘and’ in plaats van ‘or’. Elasticsearch zal nu alleen berichten vinden die exact overeenkomen met de zoekopdracht.
add_filter( 'ep_formatted_args', 'yourtheme_set_es_search_args', 10, 2 );
function yourtheme_set_es_search_args( $ep_formatted_args, $args ) {
$ep_formatted_args['query']['bool']['should'][0]['multi_match']['operator'] = 'and';
$ep_formatted_args['query']['bool']['should'][1]['multi_match']['operator'] = 'and';
$ep_formatted_args['query']['bool']['should'][2]['multi_match']['operator'] = 'and';
return $ep_formatted_args;
}
Deze hooks en filters zouden je op weg moeten helpen om de Elasticsearch zoekresultaten te beïnvloeden. Ook interesse in een razendsnelle zoekfunctie? Neem contact met ons op.