Поиск…
BooleanQuery
BooleanQuery используется для объединения других запросов.
Их можно комбинировать с использованием трех параметров BooleanClause.Occur:
-
BooleanClause.Occur.MUST
-BooleanClause.Occur.MUST
должен быть сопоставлен. -
BooleanClause.Occur.SHOULD
-BooleanClause.Occur.SHOULD
может не совпадать, но он будетBooleanClause.Occur.SHOULD
более высоко, если он есть. Если нет предложений MUST, то должно быть согласовано хотя бы одно предложение SHOULD. -
BooleanClause.Occur.MUST_NOT
-BooleanClause.Occur.MUST_NOT
не должен совпадать с документом.
В этом примере документ будет соответствовать, если он имеет «важное», но не «запрещенное», и получит более высокий балл, если он также «полезен».
Query importantQuery = new TermQuery(new Term("fieldname", "important"));
Query optionalQuery = new TermQuery(new Term("fieldname", "helpful"));
Query forbidQuery = new TermQuery(new Term("fieldname", "forbidden"));
BooleanQuery query = new BooleanQuery.Builder()
.add(importantQuery, BooleanClause.Occur.MUST)
.add(optionalQuery, BooleanClause.Occur.SHOULD)
.add(forbidQuery, BooleanClause.Occur.MUST_NOT)
.build();
Кроме того, вы также можете указать минимальное количество предложений, которые должны быть сопоставлены:
Query query1 = new TermQuery(new Term("fieldname", "one"));
Query query2 = new TermQuery(new Term("fieldname", "two"));
Query query3 = new TermQuery(new Term("fieldname", "three"));
BooleanQuery query = new BooleanQuery.Builder()
.add(query1, BooleanClause.Occur.SHOULD)
.add(query2, BooleanClause.Occur.SHOULD)
.add(query3, BooleanClause.Occur.SHOULD)
.setMinimumNumberShouldMatch(2)
.build();
Gotcha: Классы с BooleanClause.Occur.MUST_NOT
не соответствуют всем остальным, они устраняют совпадения. У вашего BooleanQuery должно быть хотя бы одно условие MUST
или SHOULD
, или оно ничего не будет соответствовать. Это, например, НЕ будет работать:
//***This does NOT work!***
Query forbidQuery = new TermQuery(new Term("fieldname", "forbidden"));
BooleanQuery getEverythingElseQuery = new BooleanQuery.Builder()
.add(forbidQuery, BooleanClause.Occur.MUST_NOT)
.build();
PhraseQuery
PhraseQuery используется для поиска последовательности терминов. Следующее соответствует фразе «Hello World» (после индексации с помощью StandardAnalyzer
)
Query query = new PhraseQuery.Builder()
.add(new Term("text", "hello"))
.add(new Term("text", "world"))
.build();
PhraseQuery также может обрабатывать «slop» или дополнительные термины в запросе, устанавливая максимальное расстояние редактирования с помощью setSlop
. Это будет соответствовать «Lorem ipsum sit amet dolor»:
Query query = new PhraseQuery.Builder()
.add(new Term("text", "lorem"))
.add(new Term("text", "amet"))
.setSlop(2)
.build();
Вы также можете установить точные позиции:
Query query = new PhraseQuery.Builder()
.add(new Term("text", "lorem"), 0)
.add(new Term("text", "sit"), 2)
.add(new Term("text", "dolor"), 4)
.build();
DisjunctionMaxQuery
Это объединяет запросы, так что наилучшее (то есть наивысшее) соответствие подзапросов вносит свой вклад в окончательный результат.
List<Query> disjuncts = new ArrayList<Query>();
disjuncts.add(new TermQuery(new Term("fieldname", "hello")));
disjuncts.add(new TermQuery(new Term("fieldname", "world")));
Query query = new DisjunctionMaxQuery(disjuncts, 0.0f);
Второй аргумент для конструктора DisjunctionMaxQuery
- это значение тай-брейка, которое, когда отличное от нуля, позволяет немаксимальным совпадениям внести небольшой вклад в выигрыш, чтобы разорвать связи. Он обычно должен быть небольшим (порядка 0,1).
Усиление запросов
Запрос может быть увеличен, чтобы увеличить его оценку по сравнению с другими подзапросами. Это делается путем упаковки его с помощью BoostQuery
Query lessRelevantQuery = new TermQuery(new Term("fieldname", "ipsum"));
//Five times as interesting
Query highlyRelevantQuery = new BoostQuery(
new TermQuery(new Term("fieldname", "lorem")),
5.0f);
BooleanQuery query = new BooleanQuery.Builder()
.add(lessRelevantQuery, BooleanClause.Occur.SHOULD)
.add(highlyRelevantQuery, BooleanClause.Occur.SHOULD)
.build();