From 37970eead1d265b6123f370afd87ac189d4e5e51 Mon Sep 17 00:00:00 2001 From: Eivin Giske Skaaren Date: Mon, 6 Jul 2015 21:46:49 +0000 Subject: [PATCH] Bug 14457: Integrate LIBRIS spellchecking MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This patch makes it possible to configure LIBRIS spellchecker as a "did you mean" feature. When searching for a word or phrase and misspelling the query will be sent to LIBRIS and if they have a suggestion it will be shown in the yellow did you mean box in the results page. The API is not very quick so this type of implementation was chosen to not disrupt the real-time feeling of the search. To test: 1. Apply the patch. 2. Go to http://api.libris.kb.se/bibspell/, enter the koha servers IP and click on the "Generera nyckel" button. 3. Under "Nyckel" you can copy the value that looks like this: E47B44829E265607274B677BC17B8D78, and enter it into the LibrisKey syspref (cgi-bin/koha/admin/preferences.pl?tab=searching). 4. In cgi-bin/koha/admin/didyoumean.pl check the box for using the LIBRIS API. It is only implemented for OPAC. 5. Perform some searches: tset - Did you mean should suggest: test jeg är på smester - suggestion: jag är på semester dantes inferna - suggestion: dantes inferno Restored opac-search.pl Signed-off-by: Chris Cormack Seems to work, of course I can't tell if it is giving me accurate suggestions :) Signed-off-by: Katrin Fischer Signed-off-by: Nick Clemens --- .../Plugin/LibrisSpellcheck.pm | 90 +++++++++++++++++++ .../bug_14557_add_libriskey_syspref.sql | 1 + .../prog/en/modules/admin/didyoumean.tt | 4 +- .../modules/admin/preferences/searching.pref | 5 ++ 4 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 Koha/SuggestionEngine/Plugin/LibrisSpellcheck.pm create mode 100644 installer/data/mysql/atomicupdate/bug_14557_add_libriskey_syspref.sql diff --git a/Koha/SuggestionEngine/Plugin/LibrisSpellcheck.pm b/Koha/SuggestionEngine/Plugin/LibrisSpellcheck.pm new file mode 100644 index 0000000000..5d0b7f0fcd --- /dev/null +++ b/Koha/SuggestionEngine/Plugin/LibrisSpellcheck.pm @@ -0,0 +1,90 @@ +package Koha::SuggestionEngine::Plugin::LibrisSpellcheck; +# Copyright (C) 2015 Eivin Giske Skaaren +# +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; +use LWP::UserAgent; +use XML::Simple qw(XMLin); +use C4::Context; +use base qw(Koha::SuggestionEngine::Base); + +sub NAME { + return 'LibrisSpellcheck'; +} + +sub get_suggestions { + my ($self, $query) = @_; + my $key = C4::Context->preference('LibrisKey'); + + my $search = $query->{'search'}; + my $response = LWP::UserAgent->new->get("http://api.libris.kb.se/bibspell/spell?query={$search}&key=$key"); + my $xml = XMLin($response->content, NoAttr => 1, ForceArray => qr/term/); + + my @terms; + my $label; + + if ($xml->{suggestion}->{term}) { + for (@{$xml->{suggestion}->{term}}) { + push @terms, $_; + } + $label = join(' ', @terms); + } else { + return; # No result from LIBRIS + } + + my @results; + push @results, + { + 'search' => $label, #$thissearch, + relevance => 100, + # FIXME: it'd be nice to have some empirical measure of + # "relevance" in this case, but we don't. + label => $label + }; + return \@results; +} + +1; +__END__ + +=head1 NAME + +Koha::SuggestionEngine::Plugin::LibrisSpellcheck + +=head2 FUNCTIONS + +This module provides facilities for using the LIBRIS spell checker API + +=over + +=item get_suggestions(query) + +Sends in the search query and gets an XML with a suggestion + +=back + +=cut + +=head1 NOTES + +=cut + +=head1 AUTHOR + +Eivin Giske Skaaren + +=cut diff --git a/installer/data/mysql/atomicupdate/bug_14557_add_libriskey_syspref.sql b/installer/data/mysql/atomicupdate/bug_14557_add_libriskey_syspref.sql new file mode 100644 index 0000000000..4f36288e62 --- /dev/null +++ b/installer/data/mysql/atomicupdate/bug_14557_add_libriskey_syspref.sql @@ -0,0 +1 @@ +INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES ('LibrisKey', '', 'This key must be obtained at http://api.libris.kb.se/. It is unique for the IP of the server.', NULL, 'Free'); diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/didyoumean.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/didyoumean.tt index 31851efb9a..32855eb4dd 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/didyoumean.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/didyoumean.tt @@ -15,7 +15,9 @@ [% CASE 'ExplodedTerms' %] Suggest that patrons expand their searches to include broader/narrower/related terms. - [% END %] + [% CASE 'LibrisSpellcheck' %] + Use the LIBRIS spellcheck API. + [% END %] [% END %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref index 8d8e17426d..c5a5102f3a 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref @@ -243,3 +243,8 @@ Searching: yes: "search" no: "don't search" - on all variations of the ISBN. Note that this preference has no effect if UseQueryParser is on. + API Keys: + - + - LIBRIS Spellcheking API key + - pref: LibrisKey + - "Can be obtained at http://api.libris.kb.se/bibspell." -- 2.39.5