Я новичок в Lucene, используя Lucene4. Попытка создать индекс для огромной таблицы РСУБД и выполнить поиск по индексу lucene вместо таблицы напрямую. Собранные бит и куски с разных сайтов, попробовали, и индексирование «кажется» работает нормально. Следующие файлы создаются в индексной директории: _uu.fdt
, _uu.fdx
, _uu.fnm
, _uu.si
, segments.gen
, segments_rs
.Lucene4 поиск не работает
Попробовал восстановить запись из сохраненного индекса, но это не сработало. Хит не срабатывает, число попадает в нуль.
Фрагмент кода для создания индекса:
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"));
}
Я не могу найти ошибку в поиске или индексации части.
Любая конкретная причина, по которой вы не используете последнюю доступную версию Lucene? Это может помочь, если вы покажете несколько строк примера и что вы используете для ввода для поиска. – user1071777
@ user2861409 Отвечает ли мой ответ на вашу проблему? – srs
Спасибо большое srs, я могу выяснить ответ, как только я разместил вопрос. Я использовал Index.ANALYZED вместо index.no. Это сработало. Большое спасибо. – user2861409