default_operator => 'AND',
default_field => '_all',
lenient => JSON::true,
+ fields => $options{fields},
+ use_dis_max => JSON::true,
}
};
join( ' ', $self->_create_query_string(@search_params) ) || (),
$self->_join_queries( $self->_convert_index_strings(@$limits) ) || () );
+ my @weights = $params->{weight};
+ my @w_fields = $params->{w_fields};
+ my @fields = '_all';
+ if ( defined $weights[0] ) {
+ for (my $i = 0 ; $i < (scalar @weights) ; $i++ ){
+ push @fields, "$w_fields[$i]^$weights[$i]";
+ }
+ }
+
# If there's no query on the left, let's remove the junk left behind
$query_str =~ s/^ AND //;
my %options;
+ $options{fields} = \@fields;
$options{sort} = \@sort_params;
$options{expanded_facet} = $params->{expanded_facet};
my $query = $self->build_query( $query_str, %options );
=cut
+=head3 weighted_fields
+
+my (@w_fields, @weight) = Koha::SearchFields->weighted_fields();
+
+=cut
+
+sub weighted_fields {
+ my ($self) = @_;
+
+ my ($w_fields, $weight) = ([], []);
+ my $fields = $self->search(
+ { weight => { '>' => 0, '!=' => undef } },
+ { order_by => { -desc => 'weight' } }
+ );
+
+ while ( my $field = $fields->next ) {
+ push @$w_fields, $field->name;
+ push @$weight, $field->weight;
+ }
+
+ return ($w_fields, $weight);
+}
+
=head3 type
=cut
use Koha::SearchEngine::Search;
use Koha::SearchEngine::QueryBuilder;
use Koha::Virtualshelves;
+use Koha::SearchFields;
use URI::Escape;
# Define some global variables
my ( $error,$query,$simple_query,$query_cgi,$query_desc,$limit,$limit_cgi,$limit_desc,$query_type);
+my ($w_fields, $weight);
+unless ( $cgi->param('advsearch') ) {
+ ($w_fields, $weight) = Koha::SearchFields->weighted_fields();
+}
+
my $builder = Koha::SearchEngine::QueryBuilder->new(
{ index => $Koha::SearchEngine::BIBLIOS_INDEX } );
my $searcher = Koha::SearchEngine::Search->new(
$query_type
)
= $builder->build_query_compat( \@operators, \@operands, \@indexes, \@limits,
- \@sort_by, $scan, $lang );
+ \@sort_by, $scan, $lang, { w_fields => @$w_fields, weight => @$weight } );
## parse the query_cgi string and put it into a form suitable for <input>s
my @query_inputs;
<form action="search.pl" method="get">
<div id="advanced-search">
+<input type="hidden" name="advsearch" value="1"/>
<h1>Advanced search</h1>
<p>
<a href="/cgi-bin/koha/catalogue/itemsearch.pl">Go to item search</a>
use Modern::Perl;
-use Test::More tests => 8;
+use Test::More tests => 16;
use Koha::Database;
use Koha::SearchFields;
$search_field = Koha::SearchFields->find($sf3->{id});
ok(!$search_field->is_mapped_biblios, 'Search field is not mapped');
+Koha::SearchFields->search({})->delete;
+
+$builder->build({
+ source => 'SearchField',
+ value => {
+ name => 'acqdate',
+ label => 'acqdate',
+ weight => undef
+ }
+});
+
+$builder->build({
+ source => 'SearchField',
+ value => {
+ name => 'copydate',
+ label => 'copydate',
+ weight => undef
+ }
+});
+
+$builder->build({
+ source => 'SearchField',
+ value => {
+ name => 'ccode',
+ label => 'ccode',
+ weight => 0
+ }
+});
+
+$builder->build({
+ source => 'SearchField',
+ value => {
+ name => 'title',
+ label => 'title',
+ weight => 25
+ }
+});
+
+$builder->build({
+ source => 'SearchField',
+ value => {
+ name => 'subject',
+ label => 'subject',
+ weight => 15
+ }
+});
+
+$builder->build({
+ source => 'SearchField',
+ value => {
+ name => 'author',
+ label => 'author',
+ weight => 5
+ }
+});
+
+my ($w_fields, $weight) = Koha::SearchFields->weighted_fields();
+is(scalar(@$w_fields), 3, 'weighted_fields should return 3 weighted fields.');
+is(scalar(@$weight), 3, 'weighted_fields should return 3 weight.');
+
+is($w_fields->[0], 'title', 'First field is title.');
+is($w_fields->[1], 'subject', 'Second field is subject.');
+is($w_fields->[2], 'author', 'Third field is author.');
+
+is($weight->[0], 25, 'Title weight is 25.');
+is($weight->[1], 15, 'Subject weight is 15.');
+is($weight->[2], 5, 'Author weight is 5.');
+
$schema->storage->txn_rollback;
\ No newline at end of file