我们使用 Solr 来存储带有关键字的文档;每个关键字都与文档中的一个范围相关联。
关键字是在将它们加载到 Solr 之前通过一些花哨的分析和/或手动工作生成的。一个关键字可以在文档中重复多次。另一方面,单个文档中同一字符串的不同实例可以使用不同的关键字连接。
例如这个文档
Bill studied The Bill of Rights last summer.
可以伴随以下关键字(括号内为偏移量):
William Brown (0:4)
legal term (13:31)
summer 2011 (32:43)
(显然在其他文档中,比尔可以指比尔·克林顿或比尔·盖茨。同样,去年夏天> 将在不同的文件中引用不同的年份。我们确实拥有所有文件的所有这些信息。)
我知道文档可以有一个字段,例如KEYWORD,它将存储William Brown
。然后,当我搜索 William Brown
时,我将得到上述文档。那部分很容易。
但我不知道如何存储 William Brown
对应于文本范围 0:4
的信息,以便我可以突出显示第一个 Bill
,但不是第二个。
我想我可以使用TermVectors ,但我不确定是否/如何存储自定义偏移量。我认为这是一个相当常见的情况......
编辑:经过编辑以明确 Bill 可以在不同文档中引用不同的人/事。
EDIT2:经过编辑以明确文档可以包含同音异义词(具有不同含义的相同字符串)。
最佳答案
两个 Q Monte
解决方案优点:
- 注释与源文档逻辑存储
- 无需了解荧光笔实现或自定义 Java 荧光笔开发
- 由于所有自定义都发生在 Solr 之外,因此该解决方案应该向前兼容 future 的 Solr 版本。
解决方案的缺点:
- 需要运行两个查询
- 需要搜索客户端中的代码将一个查询的结果合并到另一个查询中。
使用 Solr 4.8+,您可以在每个主文档(文本)下面嵌套子文档(注释)...
curl http://localhost:8983/solr/update/json?softCommit=true -H 'Content-type:application/json' -d '
[
{
"id": "123",
"text" : "Bill studied The Bill of Rights last summer.",
"content_type": "source",
"_childDocuments_": [
{
"id": "123-1",
"content_type": "source_annotation",
"annotation": "William Brown",
"start_offset": 0,
"end_offset": 4
},
{
"id": "123-2",
"content_type": "source_annotation",
"annotation": "legal term",
"start_offset": 13,
"end_offset": 31
},
{
"id": "123-3",
"content_type": "source_annotation",
"annotation": "summer 2011",
"start_offset": 32,
"end_offset": 43
}
]
}
]
...使用 block 连接来查询注释。
1)注释查询:http://localhost:8983/solr/query?fl=id,start_offset,end_offset&q={!child of=content_type:source}注释:"威廉·布朗”
"response":{"numFound":1,"start":0,
"docs":[
{
"id": "123-1",
"content_type": "source_annotation",
"annotation": "William Brown",
"start_offset": 0,
"end_offset": 4
}
]
}
将这些结果存储在您的代码中,以便您可以在下一个查询返回后折叠注释偏移量。
2)源查询+突出显示:http://localhost:8983/solr/query?hl=true&hl.fl=text&fq=content_type:source&q=text:"William Brown"或 ID:123
(注释查询中发现的 id:123 被或运算到第二个查询中)
"response":{"numFound":1,"start":0,
"docs":[
{
"id": "123",
"content_type": "source",
"text": "Bill studied The Bill of Rights last summer."
}
],
"highlighting":{}
}
注意:在此示例中,没有返回突出显示信息,因为搜索词与任何 content_type:source
文档都不匹配。然而,我们有第一个查询的显式注释和偏移量!
然后,您的客户端代码需要获取第一个查询的 content_type:source_annotation
结果,并手动将突出显示标记插入到第二个查询的 content_type:source
结果中。
有关 Yonik's blog here 的更多 block 加入信息.
关于solr - 卢森/Solr : Store offset information for certain keywords,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34122982/