@@ -, +, @@ of valid functions in syspref ElasticsearchFunctionScore --- .../Elasticsearch/QueryBuilder.pm | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -44,10 +44,12 @@ use JSON; use List::MoreUtils qw( each_array ); use Modern::Perl; use URI::Escape qw( uri_escape_utf8 ); +use YAML::XS; use C4::Context; use Koha::Exceptions; use Koha::Caches; +use Koha::Logger; our %index_field_convert = ( 'kw' => '', @@ -197,7 +199,7 @@ sub build_query { if ($options{whole_record}) { push @$fields, 'marc_data_array.*'; } - $res->{query} = { + $res->{query}->{function_score}->{query} = { query_string => { query => $query, fuzziness => $fuzzy_enabled ? 'auto' : '0', @@ -207,7 +209,20 @@ sub build_query { analyze_wildcard => JSON::true, } }; - $res->{query}->{query_string}->{type} = 'cross_fields' if C4::Context->preference('ElasticsearchCrossFields'); + + # Trying to get the scoring functions from the syspref or set as empty arrayref + my $scoring_functions = []; + eval { + $scoring_functions = YAML::XS::Load( C4::Context->preference('ElasticsearchFunctionScore') ) + if ( $options{weighted_fields} && C4::Context->preference('ElasticsearchFunctionScore') ); + 1; + } or do { + my $e = $@; + Koha::Logger->get->warn("Malformed yaml in ElasticsearchFunctionScore $e/n"); + }; + $res->{query}->{function_score}->{functions} = $scoring_functions; + + $res->{query}->{function_score}->{query}->{query_string}->{type} = 'cross_fields' if C4::Context->preference('ElasticsearchCrossFields'); if ( $options{sort} ) { foreach my $sort ( @{ $options{sort} } ) { --