Szukaj…


BooleanQuery

BooleanQuery służy do łączenia innych zapytań.

Można je łączyć za pomocą trzech parametrów BooleanClause.Occur:

  • BooleanClause.Occur.MUST - podzapytanie musi zostać dopasowane.
  • BooleanClause.Occur.SHOULD - podzapytanie może nie być dopasowane, ale jeśli będzie, zostanie ocenione wyżej. Jeśli nie ma klauzul MUSI, to należy dopasować co najmniej jedną klauzulę POWINIEN.
  • BooleanClause.Occur.MUST_NOT - podzapytanie nie może być zgodne z dokumentem.

W tym przykładzie dokument będzie pasował, jeśli będzie „ważny”, ale nie „zabroniony”, i uzyska wyższy wynik, jeśli będzie również „pomocny”.

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

Możesz też określić minimalną liczbę klauzul, które muszą być dopasowane:

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: Klauzule z BooleanClause.Occur.MUST_NOT nie pasują do wszystkiego innego, eliminują tylko dopasowania. Twoje BooleanQuery musi mieć co najmniej jedną klauzulę MUST lub SHOULD , w przeciwnym razie nic nie będzie pasowało. To na przykład NIE zadziała:

//***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 służy do wyszukiwania sekwencji terminów. Poniższy tekst pasuje do wyrażenia „Hello World” (po zaindeksowaniu za pomocą StandardAnalyzer )

Query query = new PhraseQuery.Builder()
        .add(new Term("text", "hello"))
        .add(new Term("text", "world"))
        .build();

PhraseQuery może również obsługiwać „nachylenie” lub dodatkowe terminy w zapytaniu, ustawiając maksymalną odległość edycji za pomocą setSlop . Będzie to pasować do „Lorem ipsum sit amet dolor”:

Query query = new PhraseQuery.Builder()
        .add(new Term("text", "lorem"))
        .add(new Term("text", "amet"))
        .setSlop(2)
        .build();

Możesz także ustawić dokładne przyrosty pozycji:

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

Łączy to zapytania, dzięki czemu najlepsze (tj. Najwyższe wyniki) dopasowanie jego podzapytań przyczynia się do końcowego wyniku.

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

Drugim argumentem konstruktora DisjunctionMaxQuery jest wartość rozstrzygająca, która, gdy jest różna od zera, pozwala nie-maksymalnym dopasowaniom wnieść niewielki wkład w zdobywanie punktów w celu zerwania więzi. Zasadniczo powinien być mały (rzędu 0,1).

Zwiększanie liczby zapytań

Zapytanie można zwiększyć, aby zwiększyć jego wynik w stosunku do innych podzapytań. Odbywa się to poprzez owijanie go za pomocą 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow