我正在使用他们的推文为Twitter用户构建Lucene索引。我的想法是用他的推文存储关于用户(姓名,描述,ecc)的信息,代码如下:
for (Map.Entry<Long, User> entry : users.entrySet()) {
User user = entry.getValue();
Document document = new Document();
document.add(new LongField("id", user.getId(), Field.Store.YES));
document.add(new StringField("name", user.getName(), Field.Store.YES));
document.add(new StringField("username", user.getUsername(), Field.Store.YES));
for (UserTweet t : user.getTweets()) {
document.add(new TextField("tweet", t.getText(), Field.Store.YES));
}
writer.addDocument(document);
}
这里的文档可以在&#34; tweet&#34;中发布很多推文。领域。 此字段使用的分析器是EnglishAnalyzer。
此方法是否正确存储推文?
我的问题是当我设置荧光笔以检索匹配的推文时。如果我搜索所有存储用户的所有推文中存在的术语,结果我得到所有用户(正确!),但如果我想查看与查询匹配的单个用户的所有推文(带有荧光笔)我只得到每个用户的第一条推文而不是全部。
这是我用来搜索的代码:
BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
QueryParser queryParserKeywords = new QueryParser("tweet", new EnglishAnalyzer());
String strQueryKeywords = "";
for (String s : c.getValue().split(" "))
strQueryKeywords += "tweet:"+ s +" OR ";
strQueryKeywords = strQueryKeywords.substring(0, strQueryKeywords.lastIndexOf("OR"));
Query queryKeywords = queryParserKeywords.parse(strQueryKeywords);
QueryScorer queryScorerKeywords = new QueryScorer(queryKeywords, "tweet");
Fragmenter fragment = new SimpleSpanFragmenter(queryScorerKeywords, 150);
keywordsHighlighter = new Highlighter(queryScorerKeywords);
keywordsHighlighter.setTextFragmenter(fragment);
booleanQuery.add(queryKeywords, BooleanClause.Occur.SHOULD);
... (other boolean clause over other fields)
searcher.search(booleanQuery.build(), collector);
...
for (ScoreDoc doc : collector.topDocs().scoreDocs) {
Document d = searcher.doc(doc.doc);
TokenStream tokenStream = new EnglishAnalyzer().tokenStream("",d.getField("tweet").stringValue());
TextFragment[] fragments = keywordsHighlighter.getBestTextFragments(tokenStream, d.getField("tweet").stringValue(), false, 10);
for (TextFragment fragment : fragments) {
System.out.println(" - " + fragment.toString());
}
}
我的代码出了什么问题?
最后,搜索具有不同文本的多个字段(例如:City = New York,Keyword = Star Wars,ecc。),使用BooleanQuery是否正确或存在更好的解决方案?
非常感谢。