From 59918a3c2146a0e558125e246d0ac1b300189cf8 Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Wed, 5 Jul 2017 12:11:35 +0000 Subject: [PATCH] Bug 18213: Add language facets to Elasticsearch This patch add language as a facet to ES results - it adds a new template plugin for languages to get the appropriate description given an iso 639-2 code To test: 1 - Make sure you have records with differing languages (in the MARC21 008 field characters 35-37 or UNIMARC 101a) 2 - Apply patch 3 - Reload Elasticsearch settings: http://localhost:8081/cgi-bin/koha/admin/searchengine/elasticsearch/mappings.pl?op=reset&i_know_what_i_am_doing=1 4 - Reindex your records 5 - Search for a phrase that will return results in several languages 6 - Verify you see factes correctly labelled for 'Language' 7 - Verify the facets work 8 - Verify both opac and staff results 9 - prove t/db_dependent/Languages.t Signed-off-by: Nicolas Legrand Signed-off-by: Alex Arnaud Signed-off-by: Josef Moravec Signed-off-by: Nick Clemens --- C4/Languages.pm | 14 ++++++++++++++ Koha/SearchEngine/Elasticsearch.pm | 2 +- Koha/SearchEngine/Elasticsearch/QueryBuilder.pm | 13 +++++++------ Koha/SearchEngine/Elasticsearch/Search.pm | 1 + admin/searchengine/elasticsearch/mappings.yaml | 7 ++++--- .../intranet-tmpl/prog/en/includes/facets.inc | 3 +++ .../admin/searchengine/elasticsearch/mappings.tt | 1 + .../bootstrap/en/includes/opac-facets.inc | 3 +++ t/db_dependent/Languages.t | 8 +++++++- 9 files changed, 41 insertions(+), 11 deletions(-) diff --git a/C4/Languages.pm b/C4/Languages.pm index 1958c91628..b06e30310e 100644 --- a/C4/Languages.pm +++ b/C4/Languages.pm @@ -622,6 +622,20 @@ sub getlanguage { return $language; } +=head2 get_rfc4646_from_iso639 + + Select a language rfc4646 code given an iso639 code + +=cut + +sub get_rfc4646_from_iso639 { + + my $iso_code = shift; + my $rfc_subtag = Koha::Database->new()->schema->resultset('LanguageRfc4646ToIso639')->find({iso639_2_code=>$iso_code})->rfc4646_subtag; + return $rfc_subtag; + +} + 1; __END__ diff --git a/Koha/SearchEngine/Elasticsearch.pm b/Koha/SearchEngine/Elasticsearch.pm index bb730d290c..3855ce4df5 100644 --- a/Koha/SearchEngine/Elasticsearch.pm +++ b/Koha/SearchEngine/Elasticsearch.pm @@ -990,7 +990,7 @@ sub get_facetable_fields { # These should correspond to the ES field names, as opposed to the CCL # things that zebra uses. - my @search_field_names = qw( author itype location su-geo title-series subject ccode holdingbranch homebranch ); + my @search_field_names = qw( author itype location su-geo title-series subject ccode holdingbranch homebranch ln ); my @faceted_fields = Koha::SearchFields->search( { name => { -in => \@search_field_names }, facet_order => { '!=' => undef } }, { order_by => ['facet_order'] } ); diff --git a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm index 252416cbf8..90331481f2 100644 --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ b/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -111,13 +111,14 @@ sub build_query { # See _convert_facets in Search.pm for how these get turned into # things that Koha can use. $res->{aggregations} = { - author => { terms => { field => "author__facet" } }, - subject => { terms => { field => "subject__facet" } }, - itype => { terms => { field => "itype__facet" } }, - location => { terms => { field => "location__facet" } }, - 'su-geo' => { terms => { field => "su-geo__facet" } }, + author => { terms => { field => "author__facet" } }, + subject => { terms => { field => "subject__facet" } }, + itype => { terms => { field => "itype__facet" } }, + location => { terms => { field => "location__facet" } }, + 'su-geo' => { terms => { field => "su-geo__facet" } }, 'title-series' => { terms => { field => "title-series__facet" } }, - ccode => { terms => { field => "ccode__facet" } }, + ccode => { terms => { field => "ccode__facet" } }, + ln => { terms => { field => "ln__facet" } }, }; my $display_library_facets = C4::Context->preference('DisplayLibraryFacets'); diff --git a/Koha/SearchEngine/Elasticsearch/Search.pm b/Koha/SearchEngine/Elasticsearch/Search.pm index f30c13947e..d8b8469f6e 100644 --- a/Koha/SearchEngine/Elasticsearch/Search.pm +++ b/Koha/SearchEngine/Elasticsearch/Search.pm @@ -447,6 +447,7 @@ sub _convert_facets { ccode => 'CollectionCodes', holdingbranch => 'HoldingLibrary', homebranch => 'HomeLibrary', + ln => 'Language', ); my @facetable_fields = Koha::SearchEngine::Elasticsearch->get_facetable_fields; diff --git a/admin/searchengine/elasticsearch/mappings.yaml b/admin/searchengine/elasticsearch/mappings.yaml index feccc94073..8ead46bd59 100644 --- a/admin/searchengine/elasticsearch/mappings.yaml +++ b/admin/searchengine/elasticsearch/mappings.yaml @@ -2599,22 +2599,23 @@ biblios: ln: label: ln mappings: - - facet: '' + - facet: '1' marc_field: '008_/35-37' marc_type: marc21 sort: ~ suggestible: '' - - facet: '' + - facet: '1' marc_field: '008_/35-37' marc_type: normarc sort: ~ suggestible: '' - - facet: '' + - facet: '1' marc_field: 101a marc_type: unimarc sort: ~ suggestible: '' type: '' + facet_order: 10 ln-audio: label: ln-audio mappings: diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/facets.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/facets.inc index 4d0e3c4781..ea7a46dbea 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/facets.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/facets.inc @@ -1,5 +1,6 @@ [% USE raw %] [% USE AuthorisedValues %] +[% USE Languages %] [% IF ( opacfacets ) %] [% IF ( facets_loop ) %]
@@ -23,6 +24,7 @@ [% IF ( facets_loo.type_label_HoldingLibrary ) %]Holding libraries[% END %] [% IF facets_loo.type_label_Location %]Locations[% END %] [% IF facets_loo.type_label_CollectionCodes %]Collections[% END %] +[% IF facets_loo.type_label_Language %]Languages[% END %]
    [% SET url = "/cgi-bin/koha/catalogue/search.pl?" _ query_cgi _ limit_cgi %] [% IF ( sort_by ) %] @@ -30,6 +32,7 @@ [% END %] [% FOREACH facet IN facets_loo.facets %] [% IF facets_loo.type_label_CollectionCodes %][% SET facet.facet_label_value = AuthorisedValues.GetByCode('CCODE',facet.facet_label_value,0) || facet.facet_label_value %][% END %] + [% IF facets_loo.type_label_Language %][% SET facet.facet_label_value = Languages.GetByISOCode(lang,facet.facet_label_value) || facet.facet_label_value %][% END %]
  • [% IF facet.active %] [% local_url = BLOCK %][% url | $raw %][% "&nolimit=" _ facet.type_link_value _ ":" _ facet.facet_link_value | url %][% END %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/searchengine/elasticsearch/mappings.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/searchengine/elasticsearch/mappings.tt index 2305823e97..33df1fbd8a 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/searchengine/elasticsearch/mappings.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/searchengine/elasticsearch/mappings.tt @@ -369,6 +369,7 @@ a.add, a.delete { [% CASE 'ccode' %]Collections [% CASE 'holdingbranch' %]Holding libraries [% CASE 'homebranch' %]Home libraries + [% CASE 'ln' %]Language [% CASE %][% f | html %] [% END %] diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-facets.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-facets.inc index c840b2ddaf..10ce6968aa 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-facets.inc +++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-facets.inc @@ -1,5 +1,6 @@ [% USE raw %] [% USE AuthorisedValues %] +[% USE Languages %] [% IF ( opacfacets && facets_loop && total ) %]

    Refine your search

    @@ -27,6 +28,7 @@ [% IF facets_loo.type_label_Series %]
    Series
    [% END %] [% IF facets_loo.type_label_ItemTypes %]
    Item types
    [% END %] [% IF facets_loo.type_label_CollectionCodes %]
    Collections
    [% END %] + [% IF facets_loo.type_label_Language %]
    Languages
    [% END %] [% UNLESS singleBranchMode %] [% IF ( facets_loo.type_label_HomeLibrary ) %]
    Home libraries
    [% END %] [% IF ( facets_loo.type_label_HoldingLibrary ) %]
    Holding libraries
    [% END %] @@ -39,6 +41,7 @@ [% END %] [% FOREACH facet IN facets_loo.facets %] [% IF facets_loo.type_label_CollectionCodes %][% SET facet.facet_label_value = AuthorisedValues.GetByCode('CCODE',facet.facet_label_value,1) || facet.facet_label_value %][% END %] + [% IF facets_loo.type_label_Language %][% SET facet.facet_label_value = Languages.GetByISOCode(lang,facet.facet_label_value) || facet.facet_label_value %][% END %]
  • [% IF facet.active %] [% local_url = BLOCK %][% url | $raw %][% "&nolimit=" _ facet.type_link_value _ ":" _ facet.facet_link_value | url %][% END %] diff --git a/t/db_dependent/Languages.t b/t/db_dependent/Languages.t index 5afdd8064b..120f1d5a02 100755 --- a/t/db_dependent/Languages.t +++ b/t/db_dependent/Languages.t @@ -5,7 +5,7 @@ use Modern::Perl; -use Test::More tests => 17; +use Test::More tests => 18; use List::Util qw(first); use Data::Dumper; use Test::Warn; @@ -94,3 +94,9 @@ $sth->execute(); my $LangRfc4646 = $sth->fetchall_arrayref({}); is(scalar(@$LangRfc4646),scalar(@$DistinctLangRfc4646),"No unexpected language_rfc4646_to_iso639 duplicates."); + +my $i = 0; +foreach my $pair (@$DistinctLangRfc4646){ + $i++ if $pair->{rfc4646_subtag} eq C4::Languages::get_rfc4646_from_iso639( $pair->{iso639_2_code} ); +} +is($i,scalar(@$DistinctLangRfc4646),"get_rfc4646_from_iso639 returns correct rfc for all iso values."); -- 2.39.5