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