Java 如何使用Lucene存储值对

Java 如何使用Lucene存储值对,java,lucene,Java,Lucene,我有一个数据库,其中包含一个商店、一个产品和一个地点。可以有许多商店,每个商店都有一个子集的产品,每个产品可以有一个位置在每个商店 例如,在商店1中,产品1的位置可以是通道1,而在商店2中,产品1的位置可以是楼层2,通道4。位置是任意字符串 表(引号中)如下所示: 'Store' columns: store_id (int) 'Product' columns: product_id (int), name (String), price (String) 'Location' (a join

我有一个数据库,其中包含一个商店、一个产品和一个地点。可以有许多商店,每个商店都有一个子集的产品,每个产品可以有一个位置在每个商店

例如,在商店1中,产品1的位置可以是通道1,而在商店2中,产品1的位置可以是楼层2,通道4。位置是任意字符串

表(引号中)如下所示:

'Store' columns: store_id (int)
'Product' columns: product_id (int), name (String), price (String)
'Location' (a join table) columns: store_id (int), product_id (int), location (String) // I know I could just add a different table table but this suffices for now. 
使用MySQL获取产品的位置非常简单,但是如果我想使用Lucene来获取产品的位置,这就有点困难了

我正在考虑向Lucene索引添加字段,如下所示:

Document doc = new Document();
doc.add(new TextField("productName", productName, Field.Store.YES));
doc.add(new FloatField("price", price, Field.Store.YES));
doc.add(new TextField("store_numbers", allStoreNumbersAsString, Field.Store.YES)); // this way I can look up a single store number
doc.add(new TextField("location", location, Field.Store.YES));
但问题是,如果我根据门店号搜索,我仍然会得到多个位置,因为它们是不同字段的一部分

或者我应该做一些类似的事情:

Document doc = new Document();
doc.add(new TextField("productName", productName, Field.Store.YES));
doc.add(new FloatField("price", price, Field.Store.YES));
doc.add(new TextField("store_numbers", allStoreNumbersAsString, Field.Store.YES)); // this way I can look up a single store number
String[] stores = allStoreNumbersAsString.split(",");
for(int i=0; i<stores.length; i++){
    doc.add(new TextField("store_location", stores[i]+ ", " + location, Field.Store.YES));
}
for(Product product: products) {
    for(Store store: product.stores) {
        Document doc = new Document();
        doc.add(new TextField("productName", product.name, Field.Store.YES));
        doc.add(new FloatField("price", price, Field.Store.YES));
        doc.add(new TextField("store", store, Field.Store.YES));
        doc.add(new TextField("location", location, Field.Store.YES));
    }
}
Document doc=新文档();
添加(新文本字段(“productName”,productName,Field.Store.YES));
新增单据(新增浮动字段(“价格”,价格,字段.存储.是));
doc.add(新文本字段(“store_number”,allstorenumbersastring,Field.store.YES));//这样我就可以查到一个商店的号码
String[]stores=allstorenumbersaString.split(“,”);

对于(int i=0;i每个存储都应该保存在不同的文档中,因此您最终会执行以下操作:

Document doc = new Document();
doc.add(new TextField("productName", productName, Field.Store.YES));
doc.add(new FloatField("price", price, Field.Store.YES));
doc.add(new TextField("store_numbers", allStoreNumbersAsString, Field.Store.YES)); // this way I can look up a single store number
String[] stores = allStoreNumbersAsString.split(",");
for(int i=0; i<stores.length; i++){
    doc.add(new TextField("store_location", stores[i]+ ", " + location, Field.Store.YES));
}
for(Product product: products) {
    for(Store store: product.stores) {
        Document doc = new Document();
        doc.add(new TextField("productName", product.name, Field.Store.YES));
        doc.add(new FloatField("price", price, Field.Store.YES));
        doc.add(new TextField("store", store, Field.Store.YES));
        doc.add(new TextField("location", location, Field.Store.YES));
    }
}

这很有趣,这将支持多个产品?我使用文档来表示一个产品。通过这种方式,我可以看到商店中有哪些产品,以及商店中有哪些产品。这实际上取决于您在结果文档中想要什么,搜索的输入和输出是什么,如果您想搜索一个产品并获得产品列表然后,我猜您还必须为每个产品创建一个文档,即(产品数量*商店数量)文档