【问题标题】:Apache solr fuzzy search on list valuesApache solr 对列表值的模糊搜索
【发布时间】:2021-09-30 13:06:21
【问题描述】:

环境 - solr-8.9.0

为了在 apache solr 中对 csv 文件的“名称”列进行模糊搜索(模糊搜索“alaistiar~”),我发出以下查询

http://localhost:8983/solr/bigboxstore/select?indent=on&q=name:'alaistiar~'&wt=json

在apache solr中对csv文件的“name”列进行模糊搜索(模糊搜索'shanka~')

http://localhost:8983/solr/bigboxstore/select?indent=on&q=name:'shanka~'&wt=json

我可以将上述两个查询合并到一个单独的查询中并找出文档吗?

我的第一个 http 请求是在 name 列上对 value alaistiar~ 进行模糊搜索并给出一些分值,第二个 http 请求是针对 shanka~。当我将两者与“或”运算符结合使用时,它们的行为是否与单个请求相同。实际上,我的目的是我不想为多个名称调用多个 http 请求,而且我希望输出中的模糊搜索名称表明该文档适用于name alaistiar~ 这个文件是 name shanka~

我已经加载了一个包含 4 列(大小为 5GB。)的 csv 文件,其中包含 1 亿条记录。 .csv 文件具有以下列名称 -

'name', 'father_name', 'date_of_passing','admission_number'

我已经在“名称”列上创建了索引。为此,我在托管模式(solr-8.9.0,jdk-11.0.12)上执行了以下 curl 请求

curl -X POST -H 'Content-type:application/json' --data-binary '{"add-field":{"name":"name","type":"text_general","stored":true,"indexed":true }}' http://localhost:8983/solr/bigboxstore/schema
 curl -X POST -H 'Content-type:application/json' --data-binary '{"add-field":{"name":"father_name","type":"text_general","stored":true,"indexed":false }}' http://localhost:8983/solr/bigboxstore/schema
curl -X POST -H 'Content-type:application/json' --data-binary '{"add-field":{"name":"date_of_passing","type":"pdate","stored":true,"indexed":false }}' http://localhost:8983/solr/bigboxstore/schema
curl -X POST -H 'Content-type:application/json' --data-binary '{"add-field":{"name":"admission_number","type":"text_general","stored":true,"indexed":false }}' http://localhost:8983/solr/bigboxstore/schema

如上所述,这是在 1 列(仅在名称上)创建索引的正确方法吗?

现在我有 100 万个名字的列表。在每个名称上,我必须对已加载的数据进行模糊搜索(列:名称)。在输出中,对于每个名称,我必须返回 java 对象列表,包括 .csv 文件的所有 4 列。

注意-在输出中,我还必须包含作为输入提供的名称(在 where 子句中)。 对于每个名称,我都进行如下模糊搜索:

http://localhost:8983/solr/bigboxstore/select?indent=on&q=name:'alaistiar~'&wt=json.

为此,我必须执行 1 百万个 http 请求,这是我不想要的。我可以在单个 http 请求中执行 100 万个 http 请求,而不是执行?

我知道'OR 运算符不会解决我的问题,因为我无法根据作为输入传递的名称对输出文档进行分组。

【问题讨论】:

    标签: solr fuzzy-search


    【解决方案1】:

    是的,您可以使用“OR”来统一查询:

    name:alaistiar~ 或者 name:shanka~

    http://localhost:8983/solr/bigboxstore/select?indent=on&q=name:alaistiar~ 或名称:shanka~&wt=json

    如果您的默认运算符是“OR”,您可以省略“OR”。查询如下所示:

    名字:alaistiar~名字:香卡~

    http://localhost:8983/solr/bigboxstore/select?indent=on&q=name:alaistiar~ name:shanka~&wt=json

    当然,URL中的“空格”应该转义。

    你好,再次。编辑问题后,您要查找的内容会更加清晰:

    1. 1 百万个名字只有 1 次查询
    2. 在结果中查看哪个响应对应哪个名称

    有一个解决方案,但你必须做一些后期处理。您可以使用带有参数的 json 的 POST 请求(对于 1),并且可以像我在这里所做的那样使用命中突出显示(对于 2):

    curl 'http://localhost:8983/solr/bigboxstore/query?hl.fl=name&hl.simple.post=</b>&hl.simple.pre=<b>&hl=on' -H "Content-Type: application/x-www-form-urlencoded" -X POST -d 'json={"query":"name:alaistiar~ name:shanka~"}'
    

    答案包含两部分:第一部分包含结果,第二部分包含 id 和亮点 -> 收到响应后,您必须将它们与 id 配对。

    【讨论】:

    • 感谢您的回复!我的第一个 http 请求是在名称列上模糊搜索 value alaistiar~ 并给出一些分值,第二个 http 请求是针对 shanka~。当我将两者与“或”运算符结合使用时,它的行为是否与它们是单独的请求相同。意味着当文档名称为“alaistiar shanka”时,它不会给出最高分。实际上,我的目的是我不想为多个名称调用多个 http 请求,而且我希望在输出中显示模糊搜索名称,表明此文档用于名称 alaistiar~ 而此文档用于名称 shanka~。
    • @user595014:是的,如果您与or 结合使用,当文档名称为“alaistiar shanka”时,它会给出最高分。据我了解,这是您不想要的。您正在寻找尚未实现的查询批处理 issues.apache.org/jira/browse/SOLR-1093 之类的东西。
    • 已为此功能创建了一个补丁,但从未合并。您可能想要下载补丁并应用到您的本地 solr 实例并测试它是否有帮助。但是由于补丁现在已经很老了,您可能必须修改代码以使其适用于最新的 solr 版本。但是,只有在绝对必要时才走这条路。
    • @OanaB ...谢谢您的回复!在输出中,它显示带有 id 和 name 的突出显示(在输出文档中)。我怎么知道输出中写的名字是模糊搜索“alaistiar”/“shanka”。
    • 您好,@user595014 我现在意识到您无法配对结果。
    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 2013-02-18
    • 2011-03-16
    • 2012-11-16
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多