solr - 卢森/Solr : Store offset information for certain keywords

标签 solr lucene

我们使用 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/

相关文章:

在 Solr 中搜索多值字段为空或具有特定值的文档

solr - 有没有办法用不同的配置文件运行 NUTCH?

solr - 如何在Solr 3.3中实现mod功能

django - Solr 搜索问题

Python文件索引和搜索

java - Lucene - 打开一个关闭的 IndexWriter

elasticsearch - 允许在Elasticsearch中标记基于Hypen的单词

java - 创建基于 solr 的重复数据删除系统的最佳实践是什么?

database - 使用可以经常更新的字段创建 Lucene 索引并按此字段过滤结果的最佳方法

c# - 在 Lucene.Net 索引中搜索 url 字段