在Lucene 4.3.1中,如何获取所有文档子范围中出现的所有术语

在Lucene 4.3.1中,如何获取所有文档子范围中出现的所有术语,lucene,Lucene,假设一个lucene索引包含字段:日期、内容。 我想得到日期为昨天的文档的所有术语值和频率。日期字段是关键字字段。对内容字段进行分析并编制索引 请帮我提供示例代码。我的解决方案来源如下 /** * * * @param reader * @param fromDateTime * - yyyymmddhhmmss * @param toDateTime * - yyyymmddhhmmss * @return */ stat

假设一个lucene索引包含字段:日期、内容。 我想得到日期为昨天的文档的所有术语值和频率。日期字段是关键字字段。对内容字段进行分析并编制索引


请帮我提供示例代码。

我的解决方案来源如下

/**
 * 
 * 
 * @param reader
 * @param fromDateTime
 *            - yyyymmddhhmmss 
 * @param toDateTime
 *            - yyyymmddhhmmss 
 * @return 
 */
static public String top10(IndexSearcher searcher, String fromDateTime,
        String toDateTime) {
    String top10Query = "";
    try {
        Query query = new TermRangeQuery("tweetDate", new BytesRef(
                fromDateTime), new BytesRef(toDateTime), true, false);
        final BitSet bits = new BitSet(searcher.getIndexReader().maxDoc());
        searcher.search(query, new Collector() {

            private int docBase;

            @Override
            public void setScorer(Scorer scorer) throws IOException {
            }

            @Override
            public void setNextReader(AtomicReaderContext context)
                    throws IOException {
                this.docBase = context.docBase;
            }

            @Override
            public void collect(int doc) throws IOException {
                bits.set(doc + docBase);
            }

            @Override
            public boolean acceptsDocsOutOfOrder() {
                return false;
            }
        });

        //
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43,
                EnglishStopWords.getEnglishStopWords());

        //
        HashMap<String, Long> wordFrequency = new HashMap<>();
        for (int wx = 0; wx < bits.length(); ++wx) {
            if (bits.get(wx)) {
                Document wd = searcher.doc(wx);
                //
                TokenStream tokenStream = analyzer.tokenStream("temp",
                        new StringReader(wd.get("content")));
                // OffsetAttribute offsetAttribute = tokenStream
                // .addAttribute(OffsetAttribute.class);
                CharTermAttribute charTermAttribute = tokenStream
                        .addAttribute(CharTermAttribute.class);
                tokenStream.reset();
                while (tokenStream.incrementToken()) {
                    // int startOffset = offsetAttribute.startOffset();
                    // int endOffset = offsetAttribute.endOffset();
                    String term = charTermAttribute.toString();
                    if (term.length() < 2)
                        continue;
                    Long wl;
                    if ((wl = wordFrequency.get(term)) == null)
                        wordFrequency.put(term, 1L);
                    else {
                        wl += 1;
                        wordFrequency.put(term, wl);
                    }
                }
                tokenStream.end();
                tokenStream.close();
            }
        }
        analyzer.close();

        // sort
        List<String> occurterm = new ArrayList<String>();
        for (String ws : wordFrequency.keySet()) {
            occurterm.add(String.format("%06d\t%s", wordFrequency.get(ws),
                    ws));
        }
        Collections.sort(occurterm, Collections.reverseOrder());

        // make query string by top 10 words
        int topCount = 10;
        for (String ws : occurterm) {
            if (topCount-- == 0)
                break;
            String[] tks = ws.split("\\t");
            top10Query += tks[1] + " ";
        }
        top10Query.trim();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    }
    // return top10 word string
    return top10Query;
}
/**
* 
* 
*@param阅读器
*@param fromDateTime
*-yyyymmddhhmmss
*@param toDateTime
*-yyyymmddhhmmss
*@返回
*/
静态公共字符串top10(IndexSearcher搜索器,字符串fromDateTime,
字符串(toDateTime){
字符串top10Query=“”;
试一试{
Query Query=new TermRangeQuery(“tweetDate”),new BytesRef(
fromDateTime),新BytesRef(toDateTime),true,false;
最终位集位=新位集(searcher.getIndexReader().maxDoc());
search.search(查询,新收集器(){
私人文件库;
@凌驾
公共无效设置记分器(记分器记分器)抛出IOException{
}
@凌驾
public void setnextrader(AtomicReaderContext上下文)
抛出IOException{
this.docBase=context.docBase;
}
@凌驾
公共void collect(int doc)引发IOException{
bits.set(文档+文档库);
}
@凌驾
公共布尔值AcceptsDocSoutoOrder(){
返回false;
}
});
//
Analyzer Analyzer=新的StandardAnalyzer(Version.LUCENE_43,
getEnglishTopWords());
//
HashMap wordFrequency=新HashMap();
对于(int wx=0;wx=0)
打破
字符串[]tks=ws.split(\\t”);
top10Query+=tks[1]+“”;
}
top10Query.trim();
}捕获(IOE异常){
e、 printStackTrace();
}最后{
}
//返回前10个单词字符串
返回TOP10查询;
}

显示您已经尝试过的代码?我可以通过。。。Fields=MultiFields.getFields(searcher.getIndexReader());术语=字段。术语(“内容”);TermsEnum eachTerm=terms.iterator(null);我的临时解决办法是1。获取具有特定日期范围的文档ID,2。通过程序3分析每个文档并确定词频。对频率4进行排序。获取前n个单词。是否有其他仅使用lucene api的解决方案?请让我知道!