3

关于 apache lucene 提供的命中荧光笔,我有两个问题:

  1. 看到这个函数你能解释一下令牌流参数的使用吗?

  2. 我有几个包含许多字段的大型 lucene 文档,每个字段中都有一些字符串。现在我找到了与特定查询最相关的文档。现在找到了这个文档,因为查询中的几个单词可能与文档中的单词匹配。我想找出查询中的哪些单词导致了这种情况。所以为此我打算使用 Lucene Hit Highlighter。示例:如果查询是“skin doctor delhi”并且标题为“dermatologist”的文档包含“skin”和“doctor”这两个词,那么在点击突出显示后,我应该能够从查询中分离出“skin”和“doctor”。几个星期以来,我一直在尝试为此编写代码。无法得到我想要的。请问你能帮帮我吗?

提前致谢。

更新:

当前方法:我创建一个包含文档中所有单词的查询。

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 匹配。

4

1 回答 1

2

编辑:添加了一些关于解释()的细节。

一些一般性介绍:Lucene Highlighter 旨在从命中文档中查找文本片段,并突出显示与查询匹配的标记。

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

Explanation expl = searcher.explain(query, docId);

String asText = expl.toString();

String asHtml = expl.toHtml();

docId 是搜索结果中的原始文档 ID。

只有当您确实需要片段和/或亮点时,您才应该使用荧光笔。如果您仍想使用荧光笔,请遵循Nicholas Hrychan 的建议。不过要当心,因为他描述了 Lucene 2.4.1 API - 如果您使用更高级的版本,您应该使用 "QueryScorer" 他说 "SpanScorer" 。

于 2010-03-10T12:07:58.880 回答