我必须在引用地址(在PostGreSQL数据库中大约为3000万)和包含其他地址的文件(每个月包含多个文件,每个文件包含数百万个地址)之间进行配对。
我已经设法在SolR中导入参考地址,并且搜索引擎很棒。有没有一种方法可以创建一个处理程序或插件,可以非常快速地为文件的每一行进行配对?
我无法使用REST API在SolR上执行数百万个http请求,这太慢了。我只想以“ id pairing”的形式获取结果,例如,如果文件“ somefile.csv”的ID 17地址与参考地址的IDS 36、452和13456匹配,这就是我需要检索的全部,我可以要求有关更多信息的数据库。
我想用Java来做,但是任何其他语言也是可以的。
答案 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
的地址)。