Поиск…


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();


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow