NAME Interchange::Search::Solr -- Solr query encapsulation VERSION Version 0.13 DESCRIPTION Exposes Solr search API in a programmer-friendly way. SYNOPSIS Quick summary of what the module does. Perhaps a little code snippet. use Interchange::Search::Solr; my $solr = Interchange::Search::Solr->new(solr_url => $url); $solr->rows(10); $solr->start(0); $solr->search('shirts'); $results = $solr->results; ACCESSORS solr_url Url of the solr instance. Read-only. input_encoding [DEPRECATED] Assume the urls to be in this encoding, so decode it before parsing it. This is basically a (probably bugged) workaround when you have all the shop in latin1. If the search keep crashing on non-ascii characters, try to set this to iso-8859-1. rows Number of results to return. Read-write (so you can reuse the object). page_scope The number of paging items for the paginator search_fields An arrayref with the indexed fields to search. Defaults to: [qw/sku name description/] You can add boost to fields appending a float with a caret. [qw/ sku^5.0 name^1.0 description^0.4 /] return_fields An arrayref of indexed fields to return. All by default. facets A string or an arrayref with the fields which will generate a facet. Defaults to [qw/suchbegriffe manufacturer/] start Start of pagination. Read-write. page Current page. Read-write. filters An hashref with the filters. E.g. { suchbegriffe => [qw/xxxxx yyyy/], manufacturer => [qw/pikeur/], } The keys of the hashref, to have any effect, must be one of the facets. response Read-only accessor to the response object of the current search. facets_found After a search, the structure with the facets can be retrieved with this accessor, with this structure: { field => [ { name => "name", count => 11 }, { name => "name", count => 9 }, ... ], field2 => [ { name => "name", count => 7 }, { name => "name", count => 6 }, ... ], ... } Each hashref in each field's arrayref has the following keys: name The name to display count The count of item query_url The url fragment to toggle this filter. active True if currently in use (to be used for, e.g., checkboxes) search_string Debug only. The search string produced by the query. search_terms The terms used for the current search. search_structure The perl data structure used for the current search. It's passed to Webservice::Solr::Query for stringification. sorting The field used to sort the result (optional and defaults to score, as per Solr doc). You can set it to a scalar with a field name or instead you can use the SQL::Abstract syntax (all the cases documented there are supported). E.g. $solr->sorting([{ -asc => 'created_date' }, {-desc => [qw/updated_date sku/] }]); If you pass a reference, the sorting_direction setting is ignored. sorting_direction The direction used by the sorting, when sorting is specified and is a plain scalar. Default to 'desc'. wild_matching By default, a search term produce a query with a wildcard appended. So searching for 1234 will query 1234*. With this option set to true, a wildcard is prepended as well, querying for *1234* instead). stop_words_langs The languages for which we should build the stop word list. It defaults to: [ 'en' ] New in 0.10. To revert to the old behaviour (no filtering of stopwords), pass an empty arrayref. min_chars Minimum characters for filtering the search terms. Default to 3. New in 0.10. To revert to the old behaviour, set it to 0. permit_empty_search By default, empty searches are not executed. You can permit them setting this accessor to 1. The module will reset it to 0 when the search is executed. INTERNAL ACCESSORS solr_object The WebService::Solr instance. builder_object(\@terms, \%filters, $page) Creates Interchange::Search::Solr::Builder instance. METHODS search( [ $string_or$structure ] ]) Run a search and return a WebService::Solr::Response object. The method accept zero or one argument. With no arguments, run a full wildcard search. With one argument, if it's a string, run the search against all the indexed fields. If it's a structure, build a query for it. The syntax of the structure is described at WebService::Solr::Query. After calling this method you can inspect the response using the following methods: results Returns reference to list of results, each result is a hash reference. skus_found Returns just a plain list of skus. num_found Return the number of items found has_more Return true if there are more pages execute_query($query) Accept either a raw string with the query or a WebService::Solr::Query object and run the query against the Solr service. If no query is provided, a wildcard search is performed. construct_params Constructs parameters for the search. maintainer_update($mode) Perform a maintainer update and return a WebService::Solr::Response object. reset_object Reset the leftovers of a possible previous search. search_from_url($url) Parse the url provided and do the search. add_terms_to_url($url, $string) Parse the url, and return a new one with the additional words added. The page is discarded, while the filters are retained. current_search_to_url Return the url for the current search. paginator Return an hashref suitable to be turned into a paginator, undef if there is no need for a paginator. Be careful that a defined empty string in the first/last/next/previous keys is perfectly legit and points to an unfiltered search which will return all the items, so concatenating it to the prefix is perfectly fine (e.g. "products/" . ''). When rendering this structure to HTML, just check if the value is defined, not if it's true. The structure looks like this: { first => 'words/bla' || undef, first_page => 1 || undef, last => 'words/bla/page/5' || undef, last_page => 5 || undef, next => 'words/bla/page/5' || undef, next_page => 5 || undef previous => 'words/bla/page/3' || undef, previous_page => 3 || undef, pages => [ { name => 1, url => 'words/bla/page/1', }, { name => 2, url => 'words/bla/page/2', }, { name => 3, url => 'words/bla/page/3', }, { name => 4, url => 'words/bla/page/4', current => 1, }, { name => 5, url => 'words/bla/page/5', }, ] total_pages => 5 } terms_found Returns an hashref suitable to build a widget with the terms used and the links to toggle them. Return undef if no terms were used in the search. The structure looks like this: { reset => '', terms => [ { term => 'first', url => 'words/second' }, { term => 'second', url => 'words/first' }, ], } See also: clear_words_link Which return the reset link remove_word_links Which returns a list of hashrefs with uri and label for each word to remove. version Return the version of this module. breadcrumbs Return a list of hashrefs with uri and label suitable to compose a breadcrumb for the current search. If the breadcrumb points to a facet, the facet name is stored in the facet key. AUTHOR Marco Pessotto, <melmothx at gmail.com> BUGS Please report any bugs or feature requests to https://github.com/interchange/Interchange-Search-Solr/issues. SUPPORT You can find documentation for this module with the perldoc command. perldoc Interchange::Search::Solr You can also look for information at: * Github https://github.com/interchange/Interchange-Search-Solr * AnnoCPAN: Annotated CPAN documentation http://annocpan.org/dist/Interchange-Search-Solr * CPAN Ratings http://cpanratings.perl.org/d/Interchange-Search-Solr * META CPAN https://metacpan.org/pod/Interchange::Search::Solr ACKNOWLEDGEMENTS Mohammad S Anwar (GH #14). LICENSE AND COPYRIGHT Copyright 2014-2016 Marco Pessotto. This program is free software; you can redistribute it and/or modify it under the terms of the the Artistic License (2.0). You may obtain a copy of the full license at: http://www.perlfoundation.org/artistic_license_2_0 Any use, modification, and distribution of the Standard or Modified Versions is governed by this Artistic License. By using, modifying or distributing the Package, you accept this license. Do not use, modify, or distribute the Package, if you do not accept this license. If your Modified Version has been derived from a Modified Version made by someone other than you, you are nevertheless required to ensure that your Modified Version complies with the requirements of this license. This license does not grant you the right to use any trademark, service mark, tradename, or logo of the Copyright Holder. This license includes the non-exclusive, worldwide, free-of-charge patent license to make, have made, use, offer to sell, sell, import and otherwise transfer the Package with respect to any patent claims licensable by the Copyright Holder that are necessarily infringed by the Package. If you institute patent litigation (including a cross-claim or counterclaim) against any party alleging that the Package constitutes direct or contributory patent infringement, then this Artistic License to you shall terminate on the date that such litigation is filed. Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.