2009-07-22 6 views
10

Je suis nouveau dans Lucene, je suis en train de faire une chose de recherche comme celui-ciLucene « ou requêtes »

content="some thext" and (id ="A" or id="B" or id="c") 

Je suis vraiment perdu avec cela, pourriez-vous me aider

Merci.

Répondre

10

je crois que la section "Regroupement" dans le Query Parser Syntax documentation fournit la réponse:

(jakarta OR apache) AND website 

Je suppose que vous devez faire vos opérateurs (and, or) majuscules. De plus, je ne pense pas que vous pouvez utiliser l'opérateur égal (utilisez deux points à la place).

content:"some thext" AND (id:"A" OR id:"B" OR id:"c") 
+0

Merci ... il a si bien réussi votre aide –

+0

vous pouvez simplifier à: 'contenu: « certains thext » ET id :(« A » OU "B" OU "c") ' –

21
BooleanQuery mainQuery = new BooleanQuery(); 

TermQuery contentFilter = new TermQuery(new Term("content", "some text")); 
mainQuery.add(contentFilter, BooleanClause.Occur.MUST); 

BooleanQuery idFilter = new BooleanQuery(); 
idFilter.setMinimumNumberShouldMatch(1); 
idFilter.add(new TermQuery(new Term("id", A)), BooleanClause.Occur.SHOULD); 
idFilter.add(new TermQuery(new Term("id", B)), BooleanClause.Occur.SHOULD); 
idFilter.add(new TermQuery(new Term("id", C)), BooleanClause.Occur.SHOULD); 
mainQuery.Add(idFilter, BooleanClause.Occur.MUST); 
+1

On dirait que' moduleFilter' devrait être changé en 'idFilter'. De toute façon +1 pour la réponse. – RyuuGan

+3

Une explication que j'ai trouvée utile (à partir des javadocs Occur): Pour une requête BooleanQuery sans Occur.MUST, une ou plusieurs clauses Occur.SHOULD doivent correspondre à un document pour que BooleanQuery corresponde. – Renaud

-1

BooleanQuery est maintenant dépréciée.

La nouvelle syntaxe ressemble à ceci. (Devrait == OU, doit == ET)

val searchManager = Search.getSearchManager(cache) 
val queryBuilder = searchManager.buildQueryBuilderForClass(classTag[T].runtimeClass).get() 
val luceneQuery = queryBuilder.bool() 
luceneQuery.should(new TermQuery(new Term("type", "lala")) 
luceneQuery.createQuery()