在Lucene邻近查询中检索文本

时间:2014-06-16 21:36:52

标签: solr lucene information-retrieval lucene-highlighter

我使用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, 

1 个答案:

答案 0 :(得分:0)

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

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

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