Lucene4搜索无法正常工作

时间:2015-10-23 15:00:53

标签: java search indexing lucene

我是Lucene的新手,使用Lucene4。尝试为巨大的RDBMS表创建索引,并直接从lucene索引而不是表中搜索。收集了来自不同网站的点点滴滴,尝试了它并编制索引"似乎"工作正常。以下文件在索引目录中创建:_uu.fdt_uu.fdx_uu.fnm_uu.sisegments.gensegments_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"));             
}

我无法在搜索或索引部分中找到错误。

2 个答案:

答案 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 ?!。感谢。