@@ -, +, @@ fields --- Koha/SearchEngine/Elasticsearch/QueryBuilder.pm | 125 +++++++++++++++++---- Koha/SearchEngine/Elasticsearch/Search.pm | 10 +- admin/searchengine/elasticsearch/mappings.yaml | 96 +++++++--------- ...ical-field-names-and-resolve-aliased-fields.sql | 19 ++++ 4 files changed, 168 insertions(+), 82 deletions(-) create mode 100644 installer/data/mysql/atomicupdate/bug_19575-use-canonical-field-names-and-resolve-aliased-fields.sql --- a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm +++ a/Koha/SearchEngine/Elasticsearch/QueryBuilder.pm @@ -477,16 +477,20 @@ sub _convert_sort_fields { # Turn the sorting into something we care about. my %sort_field_convert = ( - acqdate => 'acqdate', - author => 'author', - call_number => 'callnum', + acqdate => 'Date-of-acquisition', + author => 'Author', + call_number => 'Local-classification', popularity => 'issues', relevance => undef, # default - title => 'title', - pubdate => 'pubdate', + title => 'Title', + pubdate => 'Date-of-publication', + ); + my %sort_order_convert = ( + dsc => 'desc', + asc => 'asc', + az => 'asc', + za => 'desc', ); - my %sort_order_convert = - ( qw( dsc desc ), qw( asc asc ), qw( az asc ), qw( za desc ) ); # Convert the fields and orders, drop anything we don't know about. grep { $_->{field} } map { @@ -513,20 +517,97 @@ types. =cut our %index_field_convert = ( - 'kw' => '_all', - 'ti' => 'title', - 'au' => 'author', - 'su' => 'subject', - 'nb' => 'isbn', - 'se' => 'title-series', - 'callnum' => 'callnum', - 'itype' => 'itype', - 'ln' => 'ln', - 'branch' => 'homebranch', - 'fic' => 'lf', - 'mus' => 'rtype', - 'aud' => 'ta', - 'hi' => 'Host-Item-Number', + 'kw' => '_all', + 'ab' => 'Abstract', + 'au' => 'Author', + 'lcn' => 'Local-classification', + 'callnum' => 'Local-classification', + 'ln' => 'language', + 'Record-type' => 'rtype', + 'mc-rtype' => 'rtype', + 'mus' => 'rtype', + 'ctype' => 'Content-type', + 'lc-card' => 'LC-card-number', + 'sn' => 'Local-number', + 'yr' => 'Date-of-publication', + 'pubdate' => 'Date-of-publication', + 'acqdate' => 'Date-of-acquisition', + 'Date-time-last-modified' => 'Date/time-last-modified', + 'dtlm' => 'Date/time-last-modified', + 'diss' => 'Dissertation-information', + 'ean' => 'EAN', + 'nb' => 'ISBN', + 'isbn' => 'ISBN', + 'ns' => 'ISSN', + 'issn' => 'ISSN', + 'Music-number' => 'Identifier-publisher-for-music', + 'Number-music-publisher' => 'Identifier-publisher-for-music', + 'music' => 'Identifier-publisher-for-music', + 'ident' => 'Identifier-standard', + 'name' => 'Name', + 'cpn' => 'Corporate-name', + 'cfn' => 'Conference-name', + 'pl' => 'Place-publication', + 'pn' => 'Personal-name', + 'pb' => 'Publisher', + 'pv' => 'Provider', + 'nt' => 'Note', + 'notes' => 'Note', + 'rcn' => 'Record-control-number', + 'su' => 'Subject', + 'su-to' => 'Subject', + #'su-geo' => 'Subject', + 'su-ut' => 'Subject', + 'ti' => 'Title', + 'se' => 'Title-series', + 'ut' => 'Title-uniform', + 'an' => 'Authority-Number', + 'Koha-Auth-Number' => 'Authority-Number', + 'at' => 'authtype', + 'he' => 'Heading', + 'rank' => 'relevance', + 'phr' => 'st-phrase', + 'wrdl' => 'st-word-list', + 'rt' => 'right-Truncation', + 'rtrn' => 'right-Truncation', + 'ltrn' => 'left-Truncation', + 'rltrn' => 'left-and-right', + 'mc-itemtype' => 'itemtype', + 'mc-ccode' => 'ccode', + 'branch' => 'homebranch', + 'mc-loc' => 'location', + 'stocknumber' => 'Number-local-acquisition', + 'inv' => 'Number-local-acquisition', + 'bc' => 'barcode', + 'mc-itype' => 'itype', + 'aub' => 'Author-personal-bibliography', + 'auo' => 'Author-in-order', + 'ff8-22' => 'ta', + 'aud' => 'ta', + 'audience' => 'ta', + 'Frequency-code' => 'ff8-18', + 'Illustration-code' => 'ff8-18-21', + 'Regularity-code' => 'ff8-19', + 'Type-Of-Serial' => 'ff8-21', + 'format' => 'ff8-23', + 'Conference-code' => 'ff8-29', + 'Festschrift-indicator' => 'ff8-30', + 'Index-indicator' => 'ff8-31', + 'fiction' => 'lf', + 'fic' => 'lf', + 'Literature-Code' => 'lf', + 'biography' => 'bio', + 'ff8-34' => 'bio', + 'Biography-Code' => 'bio', + 'l-format' => 'ff7-01-02', + 'lex' => 'lexile-number', + 'video-mt' => 'Video-mt', + 'Graphic-type' => 'Graphics-type', + 'Graphic-support' => 'Graphics-support', + 'item' => 'Item', + 'hi' => 'Host-Item-Number', + 'itu' => 'Index-term-uncontrolled', + 'itg' => 'Index-term-genre', ); sub _convert_index_fields { @@ -547,7 +628,7 @@ sub _convert_index_fields { $f =~ s/^mc-//; } my $r = { - field => $index_field_convert{$f}, + field => exists $index_field_convert{$f} ? $index_field_convert{$f} : $f, type => $index_type_convert{ $t // '__default' } }; $r->{field} = ($mc . $r->{field}) if $mc && $r->{field}; --- a/Koha/SearchEngine/Elasticsearch/Search.pm +++ a/Koha/SearchEngine/Elasticsearch/Search.pm @@ -425,13 +425,13 @@ sub _convert_facets { # things that zebra uses. # TODO let the library define the order using the interface. my %type_to_label = ( - author => { order => 1, label => 'Authors', }, - itype => { order => 2, label => 'ItemTypes', }, + Author => { order => 1, label => 'Authors', }, + itype => { order => 2, label => 'ItemTypes', }, location => { order => 3, label => 'Location', }, 'su-geo' => { order => 4, label => 'Places', }, - se => { order => 5, label => 'Series', }, - subject => { order => 6, label => 'Topics', }, - ccode => { order => 7, label => 'CollectionCodes',}, + 'Title-series' => { order => 5, label => 'Series', }, + Subject => { order => 6, label => 'Topics', }, + ccode => { order => 7, label => 'CollectionCodes',}, holdingbranch => { order => 8, label => 'HoldingLibrary' }, homebranch => { order => 9, label => 'HomeLibrary' } ); --- a/admin/searchengine/elasticsearch/mappings.yaml +++ a/admin/searchengine/elasticsearch/mappings.yaml @@ -577,8 +577,8 @@ biblios: sort: ~ suggestible: '' type: string - acqdate: - label: acqdate + Date-of-acquisition: + label: Date-of-acquisition mappings: - facet: '' marc_field: 952d @@ -596,8 +596,8 @@ biblios: sort: ~ suggestible: '' type: date - an: - label: an + Authority-Number: + label: Authority-Number mappings: - facet: '' marc_field: '1009' @@ -1120,8 +1120,8 @@ biblios: sort: ~ suggestible: '' type: number - author: - label: author + Author: + label: Author mappings: - facet: '1' marc_field: 100a @@ -1141,12 +1141,12 @@ biblios: - facet: 0 marc_field: 245c marc_type: marc21 - sort: 0 + sort: ~ suggestible: 0 - facet: 1 marc_field: 700a marc_type: marc21 - sort: 0 + sort: ~ suggestible: 1 - facet: '1' marc_field: 100a @@ -1166,12 +1166,12 @@ biblios: - facet: 0 marc_field: 245c marc_type: normarc - sort: 0 + sort: ~ suggestible: 0 - facet: 1 marc_field: 700a marc_type: normarc - sort: 0 + sort: ~ suggestible: 1 - facet: '1' marc_field: 200f @@ -1186,12 +1186,12 @@ biblios: - facet: 1 marc_field: 700a marc_type: unimarc - sort: 0 + sort: ~ suggestible: 1 - facet: 0 marc_field: '701' marc_type: unimarc - sort: 0 + sort: ~ suggestible: 0 type: string bgf-number: @@ -1241,20 +1241,6 @@ biblios: sort: ~ suggestible: '' type: '' - bnb-card-number: - label: bnb-card-number - mappings: - - facet: '' - marc_field: '015' - marc_type: marc21 - sort: ~ - suggestible: '' - - facet: '' - marc_field: '015' - marc_type: normarc - sort: ~ - suggestible: '' - type: '' ccode: label: collection-code mappings: @@ -1274,8 +1260,8 @@ biblios: sort: ~ suggestible: '' type: '' - control-number: - label: control-number + Control-number: + label: Control-number mappings: - facet: '' marc_field: '001' @@ -1481,8 +1467,8 @@ biblios: sort: ~ suggestible: '' type: string - identifier-standard: - label: identifier-standard + Identifier-standard: + label: Identifier-standard mappings: - facet: '' marc_field: '010' @@ -1550,8 +1536,8 @@ biblios: sort: ~ suggestible: '' type: '' - isbn: - label: isbn + ISBN: + label: ISBN mappings: - facet: '' marc_field: 020a @@ -1655,8 +1641,8 @@ biblios: sort: ~ suggestible: '' type: string - lc-cardnumber: - label: lc-cardnumber + LC-card-number: + label: LC-card-number mappings: - facet: '' marc_field: '010' @@ -1678,7 +1664,7 @@ biblios: marc_type: unimarc sort: ~ suggestible: '' - type: '' + type: '' lf: label: lf mappings: @@ -1712,8 +1698,8 @@ biblios: sort: ~ suggestible: '' type: '' - ln: - label: ln + language: + label: language mappings: - facet: '' marc_field: 008_/35-37 @@ -1731,8 +1717,8 @@ biblios: sort: ~ suggestible: '' type: '' - local-classification: - label: local-classification + Local-classification: + label: Local-classification mappings: - facet: '' marc_field: 952o @@ -1877,8 +1863,8 @@ biblios: sort: ~ suggestible: '' type: boolean - pl: - label: pl + Place-publication: + label: Place-publication mappings: - facet: '' marc_field: 008_/15-17 @@ -1891,8 +1877,8 @@ biblios: sort: ~ suggestible: '' type: '' - place: - label: place + Place-of-publication: + label: Place-of-publication mappings: - facet: '1' marc_field: 260a @@ -1910,8 +1896,8 @@ biblios: sort: ~ suggestible: '' type: string - pubdate: - label: pubdate + Date-of-publication: + label: Date-of-publication mappings: - facet: '' marc_field: 008_/7-10 @@ -1929,8 +1915,8 @@ biblios: sort: ~ suggestible: '' type: '' - publisher: - label: publisher + Publisher: + label: Publisher mappings: - facet: '1' marc_field: 260b @@ -1948,8 +1934,8 @@ biblios: sort: ~ suggestible: '' type: string - record-source: - label: record-source + Record-source: + label: Record-source mappings: - facet: '' marc_field: 008_/39 @@ -1976,8 +1962,8 @@ biblios: sort: ~ suggestible: '' type: '' - se: - label: se + Title-series: + label: Title-series mappings: - facet: '1' marc_field: 440a @@ -2024,8 +2010,8 @@ biblios: sort: ~ suggestible: '' type: string - subject: - label: subject + Subject: + label: Subject mappings: - facet: '1' marc_field: 600a @@ -2286,8 +2272,8 @@ biblios: sort: ~ suggestible: '' type: '' - title: - label: title + Title: + label: Title mappings: - facet: '' marc_field: '130' --- a/installer/data/mysql/atomicupdate/bug_19575-use-canonical-field-names-and-resolve-aliased-fields.sql +++ a/installer/data/mysql/atomicupdate/bug_19575-use-canonical-field-names-and-resolve-aliased-fields.sql @@ -0,0 +1,19 @@ +UPDATE `search_field` SET `name` = 'Date-of-publication', `label` = 'Date-of-publication' WHERE `name` = 'pubdate'; +UPDATE `search_field` SET `name` = 'Title-series', `label` = 'Title-series' WHERE `name` = 'se'; +UPDATE `search_field` SET `name` = 'Identifier-standard', `label` = 'Identifier-standard' WHERE `name` = 'identifier-standard'; +UPDATE `search_field` SET `name` = 'Author', `label` = 'Author' WHERE `name` = 'author'; +UPDATE `search_field` SET `name` = 'Control-number', `label` = 'Control-number' WHERE `name` = 'control-number'; +UPDATE `search_field` SET `name` = 'Place-publication', `label` = 'Place-publication' WHERE `name` = 'pl'; +UPDATE `search_field` SET `name` = 'Place-of-publication', `label` = 'Place-of-publication' WHERE `name` = 'place'; +UPDATE `search_field` SET `name` = 'Date-of-acquisition', `label` = 'Date-of-acquisition' WHERE `name` = 'acqdate'; +UPDATE `search_field` SET `name` = 'ISBN', `label` = 'ISBN' WHERE `name` = 'isbn'; +UPDATE `search_field` SET `name` = 'BNB-card-number', `label` = 'BNB-card-number' WHERE `name` = 'bnb-card-number'; +UPDATE `search_field` SET `name` = 'Authority-Number', `label` = 'Authority-Number' WHERE `name` = 'an'; +UPDATE `search_field` SET `name` = 'language', `label` = 'language' WHERE `name` = 'ln'; +UPDATE `search_field` SET `name` = 'Subject', `label` = 'Subject' WHERE `name` = 'subject'; +UPDATE `search_field` SET `name` = 'Publisher', `label` = 'Publisher' WHERE `name` = 'publisher'; +UPDATE `search_field` SET `name` = 'Record-source', `label` = 'Record-source' WHERE `name` = 'record-source'; +UPDATE `search_field` SET `name` = 'Title', `label` = 'Title' WHERE `name` = 'title'; +UPDATE `search_field` SET `name` = 'Local-classification', `label` = 'Local-classification' WHERE `name` = 'local-classification'; +DELETE FROM `search_field` WHERE `name` = 'bnb-card-number'; +DELETE FROM `search_field` WHERE `name` = 'lc-cardnumber'; --