使用Lucene SpanQueries进行句子感知搜索

JnB*_*ymn 6 lucene search sentence

是否可以使用Lucene SpanQuery查找所有出现"red""green"和"blue"都出现在单个句子中的事件?

我的第一个(不完整/不正确)方法是编写一个分析器,将一个特殊的句子标记标记和一个句子的开头放在与该句子的第一个单词相同的位置,然后查询类似于以下内容的内容:

SpanQuery termsInSentence = new SpanNearQuery(
  SpanQuery[] {
    new SpanTermQuery( new Term (MY_SPECIAL_SENTENCE_TOKEN)),
    new SpanTermQuery( new Term ("red")),
    new SpanTermQuery( new Term ("green")),
    new SpanTermQuery( new Term ("blue")),
  },
  999999999999,
  false
);

SpanQuery nextSentence = new SpanTermQuery( new Term (MY_SPECIAL_SENTENCE_TOKEN));

SpanNotQuery notInNextSentence = new SpanNotQuery(termsInSentence,nextSentence);
Run Code Online (Sandbox Code Playgroud)

当然,问题在于nextSentence它不是真正的下一个句子,它是任何句子标记,包括句子中termsInSentence匹配的句子.因此这不起作用.

我的下一个方法是创建分析器,将令牌放在句子之前(即第一个单词之前,而不是在与第一个单词相同的位置).这个问题是我必须考虑由此引起的额外偏移MY_SPECIAL_SENTENCE_TOKEN.更重要的是,当我使用天真模式来分割句子(例如拆分/\.\s+[A-Z0-9]/)时,这将特别糟糕,因为当我搜索USS Enterprise时,我将不得不考虑所有(错误)句子标记.

那么......我该怎么做呢?

Mar*_*her 1

我会将每个句子索引为 Lucene 文档,其中包括一个标记该句子来自哪个源文档的字段。根据您的源材料,句子/LuceneDoc 的开销可能是可以接受的。