use of org.apache.lucene.search.MultiPhraseQuery in project lucene-solr by apache.
the class TestQPHelper method testMultiPhraseQuery.
public void testMultiPhraseQuery() throws Exception {
Directory dir = newDirectory();
IndexWriter w = new IndexWriter(dir, newIndexWriterConfig(new CannedAnalyzer()));
Document doc = new Document();
doc.add(newTextField("field", "", Field.Store.NO));
w.addDocument(doc);
IndexReader r = DirectoryReader.open(w);
IndexSearcher s = newSearcher(r);
Query q = new StandardQueryParser(new CannedAnalyzer()).parse("\"a\"", "field");
assertTrue(q instanceof MultiPhraseQuery);
assertEquals(1, s.search(q, 10).totalHits);
r.close();
w.close();
dir.close();
}
use of org.apache.lucene.search.MultiPhraseQuery in project greplin-lucene-utils by Cue.
the class PhrasePrefixQuery method rewrite.
@Override
public final Query rewrite(final IndexReader reader) throws IOException {
Term[] prefixTerms = getPrefixTerms(this.terms.get(this.terms.size() - 1), reader);
if (prefixTerms == null) {
return new MatchNoDocsQuery();
}
MultiPhraseQuery query = new MultiPhraseQuery();
for (int i = 0; i < this.terms.size() - 1; i++) {
query.add(new Term(this.field, this.terms.get(i)));
}
query.add(prefixTerms);
return query;
}
use of org.apache.lucene.search.MultiPhraseQuery in project zm-mailbox by Zimbra.
the class LuceneQueryOperation method expandLazyMultiPhraseQuery.
private Query expandLazyMultiPhraseQuery(Query query) throws IOException {
if (query instanceof LazyMultiPhraseQuery) {
LazyMultiPhraseQuery lazy = (LazyMultiPhraseQuery) query;
int max = LC.zimbra_index_wildcard_max_terms_expanded.intValue();
MultiPhraseQuery mquery = new MultiPhraseQuery();
for (Term[] terms : lazy.getTermArrays()) {
if (terms.length != 1) {
mquery.add(terms);
continue;
}
Term base = terms[0];
if (!lazy.expand.contains(base)) {
mquery.add(terms);
continue;
}
List<Term> expanded = Lists.newArrayList();
try (TermFieldEnumeration itr = searcher.getIndexReader().getTermsForField(base.field(), base.text())) {
while (itr.hasMoreElements()) {
BrowseTerm term = itr.nextElement();
if (term != null && term.getText().startsWith(base.text())) {
if (expanded.size() >= max) {
// expanded
break;
}
expanded.add(new Term(base.field(), term.getText()));
} else {
break;
}
}
}
if (expanded.isEmpty()) {
return null;
} else {
mquery.add(expanded.toArray(new Term[expanded.size()]));
}
}
return mquery;
} else if (query instanceof BooleanQuery) {
ListIterator<BooleanClause> itr = ((BooleanQuery) query).clauses().listIterator();
while (itr.hasNext()) {
BooleanClause clause = itr.next();
Query result = expandLazyMultiPhraseQuery(clause.getQuery());
if (result == null) {
if (clause.isRequired()) {
return null;
} else {
itr.remove();
}
} else if (result != clause.getQuery()) {
clause.setQuery(result);
}
}
return ((BooleanQuery) query).clauses().isEmpty() ? null : query;
} else {
return query;
}
}
Aggregations