X-Git-Url: https://git.mdrn.pl/pylucene.git/blobdiff_plain/a2e61f0c04805cfcb8706176758d1283c7e3a55c..aaeed5504b982cf3545252ab528713250aa33eed:/lucene-java-3.5.0/lucene/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/StandardQueryParser.java diff --git a/lucene-java-3.5.0/lucene/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/StandardQueryParser.java b/lucene-java-3.5.0/lucene/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/StandardQueryParser.java new file mode 100644 index 0000000..d0d1789 --- /dev/null +++ b/lucene-java-3.5.0/lucene/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/StandardQueryParser.java @@ -0,0 +1,654 @@ +package org.apache.lucene.queryParser.standard; + +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.text.Collator; +import java.util.Locale; +import java.util.Map; +import java.util.TooManyListenersException; + +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.document.DateTools.Resolution; +import org.apache.lucene.document.DateTools; +import org.apache.lucene.queryParser.core.QueryNodeException; +import org.apache.lucene.queryParser.core.QueryParserHelper; +import org.apache.lucene.queryParser.core.config.QueryConfigHandler; +import org.apache.lucene.queryParser.standard.builders.StandardQueryTreeBuilder; +import org.apache.lucene.queryParser.standard.config.AllowLeadingWildcardAttribute; +import org.apache.lucene.queryParser.standard.config.AnalyzerAttribute; +import org.apache.lucene.queryParser.standard.config.DateResolutionAttribute; +import org.apache.lucene.queryParser.standard.config.DefaultOperatorAttribute; +import org.apache.lucene.queryParser.standard.config.DefaultPhraseSlopAttribute; +import org.apache.lucene.queryParser.standard.config.FieldBoostMapAttribute; +import org.apache.lucene.queryParser.standard.config.FieldDateResolutionMapAttribute; +import org.apache.lucene.queryParser.standard.config.FuzzyAttribute; +import org.apache.lucene.queryParser.standard.config.FuzzyConfig; +import org.apache.lucene.queryParser.standard.config.LocaleAttribute; +import org.apache.lucene.queryParser.standard.config.LowercaseExpandedTermsAttribute; +import org.apache.lucene.queryParser.standard.config.MultiFieldAttribute; +import org.apache.lucene.queryParser.standard.config.MultiTermRewriteMethodAttribute; +import org.apache.lucene.queryParser.standard.config.NumericConfig; +import org.apache.lucene.queryParser.standard.config.PositionIncrementsAttribute; +import org.apache.lucene.queryParser.standard.config.RangeCollatorAttribute; +import org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler; +import org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler.Operator; +import org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler.ConfigurationKeys; +import org.apache.lucene.queryParser.standard.nodes.RangeQueryNode; +import org.apache.lucene.queryParser.standard.parser.StandardSyntaxParser; +import org.apache.lucene.queryParser.standard.processors.StandardQueryNodeProcessorPipeline; +import org.apache.lucene.search.FuzzyQuery; +import org.apache.lucene.search.MultiTermQuery; +import org.apache.lucene.search.Query; + +/** + *

+ * This class is a helper that enables users to easily use the Lucene query + * parser. + *

+ *

+ * To construct a Query object from a query string, use the + * {@link #parse(String, String)} method: + *

+ *

+ * To change any configuration before parsing the query string do, for example: + *

+ *

+ *

+ * The syntax for query strings is as follows (copied from the old QueryParser + * javadoc): + *

+ *

+ * The text parser used by this helper is a {@link StandardSyntaxParser}. + *

+ *

+ * The query node processor used by this helper is a + * {@link StandardQueryNodeProcessorPipeline}. + *

+ *

+ * The builder used by this helper is a {@link StandardQueryTreeBuilder}. + *

+ * + * @see StandardQueryParser + * @see StandardQueryConfigHandler + * @see StandardSyntaxParser + * @see StandardQueryNodeProcessorPipeline + * @see StandardQueryTreeBuilder + */ +public class StandardQueryParser extends QueryParserHelper { + + /** + * Constructs a {@link StandardQueryParser} object. + */ + public StandardQueryParser() { + super(new StandardQueryConfigHandler(), new StandardSyntaxParser(), + new StandardQueryNodeProcessorPipeline(null), + new StandardQueryTreeBuilder()); + } + + /** + * Constructs a {@link StandardQueryParser} object and sets an + * {@link Analyzer} to it. The same as: + * + *

+ * + * @param analyzer the analyzer to be used by this query parser helper + */ + public StandardQueryParser(Analyzer analyzer) { + this(); + + this.setAnalyzer(analyzer); + } + + @Override + public String toString() { + return ""; + } + + /** + * Overrides {@link QueryParserHelper#parse(String, String)} so it casts the + * return object to {@link Query}. For more reference about this method, check + * {@link QueryParserHelper#parse(String, String)}. + * + * @param query the query string + * @param defaultField the default field used by the text parser + * + * @return the object built from the query + * + * @throws QueryNodeException if something wrong happens along the three + * phases + */ + @Override + public Query parse(String query, String defaultField) + throws QueryNodeException { + + return (Query) super.parse(query, defaultField); + + } + + /** + * Gets implicit operator setting, which will be either {@link Operator#AND} + * or {@link Operator#OR}. + */ + public StandardQueryConfigHandler.Operator getDefaultOperator() { + return getQueryConfigHandler().get(ConfigurationKeys.DEFAULT_OPERATOR); + } + + /** + * Sets the collator used to determine index term inclusion in ranges for + * RangeQuerys. + *

+ * WARNING: Setting the rangeCollator to a non-null collator + * using this method will cause every single index Term in the Field + * referenced by lowerTerm and/or upperTerm to be examined. Depending on the + * number of index Terms in this Field, the operation could be very slow. + * + * @param collator the collator to use when constructing + * {@link RangeQueryNode}s + */ + public void setRangeCollator(Collator collator) { + RangeCollatorAttribute attr = getQueryConfigHandler().getAttribute( + RangeCollatorAttribute.class); + attr.setDateResolution(collator); + + // uncomment code below when deprecated query parser attributes are removed + // getQueryConfigHandler().set(ConfigurationKeys.RANGE_COLLATOR, collator); + } + + /** + * @return the collator used to determine index term inclusion in ranges for + * RangeQuerys. + */ + public Collator getRangeCollator() { + return getQueryConfigHandler().get(ConfigurationKeys.RANGE_COLLATOR); + } + + /** + * Sets the boolean operator of the QueryParser. In default mode ( + * {@link Operator#OR}) terms without any modifiers are considered optional: + * for example capital of Hungary is equal to + * capital OR of OR Hungary.
+ * In {@link Operator#AND} mode terms are considered to be in conjunction: the + * above mentioned query is parsed as capital AND of AND Hungary + * + * @deprecated + */ + @Deprecated + public void setDefaultOperator(DefaultOperatorAttribute.Operator operator) { + DefaultOperatorAttribute attr = getQueryConfigHandler().getAttribute(DefaultOperatorAttribute.class); + attr.setOperator(operator); + } + + /** + * Sets the boolean operator of the QueryParser. In default mode ( + * {@link Operator#OR}) terms without any modifiers are considered optional: + * for example capital of Hungary is equal to + * capital OR of OR Hungary.
+ * In {@link Operator#AND} mode terms are considered to be in conjunction: the + * above mentioned query is parsed as capital AND of AND Hungary + */ + public void setDefaultOperator( + org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler.Operator operator) { + + DefaultOperatorAttribute.Operator attrOperator; + + if (operator == org.apache.lucene.queryParser.standard.config.StandardQueryConfigHandler.Operator.AND) { + attrOperator = DefaultOperatorAttribute.Operator.AND; + } else { + attrOperator = DefaultOperatorAttribute.Operator.OR; + } + + setDefaultOperator(attrOperator); + + // uncomment code below when deprecated query parser attributes are removed + // getQueryConfigHandler().set(ConfigurationKeys.DEFAULT_OPERATOR, operator); + } + + /** + * Set to true to allow leading wildcard characters. + *

+ * When set, * or ? are allowed as the first + * character of a PrefixQuery and WildcardQuery. Note that this can produce + * very slow queries on big indexes. + *

+ * Default: false. + */ + public void setLowercaseExpandedTerms(boolean lowercaseExpandedTerms) { + LowercaseExpandedTermsAttribute attr = getQueryConfigHandler() + .getAttribute(LowercaseExpandedTermsAttribute.class); + attr.setLowercaseExpandedTerms(lowercaseExpandedTerms); + // uncomment code below when deprecated query parser attributes are removed + // getQueryConfigHandler().set(ConfigurationKeys.LOWERCASE_EXPANDED_TERMS, + // lowercaseExpandedTerms); + } + + /** + * @see #setLowercaseExpandedTerms(boolean) + */ + public boolean getLowercaseExpandedTerms() { + Boolean lowercaseExpandedTerms = getQueryConfigHandler().get( + ConfigurationKeys.LOWERCASE_EXPANDED_TERMS); + + if (lowercaseExpandedTerms == null) { + return true; + + } else { + return lowercaseExpandedTerms; + } + + } + + /** + * Set to true to allow leading wildcard characters. + *

+ * When set, * or ? are allowed as the first + * character of a PrefixQuery and WildcardQuery. Note that this can produce + * very slow queries on big indexes. + *

+ * Default: false. + */ + public void setAllowLeadingWildcard(boolean allowLeadingWildcard) { + AllowLeadingWildcardAttribute attr = getQueryConfigHandler().getAttribute( + AllowLeadingWildcardAttribute.class); + attr.setAllowLeadingWildcard(allowLeadingWildcard); + // uncomment code below when deprecated query parser attributes are removed + // getQueryConfigHandler().set(ConfigurationKeys.ALLOW_LEADING_WILDCARD, + // allowLeadingWildcard); + } + + /** + * Set to true to enable position increments in result query. + *

+ * When set, result phrase and multi-phrase queries will be aware of position + * increments. Useful when e.g. a StopFilter increases the position increment + * of the token that follows an omitted token. + *

+ * Default: false. + */ + public void setEnablePositionIncrements(boolean enabled) { + PositionIncrementsAttribute attr = getQueryConfigHandler().getAttribute( + PositionIncrementsAttribute.class); + attr.setPositionIncrementsEnabled(enabled); + // uncomment code below when deprecated query parser attributes are removed + // getQueryConfigHandler().set(ConfigurationKeys.ENABLE_POSITION_INCREMENTS, + // enabled); + } + + /** + * @see #setEnablePositionIncrements(boolean) + */ + public boolean getEnablePositionIncrements() { + Boolean enablePositionsIncrements = getQueryConfigHandler().get( + ConfigurationKeys.ENABLE_POSITION_INCREMENTS); + + if (enablePositionsIncrements == null) { + return false; + + } else { + return enablePositionsIncrements; + } + + } + + /** + * By default, it uses + * {@link MultiTermQuery#CONSTANT_SCORE_AUTO_REWRITE_DEFAULT} when creating a + * prefix, wildcard and range queries. This implementation is generally + * preferable because it a) Runs faster b) Does not have the scarcity of terms + * unduly influence score c) avoids any {@link TooManyListenersException} + * exception. However, if your application really needs to use the + * old-fashioned boolean queries expansion rewriting and the above points are + * not relevant then use this change the rewrite method. + */ + public void setMultiTermRewriteMethod(MultiTermQuery.RewriteMethod method) { + MultiTermRewriteMethodAttribute attr = getQueryConfigHandler() + .getAttribute(MultiTermRewriteMethodAttribute.class); + attr.setMultiTermRewriteMethod(method); + // uncomment code below when deprecated query parser attributes are removed + // getQueryConfigHandler().set(ConfigurationKeys.MULTI_TERM_REWRITE_METHOD, + // method); + } + + /** + * @see #setMultiTermRewriteMethod(org.apache.lucene.search.MultiTermQuery.RewriteMethod) + */ + public MultiTermQuery.RewriteMethod getMultiTermRewriteMethod() { + return getQueryConfigHandler().get( + ConfigurationKeys.MULTI_TERM_REWRITE_METHOD); + } + + /** + * Set the fields a query should be expanded to when the field is + * null + * + * @param fields the fields used to expand the query + */ + public void setMultiFields(CharSequence[] fields) { + + if (fields == null) { + fields = new CharSequence[0]; + } + + MultiFieldAttribute attr = getQueryConfigHandler().addAttribute( + MultiFieldAttribute.class); + attr.setFields(fields); + // uncomment code below when deprecated query parser attributes are removed + // getQueryConfigHandler().set(ConfigurationKeys.MULTI_FIELDS, fields); + + } + + /** + * Returns the fields used to expand the query when the field for a certain + * query is null + * + * @param fields the fields used to expand the query + */ + public void getMultiFields(CharSequence[] fields) { + getQueryConfigHandler().get(ConfigurationKeys.MULTI_FIELDS); + } + + /** + * Set the prefix length for fuzzy queries. Default is 0. + * + * @param fuzzyPrefixLength The fuzzyPrefixLength to set. + */ + public void setFuzzyPrefixLength(int fuzzyPrefixLength) { + FuzzyAttribute attr = getQueryConfigHandler().addAttribute( + FuzzyAttribute.class); + attr.setPrefixLength(fuzzyPrefixLength); + + // uncomment code below when deprecated query parser attributes are removed + /* + * QueryConfigHandler config = getQueryConfigHandler(); FuzzyConfig + * fuzzyConfig = config.get(ConfigurationKeys.FUZZY_CONFIG); + * + * if (fuzzyConfig == null) { fuzzyConfig = new FuzzyConfig(); + * config.set(ConfigurationKeys.FUZZY_CONFIG, fuzzyConfig); } + * + * fuzzyConfig.setPrefixLength(fuzzyPrefixLength); + */ + } + + public void setNumericConfigMap(Map numericConfigMap) { + getQueryConfigHandler().set(ConfigurationKeys.NUMERIC_CONFIG_MAP, + numericConfigMap); + } + + public Map getNumericConfigMap() { + return getQueryConfigHandler().get(ConfigurationKeys.NUMERIC_CONFIG_MAP); + } + + /** + * Set locale used by date range parsing. + */ + public void setLocale(Locale locale) { + LocaleAttribute attr = getQueryConfigHandler().addAttribute( + LocaleAttribute.class); + attr.setLocale(locale); + // uncomment code below when deprecated query parser attributes are removed + // getQueryConfigHandler().set(ConfigurationKeys.LOCALE, locale); + } + + /** + * Returns current locale, allowing access by subclasses. + */ + public Locale getLocale() { + return getQueryConfigHandler().get(ConfigurationKeys.LOCALE); + } + + /** + * Sets the default slop for phrases. If zero, then exact phrase matches are + * required. Default value is zero. + * + * @deprecated renamed to {@link #setPhraseSlop(int)} + */ + @Deprecated + public void setDefaultPhraseSlop(int defaultPhraseSlop) { + setPhraseSlop(defaultPhraseSlop); + } + + /** + * Sets the default slop for phrases. If zero, then exact phrase matches are + * required. Default value is zero. + */ + public void setPhraseSlop(int defaultPhraseSlop) { + DefaultPhraseSlopAttribute attr = getQueryConfigHandler().addAttribute( + DefaultPhraseSlopAttribute.class); + attr.setDefaultPhraseSlop(defaultPhraseSlop); + // uncomment code below when deprecated query parser attributes are removed + // getQueryConfigHandler().set(ConfigurationKeys.PHRASE_SLOP, + // defaultPhraseSlop); + } + + public void setAnalyzer(Analyzer analyzer) { + AnalyzerAttribute attr = getQueryConfigHandler().getAttribute( + AnalyzerAttribute.class); + attr.setAnalyzer(analyzer); + // uncomment code below when deprecated query parser attributes are removed + // getQueryConfigHandler().set(ConfigurationKeys.ANALYZER, analyzer); + } + + public Analyzer getAnalyzer() { + return getQueryConfigHandler().get(ConfigurationKeys.ANALYZER); + } + + /** + * @see #setAllowLeadingWildcard(boolean) + */ + public boolean getAllowLeadingWildcard() { + Boolean allowLeadingWildcard = getQueryConfigHandler().get( + ConfigurationKeys.ALLOW_LEADING_WILDCARD); + + if (allowLeadingWildcard == null) { + return false; + + } else { + return allowLeadingWildcard; + } + } + + /** + * Get the minimal similarity for fuzzy queries. + */ + public float getFuzzyMinSim() { + FuzzyConfig fuzzyConfig = getQueryConfigHandler().get( + ConfigurationKeys.FUZZY_CONFIG); + + if (fuzzyConfig == null) { + return FuzzyQuery.defaultMinSimilarity; + } else { + return fuzzyConfig.getMinSimilarity(); + } + } + + /** + * Get the prefix length for fuzzy queries. + * + * @return Returns the fuzzyPrefixLength. + */ + public int getFuzzyPrefixLength() { + FuzzyConfig fuzzyConfig = getQueryConfigHandler().get( + ConfigurationKeys.FUZZY_CONFIG); + + if (fuzzyConfig == null) { + return FuzzyQuery.defaultPrefixLength; + } else { + return fuzzyConfig.getPrefixLength(); + } + } + + /** + * Gets the default slop for phrases. + */ + public int getPhraseSlop() { + Integer phraseSlop = getQueryConfigHandler().get( + ConfigurationKeys.PHRASE_SLOP); + + if (phraseSlop == null) { + return 0; + + } else { + return phraseSlop; + } + } + + /** + * Set the minimum similarity for fuzzy queries. Default is defined on + * {@link FuzzyQuery#defaultMinSimilarity}. + */ + public void setFuzzyMinSim(float fuzzyMinSim) { + FuzzyAttribute attr = getQueryConfigHandler().addAttribute( + FuzzyAttribute.class); + attr.setFuzzyMinSimilarity(fuzzyMinSim); + // uncomment code below when deprecated query parser attributes are removed + /* + * QueryConfigHandler config = getQueryConfigHandler(); FuzzyConfig + * fuzzyConfig = config.get(ConfigurationKeys.FUZZY_CONFIG); + * + * if (fuzzyConfig == null) { fuzzyConfig = new FuzzyConfig(); + * config.set(ConfigurationKeys.FUZZY_CONFIG, fuzzyConfig); } + * + * fuzzyConfig.setMinSimilarity(fuzzyMinSim); + */ + } + + /** + * Sets the boost used for each field. + * + * @param boosts a collection that maps a field to its boost + */ + public void setFieldsBoost(Map boosts) { + FieldBoostMapAttribute attr = getQueryConfigHandler().addAttribute( + FieldBoostMapAttribute.class); + attr.setFieldBoostMap(boosts); + // uncomment code below when deprecated query parser attributes are removed + // getQueryConfigHandler().set(ConfigurationKeys.FIELD_BOOST_MAP, boosts); + } + + /** + * Returns the field to boost map used to set boost for each field. + * + * @return the field to boost map + */ + public Map getFieldsBoost() { + return getQueryConfigHandler().get(ConfigurationKeys.FIELD_BOOST_MAP); + } + + /** + * Sets the default {@link Resolution} used for certain field when no + * {@link Resolution} is defined for this field. + * + * @param dateResolution the default {@link Resolution} + */ + public void setDateResolution(DateTools.Resolution dateResolution) { + DateResolutionAttribute attr = getQueryConfigHandler().addAttribute( + DateResolutionAttribute.class); + attr.setDateResolution(dateResolution); + // uncomment code below when deprecated query parser attributes are removed + // getQueryConfigHandler().set(ConfigurationKeys.DATE_RESOLUTION, + // dateResolution); + } + + /** + * Returns the default {@link Resolution} used for certain field when no + * {@link Resolution} is defined for this field. + * + * @return the default {@link Resolution} + */ + public DateTools.Resolution getDateResolution() { + return getQueryConfigHandler().get(ConfigurationKeys.DATE_RESOLUTION); + } + + /** + * Sets the {@link Resolution} used for each field + * + * @param dateRes a collection that maps a field to its {@link Resolution} + * + * @deprecated this method was renamed to {@link #setDateResolutionMap(Map)} + */ + @Deprecated + public void setDateResolution(Map dateRes) { + setDateResolutionMap(dateRes); + } + + /** + * Returns the field to {@link Resolution} map used to normalize each date + * field. + * + * @return the field to {@link Resolution} map + */ + public Map getDateResolutionMap() { + return getQueryConfigHandler().get( + ConfigurationKeys.FIELD_DATE_RESOLUTION_MAP); + } + + /** + * Sets the {@link Resolution} used for each field + * + * @param dateRes a collection that maps a field to its {@link Resolution} + */ + public void setDateResolutionMap( + Map dateRes) { + FieldDateResolutionMapAttribute attr = getQueryConfigHandler() + .addAttribute(FieldDateResolutionMapAttribute.class); + attr.setFieldDateResolutionMap(dateRes); + // uncomment code below when deprecated query parser attributes are removed + // getQueryConfigHandler().set(ConfigurationKeys.FIELD_DATE_RESOLUTION_MAP, + // dateRes); + } + +}