我是Lucene的新手,使用Lucene4。尝试为巨大的RDBMS表创建索引,并直接从lucene索引而不是表中搜索。收集了来自不同网站的点点滴滴,尝试了它并编制索引"似乎"工作正常。以下文件在索引目录中创建:_uu.fdt
,_uu.fdx
,_uu.fnm
,_uu.si
,segments.gen
,segments_rs
。
尝试从存储的索引中检索记录但它不起作用。命中失败,命中计数返回零。
用于创建索引的代码段:
ResultSet rs = stmt.executeQuery("SELECT product_id, product_name, brand_id, brand_name, price, screen_type, size_category, usage_category FROM mobile_product_master WHERE product_id like 'No0%'");
Directory storeIndexDirectory = FSDirectory.open(new File("E:\\index_dir"));
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_40, new StandardAnalyzer(Version.LUCENE_40));
while(rs.next())
{
productId = rs.getString("product_id");
productName = rs.getString("product_name");
brandId = rs.getString("brand_id");
brandName = rs.getString("brand_name");
price = rs.getString("price");
screenType = rs.getString("screen_type");
sizeCategory = rs.getString("size_category");
usageCategory = rs.getString("usage_category");
//doc = new Document(new Field());
doc = new Document();
doc.add(new Field("product_id",productId,Store.YES,Index.NO));
doc.add(new Field("product_name",productName,Store.YES,Index.NO));
doc.add(new Field("brand_id",brandId,Store.YES,Index.NO));
doc.add(new Field("brand_name",brandName,Store.YES,Index.NO));
doc.add(new Field("price",price,Store.YES,Index.NO));
doc.add(new Field("screen_type",screenType,Store.YES,Index.NO));
doc.add(new Field("size_category",sizeCategory,Store.YES,Index.NO));
doc.add(new Field("usage_category",usageCategory,Store.YES,Index.NO));
indexWriter = new IndexWriter(storeIndexDirectory, indexWriterConfig);
indexWriter.addDocument(doc);
indexWriter.close();
doc = null;
}
搜索代码段:
String queryString = arg[0];
Directory storeIndexDirectory = FSDirectory.open(new File("E:\\index_dir"));
IndexReader indexReader = IndexReader.open(storeIndexDirectory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
QueryParser parser = new QueryParser(Version.LUCENE_40,"product_id",new StandardAnalyzer(Version.LUCENE_40));
Query query = parser.parse(queryString);
TopDocs topDocs = indexSearcher.search(query,1000);
ScoreDoc[] hits = topDocs.scoreDocs;
System.out.println(hits.length);
for(int i=0;i < hits.length; i++)
{
int docId = hits[i].doc;
Document d = indexSearcher.doc(docId);
System.out.println(d.get("product_id") + "," + d.get("product_name") + "," + d.get("brand_id") + "," + d.get("brand_name") + "," + d.get("price") + "," + d.get("screen_type") + "," + d.get("size_category") + "," + d.get("usage_category"));
}
我无法在搜索或索引部分中找到错误。
答案 0 :(得分:1)
如果您希望自己的字段“可搜索”,则使用Lucene,您必须使用 Index.YES
创建一个字段。
在您的示例中,所有new Field(...)
语句都包含 Index.NO
参数。
将其更改为 Index.YES
仅适用于您要搜索的字段。
您还可以使用TextField代替通用字段 Index.YES
。
答案 1 :(得分:0)
问题现已解决。我在创建字段[添加到文档]时使用了Index.ANALYZED而不是使用Index.NO。正如SRS指出的那样,Index.YES也会起作用。 这给我提出了一个新问题;在Lucene中,我必须标记Index.YES / Index.ANALYZED以使该字段可搜索。那么有人希望用可搜索的禁用创建一个字段是什么情况呢?我们使用Lucene,存储docs / fields来搜索它,以便在哪个用例中我们使用Index.No ?!。感谢。