@Override public org.apache.lucene.search.Query getLuceneQuery() { org.apache.lucene.search.PrefixQuery luceneQuery = new org.apache.lucene.search.PrefixQuery(new Term(field, term)); luceneQuery.setBoost(boost); return luceneQuery; }
/** * Dispatches to Lucene's SimpleQueryParser's newPrefixQuery, optionally * lowercasing the term first or trying to analyze terms */ @Override public Query newPrefixQuery(String text) { if (settings.lowercaseExpandedTerms()) { text = text.toLowerCase(settings.locale()); } BooleanQuery.Builder bq = new BooleanQuery.Builder(); bq.setDisableCoord(true); for (Map.Entry<String,Float> entry : weights.entrySet()) { try { if (settings.analyzeWildcard()) { Query analyzedQuery = newPossiblyAnalyzedQuery(entry.getKey(), text); if (analyzedQuery != null) { analyzedQuery.setBoost(entry.getValue()); bq.add(analyzedQuery, BooleanClause.Occur.SHOULD); } } else { PrefixQuery prefix = new PrefixQuery(new Term(entry.getKey(), text)); prefix.setBoost(entry.getValue()); bq.add(prefix, BooleanClause.Occur.SHOULD); } } catch (RuntimeException e) { return rethrowUnlessLenient(e); } } return super.simplify(bq.build()); }
@Override public Query visit(TermQuery termQuery, Field field) { if( clauseCount == 0 ) { // at last query Term term = termQuery.getTerm(); if( term.text().length() < minTermLength ) // exclude short queries to avoid clause overload return termQuery; PrefixQuery prefixQuery = new PrefixQuery(term); prefixQuery.setBoost( termQuery.getBoost()/4f ); BooleanQuery boolQuery = new BooleanQuery(); boolQuery.add(termQuery, Occur.SHOULD); boolQuery.add(prefixQuery, Occur.SHOULD); boolQuery.setBoost( termQuery.getBoost() ); return boolQuery; } return termQuery; }
pq.setBoost( 0.8f );
pq.setBoost( 0.8f );
@Override public Query visit(TermQuery termQuery, Field field) { if( field != Field.CONTENTS ) return termQuery; // turn term query into: (term* OR *term* OR term~) Term term = termQuery.getTerm(); PrefixQuery prefixQuery = new PrefixQuery(term); prefixQuery.setBoost( termQuery.getBoost() ); Term wildcardTerm = Field.CONTENTS.createTerm("*" + term.text() + "*"); WildcardQuery wildcardQuery = new WildcardQuery(wildcardTerm); wildcardQuery.setBoost( termQuery.getBoost() * 0.75f ); FuzzyQuery fuzzyQuery = new FuzzyQuery( term ); fuzzyQuery.setBoost( termQuery.getBoost() * 0.5f ); BooleanQuery boolQuery = new BooleanQuery(); boolQuery.add(prefixQuery, Occur.SHOULD); boolQuery.add(wildcardQuery, Occur.SHOULD); boolQuery.add(fuzzyQuery, Occur.SHOULD); boolQuery.setBoost( termQuery.getBoost() ); return boolQuery; }