关于apache lucene提供的点击荧光笔我有两个问题:
请参阅this功能 你能解释令牌流参数的使用吗?
我有几个包含许多字段的大型lucene文档,每个字段都包含一些字符串。现在我找到了特定查询最相关的文档。现在发现此文档是因为查询中的多个单词可能与文档中的单词匹配。我想找出查询中的哪些单词导致了这个问题。因此,我计划使用Lucene Hit Highlighter。 示例:如果查询是“皮肤医生德里”并且标题为“皮肤科医生”的文档包含单词“皮肤”和“医生”,那么在点击突出显示之后我应该能够从查询中分离出“皮肤”和“医生”。我已经尝试为此编写代码数周了。无法得到我想要的东西。你能帮帮我吗?
提前致谢。
更新
目前的做法: 我创建了一个包含文档中所有单词的查询。
Field[] field = doc.getFields("description");
String desc = "";
for (int j = 0; j < field.length; ++j) {
desc += field[j].stringValue() + " ";
}
Query q = qp.parse(desc);
QueryScorer scorer = new QueryScorer(q, reader, "description");
Highlighter highlighter = new Highlighter(scorer);
String fragment = highlighter.getBestFragment(analyzer, "description", text);
适用于小型文档,但不适用于大型文档。获得以下堆栈跟踪。
org.apache.lucene.search.BooleanQuery$TooManyClauses: maxClauseCount is set to 1024
at org.apache.lucene.search.BooleanQuery.add(BooleanQuery.java:152)
at org.apache.lucene.queryParser.QueryParser.getBooleanQuery(QueryParser.java:891)
at org.apache.lucene.queryParser.QueryParser.getBooleanQuery(QueryParser.java:866)
at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1213)
at org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1167)
at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:182)
很明显,这种方法对于大型文档来说是不合理的。应该怎么做才能纠正这个问题?
BTW我正在使用FuzzyQuery匹配。
答案 0 :(得分:2)
编辑:添加了一些关于explain()的详细信息。
一些一般性的介绍: Lucene荧光笔旨在从热门文档中查找文本片段, 并突出显示与查询匹配的标记。
Explanation expl = searcher.explain(query, docId);
String asText = expl.toString();
String asHtml = expl.toHtml();
docId是搜索结果中的原始文档ID。
只有在您需要片段和/或突出显示时,才应使用荧光笔。如果您仍想使用荧光笔,请按Nicholas Hrychan's advice。但要注意,他描述了Lucene 2.4.1 API - 如果你使用更高级的版本,你应该使用“QueryScorer”,他说“SpanScorer”。