2013-11-29 5 views
1

Я хочу создать индекс для хранения URL в качестве имени файла и используя:AbstractMethodError при создании индекса в Lucene

Analyzer analyzer = new StandardAnalyzer(); 
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer); 
FSDirectory dir = FSDirectory.open(new File(index)); 
IndexWriter writer = new IndexWriter(dir, config); 

Document doc = new Document(); 
doc.add(newField("file_name", rs.getString("file_name"), 
     Field.Store.YES, 
     Field.Index.ANALYZED)); 
writer.addDocument(doc); 

Однако я получаю следующее исключение:

Exception in thread "main" java.lang.AbstractMethodError: 
     org.apache.lucene.analysis.TokenStream.incrementToken() 
    at org.apache.lucene.index.DocInverterPerField.processFields(DocInverterPerField.java:133) 
    at org.apache.lucene.index.DocFieldProcessorPerThread.processDocument(DocFieldProcessorPerThread.java:248) 
    at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:851) 
    at org.apache.lucene.index.DocumentsWriter.addDocument(DocumentsWriter.java:827) 
    at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:2022) 
    at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1996) 
    at TextIndex1.main(TextIndex1.java:54) 

ответ

-1

Вот как сделать простой указатель для поиска текста с использованием Lucene 4.6

public void indexFilmTitle() { 
    try { 
     Directory dir = FSDirectory.open(new File(AppConstants.INDEX_DIR)); 
     Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46); 
     IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_46, analyzer); 
     iwc.setOpenMode(OpenMode.CREATE); 
     IndexWriter writer = new IndexWriter(dir, iwc); 

     String sql = "SELECT * FROM sakila.film_text"; 
     PreparedStatement ps = con.prepareStatement(sql); 
     ResultSet rs = ps.executeQuery(); 
     int i=0; 
     while (rs.next()) { 
      i++; 
      Document doc = new Document(); 
      Field id = new IntField("id", rs.getInt(1), Field.Store.YES);    
      doc.add(id); 
      Field title = new TextField("title", rs.getString(2), Field.Store.YES); 
      doc.add(title); 
      writer.addDocument(doc); 
     } 
     writer.close(); 
    } catch (IOException ex) { 
     Logger.getLogger(IndexManager.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (SQLException ex) { 
     Logger.getLogger(IndexManager.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

Обратите внимание, что у вас есть TextField.

А вот как искать:

public void searchFromFilm_Text(String keyword) { 
    try { 
     IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(AppConstants.INDEX_DIR))); 
     IndexSearcher searcher = new IndexSearcher(reader); 
     Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46); 
     QueryParser parser = new QueryParser(Version.LUCENE_46, "title", analyzer);    
     Query query = parser.parse(keyword); 
     System.out.println("Searching for: " + query.toString("title")); 
     TopDocs results = searcher.search(query, 100);    
     ScoreDoc[] hits = results.scoreDocs; 
     System.out.println(hits.length); 
     for(ScoreDoc sdoc : hits) 
     { 
      Document doc = searcher.doc(sdoc.doc); 
      System.out.println(doc.get("id")); 
      System.out.println(doc.get("title"));    
     } 
    } catch (IOException ex) { 
     Logger.getLogger(SearchManager.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (ParseException ex) { 
     Logger.getLogger(SearchManager.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

Надеется, что это помогает .....

+0

Я хочу, чтобы текст search.but выше кода только верните, вы даете точное слово для поиска. но я хочу искать, используя только текст. –

+0

Я только что начал ... вероятно, даст вам ответ через несколько часов ... – sanket

+0

Может быть, вы могли бы попробовать это: http://www.javacodegeeks.com/2010/05/introduction-to-apache- lucene-for-full.html – sanket

1

Как правило, абстрактный вызов метода должны быть пойман при компиляции, если это проблема в вашем коде. Это приводит к ошибке во время выполнения, как правило, из-за импорта несовместимых версий jar. Какая версия является версией Lucene jar, которую вы используете?

Смотрите также вопрос: Abstract Method Error

Кроме того, еще одна нота относительно версий Lucene, вы, кажется, использует версию 4.0 или более поздней версии, в этом случае Field конструкторами с использованием Field.Index устарели. Например, вы должны использовать один из подклассов Field, например TextField или StringField.

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