Lucene/Solr:存储某些关键字的偏移量信息

Lucene/Solr:存储某些关键字的偏移量信息,solr,lucene,Solr,Lucene,我们使用Solr来存储带有关键字的文档;每个关键字都与文档中的范围相关联 这些关键词是在加载到Solr之前通过一些奇特的分析和/或手工工作生成的。关键字可以在文档中重复多次。另一方面,单个文档中同一字符串的不同实例可以使用不同的关键字进行连接 例如,本文件 Bill studied The Bill of Rights last summer. 可伴有以下关键字(括号中带偏移): (显然,在其他文件中,比尔可能指的是比尔·克林顿或比尔·盖茨。同样,去年夏天也会在不同的文件中指的是不同的年份。我

我们使用Solr来存储带有关键字的文档;每个关键字都与文档中的范围相关联

这些关键词是在加载到Solr之前通过一些奇特的分析和/或手工工作生成的。关键字可以在文档中重复多次。另一方面,单个文档中同一字符串的不同实例可以使用不同的关键字进行连接

例如,本文件

Bill studied The Bill of Rights last summer.
可伴有以下关键字(括号中带偏移):

(显然,在其他文件中,比尔可能指的是比尔·克林顿或比尔·盖茨。同样,去年夏天也会在不同的文件中指的是不同的年份。我们对所有文件都有这些信息。)

我知道文档可以有一个字段,比如关键字,它将存储
William Brown
。然后,当我搜索
William Brown
时,我将得到上面的文档。那部分很简单

但是我不知道如何存储与span
0:4
文本span
William Brown
相对应的信息,因此我可以突出显示第一个
Bill
,但不能突出显示第二个

我想我可以使用,但我不确定是否/如何存储自定义偏移。我认为这是一个相当普遍的情况

编辑:编辑以明确账单可以指不同文档中的不同人员/事物。


EDIT2:编辑以明确文档可以包含同音词(具有不同含义的相同字符串)。

默认情况下,Solr在标记化后存储每个标记的开始/结束位置,例如使用标准标记器。此信息在下划线索引上进行编码。您在这里描述的用例听起来很像
同义过滤器工厂

当您使用
SynonymFilterFactory
定义同义词时,例如说明:
foo=>baz
foo等同于bar,bar术语将添加到文本标记化时生成的标记流中,并且它将具有与原始标记相同的偏移量信息。因此,例如,如果您的文本是:“foo非常棒”,那么术语foo将具有以下偏移量信息
(start=0,end=3)
一个新的标记
条(start=0,end=3)
将添加到您的索引中(假设您在索引时使用的是
同义过滤器工厂
):

一旦应用了同义词过滤器工厂:

           bar
   text:   foo    is    awesome
   start:  0      4     7
   end:    3      6     13
因此,如果使用
foo
启动查询,文档将匹配,但如果使用
bar
作为查询,文档也将匹配,因为
bar
标记是由
同义过滤器工厂添加的

在您的特定情况下,您正试图实现多术语同义词,这是一个困难的问题,您可能需要比Solr的默认同义词过滤器更多的东西。来自OpenSourceConnections和Lucidworks(Solr/Lucene背后的公司)的人员的检查。这两个员额应提供额外信息和每种方法的注意事项


是否需要获取存储的偏移量以供以后处理?

Two Q Monte

解决方案优点:

  • 注释与源文档一起逻辑存储
  • 不需要了解highlighter实现或自定义Java highlighter开发
  • 由于所有定制都发生在Solr之外,因此此解决方案应与未来的Solr版本保持向前兼容
解决方案缺点:

  • 需要运行两个查询
  • 需要搜索客户端中的代码将一个查询的结果合并到另一个查询中

使用Solr 4.8+可以在每个主文档(文本)下嵌套子文档(注释)

。。。使用块联接查询注释

1)注释查询
http://localhost:8983/solr/query?fl=id,开始偏移量,结束偏移量&q={!child of=content\u type:source}注释:“William Brown”

将这些结果存储在代码中,以便在下次查询返回后可以折叠注释偏移量

2)源查询+突出显示
http://localhost:8983/solr/query?hl=true&hl.fl=text&fq=content_type:source&q=text:“威廉·布朗”或id:123

(id:在注释查询中发现的123被或入第二个查询)

注意:在本例中,没有返回突出显示信息,因为搜索词与任何
内容\u type:source
文档都不匹配。但是,我们有来自第一个查询的显式注释和偏移量

然后,您的客户端代码需要从第一个查询中获取
内容类型:源注释
结果,并手动将突出显示标记插入到第二个查询的
内容类型:源
结果中



更多的块连接信息。

我认为同义词对于所有文档都是稳定的。但是像Bill这样的东西会指不同文档中的不同人员(类似于昨天,等等)…您如何区分同一文档或不同文档中出现的多个Bill?这些信息是由分析模块在将文档加载到Solr之前处理这些文档生成的。因此,如果文档是《人权法案》
,那么它会附带此元数据
[威廉·布朗(0:4),法律术语(13:21)]
。在搜索
威廉·布朗时,我们不想突出显示后一个
比尔
。我认为,将“术语同义词”编码为附加到实际术语的有效负载(从而继承偏移量信息)和自定义荧光灯可能是一种方法。基本上,您可以使用术语和“同义词”作为有效负载为文档编制索引:
Bill[William Brown]研究了《权利法案》
,自定义荧光灯检查有效负载是否存在,并使用它来代替o
   text:   foo    is    awesome
   start:  0      4     7
   end:    3      6     13
           bar
   text:   foo    is    awesome
   start:  0      4     7
   end:    3      6     13
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
      }
    ]
  }
]
"response":{"numFound":1,"start":0,
    "docs":[
      {
            "id": "123-1",
            "content_type": "source_annotation",
            "annotation": "William Brown",
            "start_offset": 0,
            "end_offset": 4
      }
    ]
  }
"response":{"numFound":1,"start":0,
    "docs":[
      {
            "id": "123",
            "content_type": "source",
            "text": "Bill studied The Bill of Rights last summer."
      }
    ],
    "highlighting":{}
  }