2015-10-23 3 views
-2

Я новичок в 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"));    
} 

Я не могу найти ошибку в поиске или индексации части.

+0

Любая конкретная причина, по которой вы не используете последнюю доступную версию Lucene? Это может помочь, если вы покажете несколько строк примера и что вы используете для ввода для поиска. – user1071777

+0

@ user2861409 Отвечает ли мой ответ на вашу проблему? – srs

+0

Спасибо большое srs, я могу выяснить ответ, как только я разместил вопрос. Я использовал Index.ANALYZED вместо index.no. Это сработало. Большое спасибо. – user2861409

ответ

1

С Lucene, если вы хотите, чтобы ваше поле было «доступно для поиска», вы должны создать поле с . В вашем примере все заявления new Field(...) имеют Index.NO параметр. Изменить его на Index.YES только для поля, которое вы хотите найти.

Вы можете также использовать TextField вместо общего поля с .

0

Проблема разрешена только сейчас. Я использовал Index.ANALYZED, создавая поле [добавление в документ] вместо использования Index.NO. Как указано в SRS, также будет работать Index.YES. Это поднимает мне новый вопрос; В Lucene я должен отметить Index.YES/Index.ANALYZED, чтобы сделать поле поиска доступным. Итак, в каком случае кто-то захочет создать поле с отключенным доступом? Мы используем Lucene, храним документы/поля, чтобы их искать, поэтому в прецеденте мы используем Index.No?!. Благодарю.

Смежные вопросы