当前位置: 首页 > 面试题库 >

在lucene中使用热门荧光笔

闻鹤龄
2023-03-14
问题内容

关于apache lucene所提供的热门荧光笔,我有两个问题:

  1. 请参阅此功能,您能否解释令牌流参数的使用。

  2. 我有几个包含多个字段的大型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荧光笔旨在从匹配文档中查找文本片段,并突出显示与查询匹配的标记。

  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-如果使用更高级的版本,则应在他说“ SpanScorer”的地方使用“
QueryScorer”。



 类似资料:
  • 问题内容: 我一直在使用Lucene的(Java)Highlighter(在Sandbox程序包中)。但是,在搜索结果中匹配正确的词时,这并不是非常准确- 它适用于简单的查询,例如,搜索两个单独的单词会在结果中突出显示两个代码片段。 但是,它不适用于更复杂的查询。在最简单的情况下,短语查询(例如“ Stack Overflow”)将匹配突出显示中所有出现的Stack或Overflow,这给用户留下

  • 问题内容: 我使用突出显示Java文本窗格中的文本。我要删除所有突出显示(突出显示可能不止一个字符串),并希望它返回已删除突出显示的字符串的位置,因此显然我不能使用 有人可以帮忙吗?谢谢 问题答案: 怎么样

  • 我一直在尝试将语法高亮显示与tkinter文本小部件结合起来。然而,使用这篇文章中的代码,我无法让它工作。没有错误,但文本不会高亮显示,并且在每个字符后跳过一行。如果有更好的方法将语法高亮显示与tkinter文本小部件结合起来,我很乐意听到。下面是我能找到的复制问题的最小代码: 到目前为止,我还没有找到解决这个问题的方法(否则我不会在这里发帖)。关于语法突出显示tkinter文本小部件的任何帮助都

  • 1.1.1. 1.我教的一门课程,开设了多个班级,需要创建多个课堂吗? 一个慕课堂即对应一个教学班(课头)。如果几个班级(自然班或行政班)学生合在一起同时上课,只需要创建一个慕课堂。如果几个班级是分别上课,需要创建多个慕课堂。 1.1.2. 2.我教的一门课程,多个行政班混合在一起同时上课,需要创建多个课堂吗? 不需要,只需创建一个课堂,在课堂内利用分组查看各行政班的学生成绩。 1.1.3. 3.

  • 问题内容: 首先,对于本文的篇幅,我深表歉意,因为我想提供足够详细的信息。 我正在尝试完善我在R中编写的抓取应用程序以获取Disqus评论。到目前为止,我可以使用各种RSelenium功能获得特定页面上的所有评论。我现在想做的是从发布的评论中获取某种树状结构,即首先获取最上面的评论,然后检查这些评论中是否有任何子代。我作为示例使用的网站上的特定页面总共有34条评论,但其中只有18条是最高的。其余都

  • 问题内容: 我想在lucene项目中使用WikipediaTokenizer- http://lucene.apache.org/java/3_0_2/api/contrib- wikipedia/org/apache/lucene/wikipedia/analysis/WikipediaTokenizer.html 但我从未使用过Lucene。我只想将Wikipedia字符串转换为令牌列表。但是