有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在lucene中使用hit highlighter的java

关于apache lucene提供的hit highlighter,我有两个问题:

  1. 参见this函数 您能解释一下令牌流参数的用法吗

  2. 我有几个大型lucene文档,其中包含许多字段,每个字段中都有一些字符串。现在,我找到了与特定查询最相关的文档。现在找到了此文档,因为查询中的几个单词可能与文档中的单词匹配。我想找出查询中的哪些词导致了这种情况。因此,我计划使用Lucene Hit Highlighter。 示例:如果查询是“skin doctor delhi”,并且标题为“皮肤科医生”的文档包含“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)

显然,这种方法对于大型文档是不合理的。应该采取什么措施来纠正这一点

顺便说一句,我使用模糊查询匹配


共 (1) 个答案

  1. # 1 楼答案

    编辑:添加了一些关于explain()的详细信息

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

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

    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”