Buscar..


BooleanQuery

BooleanQuery se utiliza para combinar otras consultas.

Se pueden combinar utilizando tres parámetros BooleanClause.Occur:

  • BooleanClause.Occur.MUST - La subconsulta debe coincidir.
  • BooleanClause.Occur.SHOULD : la subconsulta puede no coincidir, pero tendrá una puntuación más alta si lo es. Si no hay cláusulas MUST, entonces debe coincidir al menos una cláusula SHOULD.
  • BooleanClause.Occur.MUST_NOT : la subconsulta no debe coincidir con el documento.

En este ejemplo, un documento coincidirá si tiene "importante", pero no "prohibido", y obtendrá una puntuación más alta si también tiene "útil".

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

Alternativamente, también puede especificar el número mínimo de cláusulas que deben coincidir:

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: las cláusulas con BooleanClause.Occur.MUST_NOT no coinciden con todo lo demás, solo eliminan las coincidencias. Su BooleanQuery debe tener al menos una cláusula MUST o SHOULD , o no coincidirá con nada. Esto, por ejemplo, NO funcionará:

//***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 se utiliza para buscar una secuencia de términos. Lo siguiente coincide con la frase "Hello World" (después de ser indexado con StandardAnalyzer )

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

PhraseQuery también puede manejar "slop", o términos adicionales dentro de una consulta, al establecer una distancia de edición máxima con setSlop . Esto coincidirá con "Lorem ipsum sit amet dolor":

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

También puede establecer incrementos de posición exactos:

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

Esto combina consultas de tal manera que la mejor coincidencia (es decir, la puntuación más alta) de sus subconsultas contribuye a la puntuación final.

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

El segundo argumento del constructor DisjunctionMaxQuery es un valor de desempate, que, cuando no es cero, permite que las coincidencias no máximas hagan una pequeña contribución para puntuar, a fin de romper los empates. Generalmente debe ser pequeño (del orden de 0.1).

Impulsando consultas

Se puede impulsar una consulta para aumentar su puntaje en relación con otras subconsultas. Esto se hace envolviéndolo con un 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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow