2017-05-08 43 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属性编写自己的查询生成器。 –