Lucene复合查询搜索

时间:2011-03-21 14:07:02

标签: java lucene full-text-search

我想在lucene索引中查询一些交集。

数据:

FIELDS FIELD1 FIELD2 FIELD3
ROW ID1 VALUE1 VALUE2
ROW ID2 VALUE3 VALUE4
行ID3 VALUE4 VALUE5
ROW ID3 VALUE6 VALUE5

查询: (FIELD2:VALUE4 AND FIELD3:VALUE5)(FIELD1上的INTERSECT)(FIELD2:VALUE4和FIELD3:VALUE5)

所以我的最终结果应该是ID3。

任何输入都会有很大的帮助。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我不明白你想要做什么,那里没有交集

如果你的意思是问我如何在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

答案 1 :(得分: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

理想情况下,我应该得到(期望产品,其中header_id 02,03值为XYZ,ABC匹配)PRODUCT_02作为结果。我真的不知道查询中的产品。

如果我使用OR查询,我将获得PRODUCT_02以及PRODUCT_03,这将是错误的。 如果我用AND查询,我将得不到任何东西,因为Lucene作为One-Doc-At-A-Time运行。

我希望这次我的问题具有描述性。

那是你的回复。 :)