Java ApacheLucene一对多查询

Java ApacheLucene一对多查询,java,lucene,Java,Lucene,我正在尝试构建一个lucene查询,它将处理以下一对多关系。我正试图在lucene 5.5中做到这一点,但如果我做不到,我会在必要时将项目升级到新版本 假设我有两个这样的物体。一家拥有多个项目的公司 公司(一家) String name String address_state String address_street ... Items items Int item_id String item_name ... Int item_price 项目(多

我正在尝试构建一个lucene查询,它将处理以下一对多关系。我正试图在lucene 5.5中做到这一点,但如果我做不到,我会在必要时将项目升级到新版本

假设我有两个这样的物体。一家拥有多个项目的公司

公司(一家)

String name  
String address_state  
String address_street  
...  
Items items  
Int item_id  
String item_name  
...  
Int item_price  
项目(多个)

String name  
String address_state  
String address_street  
...  
Items items  
Int item_id  
String item_name  
...  
Int item_price  
我将如何搜索特定州的公司,这些公司有特定的商品名称,价格低于某一点?例如,在CA中搜索一个名为“Phone”的商品的公司,该商品的价格也低于150

我只有大约30万家公司,但有大约500万件商品。所以,如果可能的话,我宁愿先按公司过滤


谢谢大家。

我建议大家看看Lucene中的块连接方法(您已经可以在5.5版本中使用它了)

代码示例,应给出如何执行此操作的想法:

final Document item1 = new Document();
item1.add(new TextField("item_name", "item1", Field.Store.YES));
item1.add(new TextField("type", "item", Field.Store.YES));


final Document item2 = new Document();
item2.add(new TextField("item_name", "item2", Field.Store.YES));
item2.add(new TextField("type", "item", Field.Store.YES));

final Document company1 = new Document();
company1.add(new TextField("name", "company1", Field.Store.YES));
company1.add(new TextField("type", "company", Field.Store.YES));

writer.addDocuments(Arrays.asList(new Document[] {item1, item2, company1}));
在本例中,我创建了两个项目并附加到公司。注意
addDocuments
方法中文档的顺序-子文档(您案例中的项目)应位于父文档(您案例中的公司)之前。在此块中,您可以有任意数量的项

稍后,您可以使用此数据库中的几种查询类型进行非常高效的查询

查询的示例可能如下所示:

BooleanQuery.Builder builder = new BooleanQuery.Builder();
    builder.add(new BooleanClause(new TermQuery(new Term("item_name", "item1")), BooleanClause.Occur.MUST));
    BooleanQuery childQuery = builder.build();
    ToParentBlockJoinQuery parentQuery =
        new ToParentBlockJoinQuery(
            childQuery,
            new QueryBitSetProducer(new TermQuery(new Term("type", "company"))),
            ScoreMode.Avg);

此查询搜索所有公司,这些公司的项目名为item1。您也应该能够非常容易地扩展此功能

我建议您看看Lucene中的块连接方法(您可以在5.5版本中使用它)

代码示例,应给出如何执行此操作的想法:

final Document item1 = new Document();
item1.add(new TextField("item_name", "item1", Field.Store.YES));
item1.add(new TextField("type", "item", Field.Store.YES));


final Document item2 = new Document();
item2.add(new TextField("item_name", "item2", Field.Store.YES));
item2.add(new TextField("type", "item", Field.Store.YES));

final Document company1 = new Document();
company1.add(new TextField("name", "company1", Field.Store.YES));
company1.add(new TextField("type", "company", Field.Store.YES));

writer.addDocuments(Arrays.asList(new Document[] {item1, item2, company1}));
在本例中,我创建了两个项目并附加到公司。注意
addDocuments
方法中文档的顺序-子文档(您案例中的项目)应位于父文档(您案例中的公司)之前。在此块中,您可以有任意数量的项

稍后,您可以使用此数据库中的几种查询类型进行非常高效的查询

查询的示例可能如下所示:

BooleanQuery.Builder builder = new BooleanQuery.Builder();
    builder.add(new BooleanClause(new TermQuery(new Term("item_name", "item1")), BooleanClause.Occur.MUST));
    BooleanQuery childQuery = builder.build();
    ToParentBlockJoinQuery parentQuery =
        new ToParentBlockJoinQuery(
            childQuery,
            new QueryBitSetProducer(new TermQuery(new Term("type", "company"))),
            ScoreMode.Avg);
此查询搜索所有公司,这些公司的项目名为item1。你也应该能够很容易地扩展它