简体   繁体   English

Lucene复合查询搜索

[英]Lucene compound query search

I want to query in lucene index with some intersection on it. 我想查询带有一些交集的lucene索引。

Data : 资料:

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

Query : (FIELD2:VALUE4 AND FIELD3:VALUE5) (INTERSECT ON FIELD1) (FIELD2:VALUE4 AND FIELD3:VALUE5) 查询:(FIELD2:VALUE4和FIELD3:VALUE5)(在FIELD1上相交)(FIELD2:VALUE4和FIELD3:VALUE5)

So my final result should be ID3. 所以我的最终结果应该是ID3。

Any input would be of great help. 任何输入都会有很大的帮助。

Thanks in advance. 提前致谢。

I donot understand what you are trying to do, there is no intersection in there 我不明白您要做什么,那里没有交叉口

if u mean to ask how do i do a compound search(AND) in lucene index, see below 如果您要问我如何在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

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

Let me add some more data in it. 让我在其中添加更多数据。

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

Now, suppose from my UI I select headers as: 现在,假设从我的UI中选择标题为:

HEADER_02 with value XYZ HEADER_02,值XYZ

and

HEADER_03 with value ABC HEADER_03,价值ABC

I should ideally get (expected product to which header_id 02, 03 with value XYZ, ABC are matching) PRODUCT_02 as a result. 理想情况下,我应该得到(与值XYZ,ABC匹配的header_id 02、03与之对应的预期产品)PRODUCT_02。 And I really don't know about product in the query. 我真的不知道查询中的产品。

If I query with OR I will get PRODUCT_02 as well as PRODUCT_03, which will be wrong. 如果我用OR进行查询,我将得到PRODUCT_02和PRODUCT_03,这是错误的。 If I query with AND I will get nothing because Lucene operate as One-Doc-At-A-Time. 如果我使用AND查询,我将一无所获,因为Lucene的运行时间为一个文档。

I hope my problem is descriptive this time. 我希望这次我的问题是描述性的。

That's for your reply. 这是您的答复。 :) :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM