如何使用Lucene存储值对

时间:2014-01-17 20:01:37

标签: java lucene

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

例如,在商店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));
}

我正在寻找的是在索引中存储(商店编号,商店中的位置)值对,但在某种程度上我可以按商店编号查询然后获取商店中与该产品对应的位置。

添加这些字段以实现此目的的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

每个商店都应保存在不同的文档中,因此您最终会执行以下操作:

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));
    }
}