Lines 293-299
sub build_query_compat {
Link Here
|
293 |
while ( my ( $oand, $otor, $index ) = $ea->() ) { |
293 |
while ( my ( $oand, $otor, $index ) = $ea->() ) { |
294 |
next if ( !defined($oand) || $oand eq '' ); |
294 |
next if ( !defined($oand) || $oand eq '' ); |
295 |
$oand = $self->clean_search_term($oand); |
295 |
$oand = $self->clean_search_term($oand); |
296 |
$oand = $self->_truncate_terms($oand) if ($truncate); |
296 |
$oand = $self->_truncate_terms($oand) if $truncate && $self->_is_safe_to_auto_truncate($index->{field}, $oand); |
297 |
push @search_params, { |
297 |
push @search_params, { |
298 |
operand => $oand, # the search terms |
298 |
operand => $oand, # the search terms |
299 |
operator => defined($otor) ? uc $otor : undef, # AND and so on |
299 |
operator => defined($otor) ? uc $otor : undef, # AND and so on |
Lines 1305-1308
sub _search_fields {
Link Here
|
1305 |
} |
1305 |
} |
1306 |
} |
1306 |
} |
1307 |
|
1307 |
|
|
|
1308 |
=pod |
1309 |
|
1310 |
=head2 _is_safe_to_auto_truncate |
1311 |
|
1312 |
_is_safe_to_auto_truncate($index_field, $oand); |
1313 |
|
1314 |
Checks if it is safe to auto truncate a search term within a given search field. |
1315 |
|
1316 |
The search term should not be auto truncated when searching for identifiers, e.g. |
1317 |
koha-auth-number, record-control-number, local-number etc. Also, non-text fields |
1318 |
must not be auto truncated (doing so would generate ES exception). |
1319 |
|
1320 |
=cut |
1321 |
|
1322 |
sub _is_safe_to_auto_truncate { |
1323 |
my ($self, $index_field, $oand) = @_; |
1324 |
# Do not auto truncate fields that should not be auto truncated, |
1325 |
# primarily various types of identifiers, above all record identifiers. |
1326 |
# Alternatively this could be moved to the ElasticSearch search fields |
1327 |
# configuration page. |
1328 |
my @do_not_truncate = qw / barcode biblioitemnumber control-number control-number-identifier date-of-acquisition date-of-publication date-time-last-modified host-item-number identifier-standard isbn issn itemnumber itype koha-auth-number lc-card-number local-number number-local-acquisition other-control-number record-control-number /; |
1329 |
# In addition, under no circumstances should non-text fields |
1330 |
# be auto truncated. |
1331 |
my $cache = Koha::Caches->get_instance(); |
1332 |
my $cache_key = 'elasticsearch_search_non_text_fields'; |
1333 |
my $non_text_search_fields = $cache->get_from_cache($cache_key, { unsafe => 1 }); |
1334 |
if (!$non_text_search_fields) { |
1335 |
my $schema = Koha::Database->new()->schema(); |
1336 |
my $sfs = $schema->resultset('SearchField')->search({ '-not' => { '-or' => [ {type => ''}, {type => 'string'} ] } }); |
1337 |
while (my $sf = $sfs->next) { |
1338 |
push @$non_text_search_fields, $sf->name; |
1339 |
} |
1340 |
$cache->set_in_cache($cache_key, $non_text_search_fields); |
1341 |
} |
1342 |
push @do_not_truncate, @$non_text_search_fields if $non_text_search_fields; |
1343 |
|
1344 |
# search fields can be given as a explicit index name (e.g. from advanced |
1345 |
# search): |
1346 |
if ($index_field) { |
1347 |
return 0 if grep { $index_field eq $_ } @do_not_truncate; |
1348 |
# OR can be given implicite, as prefix in the operand (e.g. in links generated |
1349 |
# by Koha like catalogue/search.pl?q=an:<authid>): |
1350 |
} elsif ($oand =~ /\b($field_name_pattern):/) { # check field name prefixing operand |
1351 |
my $field_name = $1; |
1352 |
return 0 if grep { $field_name eq $_ } @do_not_truncate; |
1353 |
} |
1354 |
# It safe to auto truncate: |
1355 |
return 1; |
1356 |
} |
1357 |
|
1308 |
1; |
1358 |
1; |
1309 |
- |
|
|