gpt4 book ai didi

java - Apache Lucene 一对多查询

转载 作者:太空宇宙 更新时间:2023-11-04 09:23:25 24 4
gpt4 key购买 nike

我正在尝试构建一个 lucene 查询,该查询将适用于以下一对多关系。我正在尝试在 lucene 5.5 中执行此操作,但如果我做不到,那么我将在必要时将项目升级到更新的版本。

假设我有两个像这样的对象。一家公司拥有多个项目。

公司(一)

String name  
String address_state
String address_street
...
Items items

项目(很多)

Int item_id  
String item_name
...
Int item_price

我如何搜索特定州内具有特定商品名称且价格低于特定点的公司?例如,搜索位于加利福尼亚州的公司,其商品名为“电话”且价格也低于 150?

我只有大约 30 万家公司,但拥有大约 500 万个商品。因此,如果可能的话,我宁愿首先按公司过滤。

对于任何人,谢谢。

最佳答案

我建议查看 Lucene 中的 block 连接方法(并且您已经可以在 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}));

在此示例中,我创建了 2 个项目并将其附加到公司。请注意 addDocuments 方法中的文档顺序 - 子文档(您的案例中的项目)应位于父文档(您的案例中的公司)之前。您可以在此 block 中拥有任意数量的项目。

稍后,您可以使用此 package 中的多种类型的查询进行非常高效的查询。 .

查询示例可能如下所示:

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 的项目的公司。您也应该能够很容易地扩展它

关于java - Apache Lucene 一对多查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58037260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com