2017-05-08 46 views
0

我正在嘗試使用JPA的Java EE框架的全文搜索引擎框架,並且不想切換到提供非常整潔的Hibernate搜索功能的Hibernate,因此我現在就從Apache Lucene開始。如何開始使用Apache Lucene搜索bean屬性?

我想通過JPA實體的字符串字段進行搜索(在爲它們創建索引後,即writer/reader示例)。我將使用包裝持久層的EJB來保持索引最新。我認爲我使用JPA和Java EE是無關緊要的。

由於Apache項目沒有一個策略來保持其文檔是最新的,或者至少將其標記爲https://wiki.apache.org/lucene-java/TheBasics以及類似網站中的大多數示例都不適用,因爲類具有和方法已被刪除。對於通過搜索引擎發現的博客文章也是如此。有可能找到它們,但任何發現都需要嘗試,因爲有ca. 90%的變化,人們發現該示例指的是不再存在的類或方法...

我正在尋找任何示例顯示上述用例與最新版本的Lucene 6.5.0 afaik。

+1

所以,你正在尋找創建索引,以及該版本的搜索代碼?我想,你的問題中的JPA部分與你所面對的問題無關,我是否正確? –

回答

0

我不確定6.5中的所有內容都改變了,但下面是Lucene 6.0.0的代碼和6.5.0的編譯/運行。

IndexCreation

import java.io.File; 
import java.io.IOException; 

import org.apache.lucene.analysis.core.SimpleAnalyzer; 
import org.apache.lucene.index.IndexWriter; 
import org.apache.lucene.index.IndexWriterConfig; 
import org.apache.lucene.index.IndexWriterConfig.OpenMode; 
import org.apache.lucene.store.FSDirectory; 

public class IndexCreator { 

    public static IndexWriter getWriter() throws IOException{ 
      File indexDir = new File("D:\\Experiment"); 
      SimpleAnalyzer analyzer = new SimpleAnalyzer(); 
      IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer); 
      indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND); 
      IndexWriter indexWriter = new IndexWriter(FSDirectory.open(indexDir 
       .toPath()), indexWriterConfig); 
      indexWriter.commit(); 
      return indexWriter; 

    } 
} 

現在你可以使用這個作家指數使用writer.updateDocument(...)writer.addDocument(...)方法您的文檔。

字段可以被添加到文件象下面,

doc.add(new Field("NAME", "Tom", new FieldType(TextField.TYPE_STORED))); 

搜索

import java.io.IOException; 
import java.nio.file.Paths; 

import org.apache.lucene.document.Document; 
import org.apache.lucene.index.DirectoryReader; 
import org.apache.lucene.index.IndexReader; 
import org.apache.lucene.index.Term; 
import org.apache.lucene.search.IndexSearcher; 
import org.apache.lucene.search.ScoreDoc; 
import org.apache.lucene.search.TopDocs; 
import org.apache.lucene.search.WildcardQuery; 
import org.apache.lucene.store.FSDirectory; 



public class LuceneSearcher { 

    public static void searchIndex() throws IOException{ 

     IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get("D:\\Experiment"))); 

     IndexSearcher searcher = new IndexSearcher(reader); 

     TopDocs hits = searcher.search(new WildcardQuery(new Term("NAME", "*")), 20); 

     if (null == hits.scoreDocs || hits.scoreDocs.length <= 0) { 
      System.out.println("No Hits1 Found"); 
      return; 
     } 

     System.out.println(hits.scoreDocs.length + " hits1 Docs found !!"); 

     for (ScoreDoc hit : hits.scoreDocs) { 
      Document doc = searcher.doc(hit.doc); 
     } 

     reader.close(); 
    } 
} 

搜索器代碼假定您有NAME索引文檔作爲字段名。

我想,這應該足以讓你開始。

讓我知道你是否需要別的東西。

我有這些Maven依賴,

<dependencies> 

    <dependency> 
      <groupId>org.apache.lucene</groupId> 
      <artifactId>lucene-core</artifactId> 
      <version>6.5.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.lucene</groupId> 
      <artifactId>lucene-analyzers-common</artifactId> 
      <version>6.5.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.lucene</groupId> 
      <artifactId>lucene-queryparser</artifactId> 
      <version>6.5.0</version> 
     </dependency> 
    </dependencies> 
+0

爲了使用Java Bean,需要使用Solr,因爲Lucene似乎沒有直接支持它,但Solr對於此任務非常簡單。 –

+0

Lucene是一個Java API&SOLR是一個現成的工具,因此可以根據自己的需要進行選擇。在Lucene中,您需要使用Java bean屬性編寫自己的查詢生成器。 –