Java 一次解决数百万个搜索查询
我必须在引用地址(在PostGreSQL数据库中大约有3000万个)和包含其他地址的文件(每个月有很多文件,每个文件包含数百万个地址)之间进行配对 我已经成功地在SolR中导入了引用地址,搜索引擎也很棒。有没有一种方法可以让我创建一个处理程序或插件来快速地为文件的每一行进行配对 我不能使用REST API在SolR上执行数百万个http请求,这太慢了。我只想得到“id配对”的结果,例如,如果文件“somefile.csv”的id 17地址与引用地址的id 36、452和13456匹配,这就是我需要检索的全部内容,我可以稍后向数据库询问更多信息Java 一次解决数百万个搜索查询,java,batch-file,solr,bulk,pairing,Java,Batch File,Solr,Bulk,Pairing,我必须在引用地址(在PostGreSQL数据库中大约有3000万个)和包含其他地址的文件(每个月有很多文件,每个文件包含数百万个地址)之间进行配对 我已经成功地在SolR中导入了引用地址,搜索引擎也很棒。有没有一种方法可以让我创建一个处理程序或插件来快速地为文件的每一行进行配对 我不能使用REST API在SolR上执行数百万个http请求,这太慢了。我只想得到“id配对”的结果,例如,如果文件“somefile.csv”的id 17地址与引用地址的id 36、452和13456匹配,这就是我需
我想用Java来做,但是任何其他语言也可以。创建两个集合-一个是您已经拥有的集合,包含您想要匹配的地址。第二个集合应该包含您想要用于查找地址的CSV文件的内容-您可以在Solr中进行 设置好两个集合及其相应的文件后,使用in-Solr在两个集合之间编写一个
leftOuterJoin
(如果需要其他行为,也可以编写一个不同的联接)。这样,您将从上载的文件中获取所有条目,并使用匹配地址“id”的原始id进行充实
给定两个集合地址
(包含原始地址)和上传的\u文件
(包含上传的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"
)
在你的收藏中使用管理页面上的“流”部分可以让你体验表达式
使用以下测试文件和集合,结果如下:
地址中的文档
:
{
"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}
上传文件中的文档
:
{
"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
}
]
这将为您提供与上载的一个文档匹配的地址,以及与任何内容都不匹配的地址(其中缺少
原始\u id
).创建两个集合—一个是您已有的集合,其中包含您要匹配的地址。第二个集合应包含您要用于查找地址的CSV文件的内容—您可以在Solr中找到
设置好两个集合及其相应的文件后,使用in-Solr在两个集合之间编写一个leftOuterJoin
(如果需要其他行为,也可以编写一个不同的联接)。这样,您将从上载的文件中获取所有条目,并使用匹配地址“id”的原始id进行充实
给定两个集合地址
(包含原始地址)和上传的\u文件
(包含上传的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"
)
在你的收藏中使用管理页面上的“流”部分可以让你体验表达式
使用以下测试文件和集合,结果如下:
地址中的文档
:
{
"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}
上传文件中的文档
:
{
"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
}
]
这将为您提供与上载的一个文档匹配的地址,以及与任何内容都不匹配的地址(其中缺少
原始\u id
).关闭为重复项无效。此问题的答案正确,而关闭为重复项的问题与您今天如何在Solr中解决问题并不相关。请再次提问Julien,我将使用流式表达式为您提供可能的解决方案。关闭为重复项无效。T他的问题有一个正确的答案,并且这个问题作为一个副本关闭,与你如何在Solr中解决今天的问题无关。再问一次这个问题Julien,我将使用流式表达式为你提供一个可能的解决方案。哇,非常感谢,我从来没有想到这会起作用。我要试试这个,它看起来非常简单,我已经知道如何创建核心。几乎成功了,但我收到了以下消息:{“结果集”:{“文档”:[{“异常”:“org.apache.solr.common.SolrException:java.lang.IllegalArgumentException:HostProvider可能不是空的!”,“EOF”:true,“响应时间”:2319}}我想知道这是否仅适用于集合?它确实要求您在云模式下运行Solr,是的。但也可以是单个节点。进行单独的查询以检索不匹配的节点(在我的示例中,通过在联接后附加一个附加筛选器),然后使用单独的查询或更大的布尔查询集查询这些术语(默认限制:1000个术语)根据您想要检索匹配项的方式。使用多个术语可能会使您难以准确确定哪些地址导致了命中或未命中。哇,非常感谢,我从来没有想到这会起作用。我要尝试一下,它看起来非常简单,而且我已经知道如何创建核心。几乎成功了,但我收到以下消息:{“结果集:{“docs”:[{“EXCEPTION”:“org.apache.solr.common.SolrException:java.lang.IllegalArgumentException:主机提供程序不能为空!”,“EOF”:true,“响应时间:2319}]}我想知道这是否仅适用于集合?它确实要求您在云模式下运行Solr,是的。但也可以是单个节点。进行单独的查询以检索不匹配的节点(在我的示例中,通过在联接后附加一个附加筛选器),然后根据您要检索匹配项的方式,使用单独的查询或更大的布尔查询集(默认限制:1000个术语)查询。使用多个术语可能会使您难以准确确定哪些地址导致了命中或未命中。