2011-03-21 6 views
1

Je veux interroger dans l'index lucene avec une certaine intersection sur elle.Lucene recherche de requête composée

données:

CHAMPS FIELD1 FIELD2 FIELD3
ROW         ID1             VALUE1 VALUE2
ROW         ID2             VALUE3 VALUE4
ROW         ID3             VALUE4 valeur5
ROW         ID3             valeur6 valeur5

Requête: (FIELD2: VALUE4 ET FIELD3: valeur5) (INTERSECT SUR FIELD1) (FIELD2: VALUE4 et FIELD3: VALUE5)

Donc, mon résultat final devrait être ID3.

Toute contribution serait d'une grande aide.

Merci d'avance.

+0

Lucene Core est en Java, vous pouvez donc le marquer en conséquence – Narayan

Répondre

0

Je DONOT comprends ce que vous essayez de faire, il n'y a pas d'intersection là

si u signifie pour demander comment puis-je faire une recherche composée (ET) dans l'index de Lucene, voir ci-dessous

TermQuery tq1= new TermQuery(new Term("VALUE4", FIELD2)); 
TermQuery tq2= new TermQuery(new Term("VALUE5", FIELD3)); 
// BooleanClauses Enum SHOULD says Use this operator for clauses that should appear in the matching documents. 
BooleanQuery bq = new BooleanQuery(); 
bq.add(tq1,BooleanClause.Occur.SHOULD); 
bq.add(tq2,BooleanClause.Occur.SHOULD); 
IndexSearcher searcher = new IndexSearcher(index, true); 
TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); 
//Iterate Collector hits 
//process HitCollector or whatever terms, results,etc 

EDIT:

//Parser meant for using all the fields used for search 
MultiFieldQueryParser multiQueryParser = new MultiFieldQueryParser(
    searchFields, ANALYZER_NAME); 
    multiQueryParser.setDefaultOperator(QueryParser.AND_OPERATOR); 

//You need to build something like this 

Query query1 = new TermQuery(HEADER,"HEADER_01"); 
Query query2 = new TermQuery(XYZ_FIELD,"XYZ"); 

Query query3 = new TermQuery(HEADER,"HEADER_02"); 
Query query4 = new TermQuery(XYZ_FIELD,"ABC"); 

BooleanQuery booleanQuery = new BooleanQuery(); 
booleanQuery.add(query1, BooleanClause.Occur.MUST); 
booleanQuery.add(query2, BooleanClause.Occur.MUST); 

booleanQuery.add(query3, BooleanClause.Occur.MUST); 
booleanQuery.add(query4, BooleanClause.Occur.MUST); 

//Search the index 
0

Permettez-moi d'ajouter un peu plus de données qu'il contient.

PRODUCT_ID|HEADER_ID|HEADER_VALUE 

PRODUCT_01|HEADER_01|XYZ 
PRODUCT_02|HEADER_02|XYZ 
PRODUCT_02|HEADER_03|ABC 
PRODUCT_03|HEADER_03|ABC 

Maintenant, supposons que de mon interface utilisateur que je sélectionne les en-têtes comme:

HEADER_02 avec la valeur XYZ

et

HEADER_03 avec la valeur ABC

Je devrait idéalement obtenir (produit attendu à laquelle header_id 02, 03 avec la valeur XYZ, ABC correspondent) PRODUCT_02 en conséquence. Et je ne sais vraiment pas sur le produit dans la requête.

Si je demande avec OU j'obtiendra PRODUCT_02 ainsi que PRODUCT_03, ce qui sera faux. Si je demande avec ET, je n'obtiendrai rien parce que Lucene fonctionne comme One-Doc-at-A-Time.

J'espère que mon problème est descriptif cette fois.

Voilà pour votre réponse. :)

+0

Voir mon edit dans la réponse – Narayan

+0

: D ... Doit vérifier les quatre valeurs dans une seule ligne ... résultat en rien ... J'ai déjà mentionné ce problème avec et condition. – kc123

+0

Si vous voulez une fonctionnalité agrégée (GroupBy), dans mon knowlegde. rien de tel n'existe dans lucene, vous pouvez faire une recherche OU, écrire une classe wrapper qui agrègera les résultats, je vois la sous-classe Collector <> prend une file d'attente prioritaire, il est facile d'implémenter la fonctionnalité globale en plus de cela? Qu'est-ce que tu penses – Narayan