练习 4:使用 ParamSets

练习 4:使用 ParamSets

本练习将教您使用 ParamSets 将多个不同的查询参数分组到一个带标签的分组中,您可以在查询中引用该分组。

准备工作

确保您已按照tutorial-films.adoc#restart-solr中的步骤运行 Solr。然后继续下一部分。

创建一个新集合

$ bin/solr create -c films

因为我们没有指定 ConfigSet,所以我们将最终使用 _default ConfigSet。我们将为 Solr 否则会以不同方式(与我们期望的不同)猜测的几个字段指定特定的模式

$ curl https://127.0.0.1:8983/solr/films/schema -X POST -H 'Content-type:application/json' --data-binary '{
  "add-field" : [
    {
      "name":"name",
      "type":"text_general",
      "multiValued":false,
      "stored":true
    },
    {
      "name":"initial_release_date",
      "type":"pdate",
      "stored":true
    }
  ]
}'

如果不显式定义这些字段类型,则 *name* 字段将被猜测为多值字符串字段类型,而 *initial_release_date* 将被猜测为多值 pdate 类型。对于这个特定的数据集域,将电影名称设为单值通用全文可搜索字段,并将发布日期也设为单值更有意义。

索引数据

现在我们已经更新了模式,我们需要索引示例电影数据,或者,如果您已经索引了数据,则需要重新索引它以利用我们添加的新字段定义。

$ bin/solr post -c films example/films/films.json

开始搜索!

搜索“蝙蝠侠”

  • 如果您收到有关 name 字段不存在的错误,则您尚未索引数据。

  • 如果您没有收到错误,但结果为零,则很可能在第一次索引数据之前没有设置 *name* 字段模式类型覆盖(它最终成为“string”类型,甚至需要区分大小写的精确匹配)。最简单的方法是重置您的环境并重试,确保每个步骤都成功执行。

显示所有“超级英雄”电影

$ curl 'https://127.0.0.1:8983/solr/films/query?q=*:*&fq=genre:"Superhero movie"'

让我们看看所有电影的类型分布。请查看响应的分面部分以获取计数

$ curl 'https://127.0.0.1:8983/solr/films/query?q=*:*&facet=true&facet.field=genre'

使用 ParamSets 进行相关性调整的时间

现在我们可以查询我们的数据了,让我们实际使用 ParamSets 将我们的参数组织到两个实验中。

搜索“哈利波特”

请注意,第一个结果是电影《阿呆与阿瓜2:当哈里遇到劳埃德》?这显然与任何哈利·波特电影无关。

让我们使用我们的 API 设置两种相关性算法,然后比较结果的质量。算法 A 将指定使用 dismaxqf 参数,而算法 B 将使用 dismaxqf 和一个必须匹配的 mm 设置为 100%。

curl https://127.0.0.1:8983/solr/films/config/params -X POST -H 'Content-type:application/json' --data-binary '{
"set": {
    "algo_a":{
      "defType":"dismax",
      "qf":"name"
    }
  },
  "set": {
    "algo_b":{
      "defType":"dismax",
      "qf":"name",
      "mm":"100%"
    }
  }
}'

使用算法 A 搜索“哈利·波特”

我们返回了五个结果,包括哈利·波特电影,但是请注意,我们仍然有《阿呆与阿瓜2:当哈里遇到劳埃德》这部电影返回?

使用算法 B 搜索“哈利·波特”

我们只返回了四部哈利·波特电影,从而获得了更精确的结果!我们可以说,至少对于这个查询,我们认为算法 B 比算法 A 更好。您可以使用在线 A/B 测试来验证这个假设,以确认算法 B 总体上更好。

练习 4 总结

在本练习中,我们使用了 Schema API 来创建我们需要的字段,然后学习了如何将查询参数组织成名为 ParamSets 的参数组,这些参数组是我们使用 Config API 创建并在查询中后续引用的。