2016-08-03 7 views
0

私はLucene(5.4.1)MoreLikeThisを使ってテキストをタグ付け(分類)しようとしています。これはうまくいくものですが、結果が悪くなっています。問題はQueryオブジェクトに関連していると思います。Luceneがクエリの用語を制限しています

この例では動作しますが、最高のトップドックは期待したものではありません。クエリオブジェクトをデバッグすると、content:erroのみが表示されます。完全なポルトガル語のフレーズ(この例を参照)から、クエリはただ1つの単語で構成されていました。

私はストップワードまたは他の種類のフィルタを使用していません。

なぜluceneがクエリ用語としてerroをピッキングしているのですか?

は、

try (IndexReader idxReader = DirectoryReader.open(indexDir)) { 
     IndexSearcher indexSearcher = new IndexSearcher(idxReader); 

     MoreLikeThis mlt = new MoreLikeThis(idxReader); 
     mlt.setMinTermFreq(0); 
     mlt.setMinDocFreq(0); 
     mlt.setFieldNames(new String[] { "content" }); 
     mlt.setAnalyzer(analyzer); 

     Reader sReader = new StringReader("Melhorias no controle de sessão no sistema qquercoisa quando expira, ao logar novamente no sistema é exibido o erro "xpto"); 

     Query query = mlt.like("content", sReader); 

     TopDocs topDocs = indexSearcher.search(query, 3); 
} 

答えて

0

まあを検索するには、メインのオブジェクトインデックス

try (IndexWriter indexWriter = new IndexWriter(indexDir, config)) { 
    FieldType type = new FieldType(); 
    type.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS); 
    type.setStored(true); 
    type.setStoreTermVectors(true); 

    Document doc = new Document(); 
    doc.add(new StringField("id", "880b2bbc", Store.YES)); 
    doc.add(new Field("content", "erro", type)); 
    doc.add(new Field("tag", "atag", type)); 

    indexWriter.addDocument(doc); 
    indexWriter.commit(); 
} 

Analyzer analyzer = new PortugueseAnalyzer(); 

Directory indexDir = new RAMDirectory(); 

IndexWriterConfig config = new IndexWriterConfig(analyzer); 
config.setOpenMode(OpenMode.CREATE_OR_APPEND); 

を初期化するには私はMoreLokeThisクラスを調べることにしました。私は答えを見つけました。

Query query = mlt.like("content", sReader);はMoreLokeThisクラスのcreateQueue(Map<String, Int> words)メソッドを呼び出します。

sReader(それはMapに変換されました)のトークン化された用語/単語がインデックスと照合されます。

インデックスに存在する用語/単語のみがクエリの作成に使用されます。

私が提供した例を使用すると、インデックスにはerroという単語のドキュメントのみが含まれているため、これは渡されたフレーズから守られた唯一の単語です。

関連する問題