Lucene复合查询搜索

问题描述:

我想在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

我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 

让我在里面添加一些更多的数据。

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