Solr 一次数以百万计的搜索查询

Jul*_*nec 1 java solr batch-file bulk pairing

我必须在参考地址(PostGreSQL 数据库中大约有 3000 万个)和包含其他地址的文件(每个月有许多文件,每个文件包含数百万个地址)之间进行配对。

我已经设法在 SolR 中导入参考地址,搜索引擎很棒。有没有一种方法可以创建一个处理程序或插件来非常快速地为文件的每一行进行配对?

我不能使用 REST API 在 SolR 上执行数百万个 http 请求,这太慢了。我只想将结果作为“id 配对”,例如,如果文件“somefile.csv”的 ID 17 地址与引用地址的 IDS 36、452 和 13456 匹配,这就是我需要检索的全部内容,我可以询问有关更多信息的数据库稍后。

我想用 Java 来做,但任何其他语言也是可能的。

Mat*_*ndh 5

创建两个集合 - 一个您已有的集合,其中包含您要匹配的地址。第二个集合应包含要用于查找地址的 CSV 文件的内容 - 您可以将 CSV 文件直接作为Solr 中的文档上传

设置两个集合及其对应的文件后,使用Solr 中的流表达式支持leftOuterJoin两个集合之间编写一个(或不同的连接,如果您想要另一种行为)。这样你就可以从你上传的文件中取回所有条目,并用匹配地址的原始 id 来丰富它的 id。

给定两个集合addresses(包含原始地址)和uploaded_file(包含上传的 CSV 行),连接表达式可以写为:

leftOuterJoin(
  search(uploaded_file, q=*:*, fl="id,address", sort="address asc"),
  select(
    search(addresses, q=*:*, fl="id,address", sort="address asc"),
    address AS original_address,
    id AS original_id
  ),
  on="address=original_address"
)
Run Code Online (Sandbox Code Playgroud)

为您的收藏使用“管理”页面上的“流”部分将允许您试验表达式。

使用以下测试文档和集合,结果如下:

文件addresses

  {
    "id":"add1",
    "address":"foo st. 33",
    "_version_":1606950875589246976},
  {
    "id":"add2",
    "address":"foo st. 49",
    "_version_":1606950875591344128},
  {
    "id":"add3",
    "address":"bar lane 1",
    "_version_":1606950875591344129},
  {
    "id":"add1-duplicate",
    "address":"foo st. 33",
    "_version_":1606951820879462400}
Run Code Online (Sandbox Code Playgroud)

文件uploaded_file

  {
    "id":"up1",
    "address":"foo st. 33",
    "_version_":1606950921604956160},
  {
    "id":"up2",
    "address":"foo st. 72",
    "_version_":1606950921607053312},
  {
    "id":"up3",
    "address":"bar lane 1",
    "_version_":1606950921607053313}
Run Code Online (Sandbox Code Playgroud)

运行表达式给我们:

"docs": [
  {
    "original_address": "bar lane 1",
    "address": "bar lane 1",
    "id": "up3",
    "original_id": "add3"
  },
  {
    "original_address": "foo st. 33",
    "address": "foo st. 33",
    "id": "up1",
    "original_id": "add1"
  },
  {
    "original_address": "foo st. 33",
    "address": "foo st. 33",
    "id": "up1",
    "original_id": "add1-duplicate"
  },
  {
    "address": "foo st. 72",
    "id": "up2"
  },
  {
    "EOF": true,
    "RESPONSE_TIME": 28
  }
]
Run Code Online (Sandbox Code Playgroud)

这为您提供了与上传的一个文档匹配的地址,以及与任何内容都不匹配的地址(original_id丢失的位置)。