在Lucene 5.3中给定固定字段值的术语频率

时间:2016-05-26 09:31:06

标签: java lucene

在Lucene 5.3中给定固定字段值计算术语频率的最佳方法是什么?

我想构建一些数据图表,显示一个术语在我的文档中显示的频率,该文档分配了一个日期字段(数字字段:yyyyMMdd)。我将使用ChartJS这样的框架制作折线图。

制作正常的Lucene查询并计算命中率是否更好?还是有更有效的方法来执行此操作? (我查看了PostingsEnum,但我找不到设置日期字段值的简单方法)

我有这样的事情:

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

但我不喜欢它,因为我认为订购数据制作图表会非常昂贵(因为我没有过滤日期)。

有什么想法吗?

更新

我希望我能澄清一下这个问题......

输入:“text”我想在“内容”字段中搜索。 “date1,date2”我在“date”字段中接受的时间段。

输出:与文本匹配的文档数量及其日期介于两个日期之间(或者我可以管理一个日期并进行迭代)。

我现在能想到的简单方法和唯一的解决方案是像往常一样构建我的查询,我认为这是一种浪费,因为我只想要点击次数。

1 个答案:

答案 0 :(得分:0)

您可以从IndexReader.totalTermFreq获取给定字词的总字词频率(即整个索引的频率):

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