0

我正在使用 Lucene 来索引一组句子。我的查询有两个“实体”,我创建了一个这样的邻近查询:

"EntityA EntityB"~22 

我想检索包含这两个实体的所有句子,最大范围为 22 个字符。现在我想使用 Lucene Highlighter 来检索两个实体之间的单词。我正在使用这样的代码将内容拆分为片段,但我不知道如何将片段设置在两个实体之间的精确点。

for (int i = 0; i < numTotalHits; i++) {
            int id = hits[i].doc;
            Document doc = searcher.doc(hits[i].doc);
            String text = doc.get("content");
            TokenStream tokenStream = TokenSources.getAnyTokenStream(searcher.getIndexReader(), id , "content", analyzer);
            String[] frag = getFragmentsWithHighlightedTerms(analyzer, query, "content", text, 10, 10);

            for (int j = 0; j < frag.length; j++) {
                    System.out.println((frag[j].toString()));
            }

我的目标是检索实体内的文本,例如:

entity1 --> Canada
entity2 --> Ottawa
sentence --> Natural Resources Canada, Canadian Forest Service, Ottawa.
result --> , Canadian Forest Service, 
4

1 回答 1

0

据我所知,“foo bar”~22 语法将创建一个带有 22 斜率的短语查询。22 指定最多可以有 22 次移动,以使 2 个令牌以与查询中相同的顺序彼此靠近。22 步将涉及与其他标记交换位置,并且与标记长度无关(在此上下文中,标记表示单词)。

一旦您使用短语查询检索相关结果,我认为没有任何可靠的方法可以获取 2 个实体之间的整个片段。

如果您可以自己构建查询对象,我实际上会自己使用正则表达式查询,因为您已经提到了 22 个字符范围,并在此突出显示。然后,您可以轻松地从突出显示的文本中修剪 2 个实体。

于 2014-06-17T08:05:34.473 回答