All Downloads are FREE. Search and download functionalities are using the official Maven repository.

lux.functions.Search Maven / Gradle / Ivy

There is a newer version: 1.1.0
Show newest version
package lux.functions;

import lux.Evaluator;
import lux.SearchResultIterator;
import lux.query.parser.LuxQueryParser;
import lux.query.parser.XmlQueryParser;
import lux.solr.CloudSearchIterator;
import lux.xpath.FunCall;
import net.sf.saxon.expr.StaticProperty;
import net.sf.saxon.om.NodeInfo;
import net.sf.saxon.om.SequenceIterator;
import net.sf.saxon.om.StructuredQName;
import net.sf.saxon.pattern.NodeKindTest;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.value.SequenceType;

import org.apache.lucene.search.Query;

/**
 * function lux:search($query as item(), $sort as xs:string?, $start as xs:int?) as document-node()*
 * 

Executes a Lucene search query and returns documents. If the query argument is an element or document * node, it is parsed using the {@link XmlQueryParser}; otherwise its string value is parsed using the {@link LuxQueryParser}. * For details about the query syntaxes, see the parser documentation.

*

$sort defines sort criteria: multiple criteria are separated by commas; each criterion is a field * name (or lux:score) with optional keywords appended: ascending|descending, empty least|empty greatest. * If no sort key is provided, documents are ordered by Lucene docID, which is defined to be XQuery document order. *

*

$start indiciates the (1-based) index of the first result to return. Skipped results don't need to be loaded * in memory, so providing $start allows for more efficient processing of queries that require "deep paging". */ public class Search extends SearchBase { public Search () { } @Override public StructuredQName getFunctionQName() { return new StructuredQName("lux", FunCall.LUX_NAMESPACE, "search"); } @Override public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) { return SequenceType.makeSequenceType(NodeKindTest.DOCUMENT, StaticProperty.ALLOWS_ZERO_OR_MORE); } @Override public SequenceType[] getArgumentTypes() { return new SequenceType[] { SequenceType.SINGLE_ITEM, // query: as element node or string SequenceType.OPTIONAL_STRING, // sort key stanza SequenceType.OPTIONAL_INTEGER // start - index of first result (1-based) }; } @Override public int getMaximumNumberOfArguments() { return 4; } /** * Iterate over the search results * * @param query the Lucene query to execute * @param eval * @return an iterator with the results of executing the query and applying the * expression to its result. * @throws XPathException */ @Override public SequenceIterator iterate(final Query query, Evaluator eval, String sortCriteria, int start) throws XPathException { try { return new SearchResultIterator (eval, query, sortCriteria, start); } catch (Exception e) { throw new XPathException (e); } } /** * Execute distributed search, returning an iterator that retrieves all the search results lazily. * * @param query the query to execute, as a String * @param eval * @return an iterator with the results of executing the query and applying the expression to its result. * @throws XPathException */ @Override public SequenceIterator iterateDistributed(final String query, QueryParser queryParser, Evaluator eval, String sortCriteria, int start) throws XPathException { try { return new CloudSearchIterator (eval, query, queryParser, sortCriteria, start); } catch (Exception e) { throw new XPathException (e); } } } /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */





© 2015 - 2024 Weber Informatics LLC | Privacy Policy