2011-03-21 202 views
1

我想在lucene索引中查詢一些交集。Lucene複合查詢搜索

數據:

場FIELD1 FIELD2 FIELD3
ROW         ID1             VALUE1 VALUE2
ROW         ID2             VALUE3 VALUE4
ROW         ID3             VALUE4值5
ROW         ID3             VALUE6值5

查詢: (FIELD2:VALUE4 AND FIELD3:值5)( INTERSECT ON FIELD1)(FIELD2:VALUE4 AND FIELD3:VALUE5)

所以我的最終結果應該是ID3。

任何輸入都會有很大的幫助。

在此先感謝。

+0

Lucene核心是在Java中,所以你可以相應地標記它 – Narayan 2011-03-21 14:09:53

回答

0

我DONOT明白你正在嘗試做的,有在那裏沒有交集

如果u的意思是問我如何做Lucene索引複合搜索(AND),見下文

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 

編輯:

//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

讓我在裏面添加一些更多的數據。

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 

現在,從我的UI想我選擇標題爲:

HEADER_02與價值XYZ

HEADER_03與價值ABC

我應該理想地得到(預期產品其值爲XYZ的header_id 02,03與ABC匹配)作爲結果的PRODUCT_02。我真的不知道查詢中的產品。

如果我用OR查詢,我會得到PRODUCT_02以及PRODUCT_03,這將是錯誤的。 如果我使用AND進行查詢,我將得不到任何東西,因爲Lucene會以一次一個文檔的方式運行。

我希望這個時候我的問題是描述性的。

這對您的回覆。 :)

+0

請參閱我的編輯答案 – Narayan 2011-03-22 07:58:20

+0

:D ...必須檢查單個行中的所有四個值...結果成什麼都沒有...我已經提到這個問題和條件。 – kc123 2011-03-22 09:08:23

+0

如果你想要一些骨料(的GroupBy)功能,在我knowlegde。沒有在Lucene的這種存在,你能怎麼辦OR搜索,寫一個包裝類,將彙總結果,我看到收藏家<>子類需要一個PriorityQueue,它很容易實現在它上面總funtionality?你怎麼看 – Narayan 2011-03-24 08:19:55