java – 在lucene中使用hit highlighter

关于使用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)

很明显,这种方法对于大型文档来说是不合理的.应该怎么做才能纠正这个问题?

顺便说一下,我正在使用FuzzyQuery匹配.

解决方法:

编辑:添加了一些关于explain()的细节.

一些一般介绍:
Lucene荧光笔旨在从热门文档中查找文本片段,
并突出显示与查询匹配的标记.

>因此,TokenStream参数用于将命中文本分解为标记.然后,荧光笔的得分者对每个标记进行评分,以便对片段进行评分并选择要突出显示的片段和标记.
>我相信你做错了.如果您只想了解文档中匹配的查询字词,则应使用explain()方法.
基本上,在您实例化搜索者之后,请使用:

说明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”.

上一篇:如何从Lucene的文档术语向量中获取位置?


下一篇:Lucene索引库的维护功能实现