Solr突出显示还可以指示返回片段在原始字段中的位置或偏移量吗?

时间:2012-12-13 15:30:31

标签: solr highlighting

背景

使用Solr 4.0.0。我已将一组示例文档的文本编入索引并启用了术语向量,因此我可以使用快速向量突出显示

<field name="raw_text" type="text_en" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />

突出显示我正在使用具有SENTENCE边界的Break Iterator边界扫描器。

<boundaryScanner name="breakIterator" class="solr.highlight.BreakIteratorBoundaryScanner">
    <lst name="defaults">
      <!-- type should be one of CHARACTER, WORD(default), LINE and SENTENCE -->
      <str name="hl.bs.type">SENTENCE</str>
    </lst>
  </boundaryScanner>

我做了一个简单的查询

http://localhost:8983/solr/documents/select?q=raw_text%3AArtibonite&wt=xml&hl=true&hl.fl=raw_text&hl.useFastVectorHighlighter=true&hl.snippets=100&hl.boundaryScanner=breakIterator

突出显示效果相当不错

<response>
...
<result name="response" numFound="5" start="0">
<doc>
  <str name="id">-1071691270</str>
  <str name="raw_text">
     Final Report of the Independent Panel of Experts on the Cholera
     Outbreak in Haiti Dr. Alejando Cravioto (Chair) International
     Center for Diarrhoeal Disease Research, Dhaka, Bangladesh Dr.
     Claudio F. Lanata Instituto de Investigación Nutricional, and
     The US Navy Medical Research Unit 6, Lima, Peru Engr. Daniele
     S. Lantagne Harvard University... ~SNIP~
  </str>
<doc>
<lst name="highlighting">
  <lst name="-1071691270">
    <arr name="raw_text">
      ...
      <str>
        The timeline suggests that the outbreak spread along
        the <em>Artibonite</em> River. After establishing that
        the cases began in the upper reaches of the Artibonite
        River, potential sources of contamination that could have
        initiated the outbreak were investigated.
      </str>
      ...
    </arr>
  </lst>
</lst>

问题

我希望能够发送结果语句以进行进一步处理(实体提取等),但我想跟踪原始(长)文本字段中突出显示的句子的开始/结束偏移。 有直接的方法吗?

设置hl.fragsize以返回整个字段然后以这种方式处理/提取感兴趣的句子会更好吗?

1 个答案:

答案 0 :(得分:3)

除了进行某种自定义外,无法使用突出显示结果返回片段的偏移信息。

你似乎有几个选择:

1)您可以通过创建自定义格式化程序来扩展Solr Highlighter,该格式化程序将偏移信息编码到字符串中。传递给每个术语的Formatter的TokenGroup将具有存储在其中的偏移和位置信息。如果您的格式化程序返回<span data-offset=X>text</span>或类似的东西,那么这将是一种方式。这似乎不是最直接的

2)如你所说,使用hl.fragsize=0返回整个字段。

3)在附加请求中使用TermVectorsComponent,并使用突出显示的片段映射从其返回的偏移/位置信息。

如果您正在进行自己的片段化,那么最好的解决方案可能是在Solr中进行0分段并自行处理。或者,您可以在Java中实现自己的BoundaryScanner实现,以便在分解片段时使用您自己的实体提取专业知识。