2017-04-18 6 views
1

Lucene(Java + Hibernate + Spring + JSF + Lucene)で作業するEDM(電子文書管理/アーカイブ)があります。 処理されるファイルの形式は、XML、DOCX、JPEG、INDD、PDFなどの形式になります。 全文索引作成後、すべてのファイルがアーカイブされます。Luceneインデックスに記録されたキーワードにアクセスするにはどうすればよいですか?

検索はWebページによって実行できます。ユーザーはキーワードを入力し、Lucene + Hibernateはそれらのキーワードを含む索引付けされたすべての文書を表示します。私が望む何

は、彼らが興味のあるキーワードに対して可能ユーザーのサブスクライブを行うためにはLuceneがインデックスを作成したすべてのキーワードを知ることです。実際に

、ユーザーが持つすべての文書を知りたい場合は "フランス "というキーワードを使うと、彼はウェブページ上で検索を行う必要があります。 私が望むのは、ユーザーが "フランス"キーワードを購読することです。このキーワードを持つ文書が索引付けされると、ユーザーは、自分が購読しているキーワードがどの文書に含まれているかを知らせる通知を受け取ります。

しかし、Luceneのインデックスを調べて、特定のキーワードに対するLuceneのカウントが変化したことを検出する方法もわかりません。

誰かに私にそのことを教えてもらえますか?

Thanx。

+0

インデックス作成プロセスを実行するたびに購読対象のキーワードすべての検索を再開するのは簡単ではないでしょうか? –

答えて

0

は、あなたは彼らが表示される文書の数にマッピングされたインデックス内のすべての用語を含む地図を構築することができます。

  1. それLuceneの用語はほとんどのキーワードをと考えることはできないがあることに注意してください。
  2. インデックスのサイズによっては、このマップがかなり大きくなることがあります。

あなたのデータに応じて、あなたはおそらく、手動またはいくつかのアルゴリズム(例えば20最も頻繁項)により、nは最高の用語/キーワードを選択する必要があります。

IndexReader reader = ..... // Open your index 

// Create a new HashMap, mapping Terms to doc frequency 
Map<String,Integer> allTerms = new HashMap<String,Integer>(); 

// Iterate over all fields of your documents 
Fields fields = MultiFields.getFields(reader); 
for (String field : fields) { 
    Terms terms = fields.terms(field); 
    TermsEnum termsEnum = terms.iterator(); 

    // Iterate over all terms for the current field 
    for(BytesRef br = termsEnum.next(); br != null; br = termsEnum.next()) { 
     // Put the term and the number of occurrences into the map. 
     allTerms.put(br.utf8ToString(), termsEnum.docFreq()); 
    } 
} 
+0

@ philipp-ludwigありがとうございました 私はそれをまだテストしていませんでしたが(それはフランスの後期では静かです)、辞書に疑問を抱く方法を発見するのは非常に面白いです。 私はすべての用語がトークン/単語の塊であるため「読みやすい」ものではないことを理解します。 – Lovegiver

+0

私は、最も頻繁ではないものを選択する方法を見つけなければなりません!! 難しいことの1つは、辞書自体の変更を検出することです。単語が辞書に追加されたときにアラートをトリガーする方法はありますか?何か変わったのはどうやって見ることができますか? – Lovegiver

+0

さて、ドキュメントを追加して古いバージョンと新しいバージョンの違いを確認した後で、おそらくマップを再度ビルドする必要があります。 –

関連する問題