Lucene:BestTextFragments只返回第一个文档

时间:2015-12-21 21:32:07

标签: java search twitter indexing lucene

我正在使用他们的推文为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是否正确或存在更好的解决方案?

非常感谢。

0 个答案:

没有答案