2017-09-25 15 views
1

私はLuceneで新しく、範囲内で文字列フィールドを検索可能にすることにいくつか問題があります。luceneの文字列フィールドの範囲を検索可能にする

私は、いくつかの文字列フィールドで構成されるドキュメントを持っています。一つは、フォーム

1.0、1.1、1.0-RC1 ...すなわちMAJOR.MINOR(-RCX)

バージョン文字列は、バッキングJavaクラスを持っている(版)実装を持っているCAバージョンです。匹敵します。

私のアナライザは、LowerCaseおよびWhiteSpaceアナライザで、アナライザラッパです。私は古典的なクエリパーサーで検索します。正確な条件での検索はうまく動作します。

クエリ:

は、私は何をできるようにしたいことはこれです "バージョン:[1.5 TO 1.0-RC1]" - リストの間でバージョンが一致するすべての文書と二つの値

含みます

psuedoquery:「someField:値とバージョン:最新」 - リストのすべての文書someField =値は、最新バージョン

私は何をしようとしたことは、インデックスの前にint型に私のバージョン文字列を変換することですが、クエリを有します入力を変換する必要がありますなんとなく、バージョン文字列は検索前にintになります。私は3次元でIntPointを実験しましたが、それはどこにもありませんでした。

バージョンフィールドのカスタムアナライザを実装する必要があるようですが、同様の例を見つけるのに問題があります。

誰かが正しい方向に私を指すことができたらそれはすばらしいでしょう!

ありがとうございます!

答えて

0

あなたはLuceneバージョンについて言及していないので、私は最新バージョン(> = 6.0.0)を想定しています。

TermRangeQueryあなたのニーズに適しているようですが、これまでこのクラスを使用していませんでした。

私は以下のサンプルプログラムを試してみましたが、それは私に希望の結果を与えるようです。以下のコードを使用する場合は、希望のルーメンジャーを入れてください。

package lucene.productversion; 

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.lucene.analysis.Analyzer; 
import org.apache.lucene.analysis.core.SimpleAnalyzer; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.document.Field.Store; 
import org.apache.lucene.document.StringField; 
import org.apache.lucene.index.DirectoryReader; 
import org.apache.lucene.index.IndexReader; 
import org.apache.lucene.index.IndexWriter; 
import org.apache.lucene.index.IndexWriterConfig; 
import org.apache.lucene.index.IndexWriterConfig.OpenMode; 
import org.apache.lucene.search.IndexSearcher; 
import org.apache.lucene.search.Query; 
import org.apache.lucene.search.ScoreDoc; 
import org.apache.lucene.search.TermRangeQuery; 
import org.apache.lucene.search.TopDocs; 
import org.apache.lucene.store.FSDirectory; 


public class App 
{ 
    private static String versionField = "version"; 

    public static void main(String[] args) throws IOException 
    { 
     App app = new App(); 

     System.out.println("Staring Product Version!"); 

     File indexDir = new File("D:\\experiments"); 
     FSDirectory directory = FSDirectory.open(indexDir.toPath()); 

     Analyzer analyzer = new SimpleAnalyzer(); 

     app.index(analyzer, directory); 

     app.search(analyzer, directory); 

     System.out.println("End Product Version!"); 

    } 

    private void search(Analyzer analyzer,FSDirectory directory) throws IOException{ 

     IndexReader reader = DirectoryReader.open(directory); 
     IndexSearcher searcher = new IndexSearcher(reader); 

     Query query = TermRangeQuery.newStringRange(versionField, "1.0", "2.1-RC2", true, true); 

     TopDocs topDocs = searcher.search(query, 10); 


     if(topDocs.totalHits <= 0){ 
      System.out.println("No Hits Found"); 
      return; 
     } 

     for(ScoreDoc doc:topDocs.scoreDocs){ 
      System.out.println("Doc Id :"+doc.doc+" Version Number :"+searcher.doc(doc.doc).get(versionField)); 
     } 

     reader.close(); 

     System.out.println("Searching Completed"); 
    } 

    private void index(Analyzer analyzer,FSDirectory directory) throws IOException{ 

     IndexWriterConfig config = new IndexWriterConfig(analyzer); 

     config.setOpenMode(OpenMode.CREATE); 

     IndexWriter writer = new IndexWriter(directory, config); 


     for(String version:versions()){ 
      Document doc = new Document(); 

      doc.add(new StringField(versionField,version,Store.YES)); 

      writer.addDocument(doc); 

     } 

     writer.commit(); 
     writer.close(); 

     System.out.println("Indexing Completed"); 
    } 

    private List<String> versions(){ 

     List<String> versions = new ArrayList<>(); 

     versions.add("1.0"); 
     versions.add("1.0-RC1"); 
     versions.add("1.1"); 
     versions.add("1.2"); 
     versions.add("2.1-RC1"); 
     versions.add("2.1-RC2"); 
     versions.add("2.1-RC3"); 
     versions.add("3.1-RC1"); 
     versions.add("3.1"); 

     return versions; 
    } 
} 
関連する問題