2017-05-08 12 views
0

JPAを使ってJava EEフレームワークの全文検索エンジンフレームワークを試しています。非常にきちんとしたHibernate Search機能を提供するHibernateに切り替えたくないので、Apache Luceneから始めます。Apache LuceneでBeanプロパティを検索するにはどうすればいいですか?

私はJPAエンティティの文字列フィールドを検索したいと思っています(インデックスを作成した後、つまり作家/読者の例)。永続化レイヤーをラップしてインデックスを最新の状態に保つために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(...)メソッドを使用してインデックスにあなたの文書をこのライターを使用することができます。

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(); 
    } 
} 

サーチャーコードを検索

フィールドが

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

、以下のような文書に追加することができますが、あなたがフィールド名として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 Beansで動作するためには、Luceneは直接的なサポートをしていないようですが、Solrはこの作業にはかなり簡単です。 –

+0

LuceneはJava APIであり、SOLRは準備が整ったツールなので、必要に応じて選択できます。 Luceneでは、Java Beanのプロパティを使用して独自のクエリビルダをコーディングする必要があります。 –

関連する問題