一次解决数百万个搜索查询

Solr Millions of search queries at once

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

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

我无法使用 REST API 在 SolR 上执行数百万个 http 请求,那样太慢了。我只想得到结果 "id pairing",例如,如果文件 "somefile.csv" 的 ID 17 地址与参考地址的 IDS 36、452 和 13456 匹配,这就是我需要检索的全部,我可以问有关更多信息的数据库。

我想用 Java 做,但也可以使用任何其他语言。

创建两个集合 - 一个您已有的集合,其中包含您要匹配的地址。第二个集合应包含要用于查找地址的 CSV 文件的内容 - 您可以在 Solr 中 upload the CSV file directly as documents

设置完两个集合及其对应的文件后,使用 Solr 中的 Streaming Expressions support 在两个集合之间写入 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"
)

使用集合管理页面上的 "Stream" 部分将允许您试验表达式。

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

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}

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}

运行 表达式给我们:

"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
  }
]

这会为您提供与上传的一个文档匹配的地址,以及不匹配的地址(缺少 original_id)。