Java ApacheLucene一对多查询
我正在尝试构建一个lucene查询,它将处理以下一对多关系。我正试图在lucene 5.5中做到这一点,但如果我做不到,我会在必要时将项目升级到新版本 假设我有两个这样的物体。一家拥有多个项目的公司 公司(一家)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 项目(多
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。你也应该能够很容易地扩展它