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

时间:2018-07-25 07:37:52

标签: java batch-file solr bulk pairing

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

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

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

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

1 个答案:

答案 0 :(得分:2)

创建两个集合-您已经拥有一个集合,其中包含您要匹配的地址。第二个集合应包含要用于查找地址的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"
)

在管理页面上使用集合的“流”部分,您可以尝试使用表达式。

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

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的地址)。

相关问题