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