2016-05-26 8 views
0

Lucene 5.3で固定フィールド値を指定すると、用語頻度を計算する最良の方法は何でしょうか?Luceneの固定フィールド値が与えられた用語頻度5.3

日付フィールドが割り当てられている(数字フィールド:yyyyMMdd)という用語がドキュメントに表示される頻度を示すデータチャートを作成したいと考えています。 ChartJSのようなフレームワークを使って折れ線グラフを作成します。

通常のLuceneクエリを作成し、ヒット数をカウントする方が良いですか、それとも効率的な方法がありますか?

public List<LocalDate> getDataFrequencyOpc(String text) { 
    List<LocalDate> result = new ArrayList<LocalDate>(); 
    IndexReader indexReader = DirectoryReader.open(directory); 
    PostingsEnum postingsEnum = MultiFields.getTermDocsEnum(indexReader, "content", new BytesRef("text")); 
    int i; 
    while((i = postingsEnum.nextDoc()) != PostingsEnum.NO_MORE_DOCS) { 
     Document doc = indexReader.document(i); 
     LocalDate auxDate = LocalDate.parse(doc.getField("date").numericValue().toString()); 
     result.add(auxDate); 
    } 
    return result; 
} 

しかし、私は思うので、私はそれを好きではない:私はこのような何かを持っている

(私はPostingsEnumに見てきたが、私は、日付フィールドの値を設定する簡単な方法を見つけることができませんでした)チャートを作成するためにデータを注文するのは本当にコストがかかるでしょう(私の日付をフィルタリングしないので)。

アイデア?

UPDATE

私は少しに質問を明確にすることを願って...

入力:「テキスト」私は、フィールド「コンテンツ」で検索します。 "date1、date2"フィールド "date"に私が受け入れる期間。

出力:テキストと一致するドキュメントの数とその日付は両方の日付の間にあります(あるいは、1つの日付と繰り返しで管理できます)。

私が今思う簡単な方法と唯一の解決策は、私が通常行っているように私のクエリを構築することです。ヒット数がほしいから浪費だと思います。

+0

を、クエリを実行すると、確かに正しいアプローチです。無駄な限り、クエリを実行するだけでドキュメントの内容を取得するコストは発生しません。すべてのコストが、クエリに一致するドキュメントを決定することです。 – femtoRgon

+0

それから私はそれが答えであるべきだと思います。私はこれにどのように対処しますか?私は自分の質問に答えることができなかったと感じました。 :| – Anna

答えて

0

あなたはIndexReader.totalTermFreqから与えられた期間の総用語頻度(つまり、インデックス全体にわたる周波数である)を得ることができます。その場合は

myReader.totalTermFreq(new Term("date", myDateValue)); 
+0

ありがとう!しかし、私は複数の制限でそれをしたい。 – Anna

関連する問題