练习 4:使用 ParamSets

练习 4:使用 ParamSets

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

准备工作

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

创建新集合

$ bin/solr create -c films

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

$ curl http://localhost: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 类型。对于此特定数据集域,将电影名称设为单值通用全文可搜索字段,并将发行日期也设为单值更有意义。

索引数据

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

Linux/Mac

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

Windows

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

让我们开始搜索!

搜索“Batman”

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

  • 如果您没有收到错误,但结果为零,则很有可能是 name 字段模式类型覆盖在第一次对数据编制索引之前没有设置(它最终成为“string”类型,即使按大小写要求完全匹配)。最简单的做法是重置您的环境并重试,确保每一步都成功执行。

向我展示所有“超级英雄”电影

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

让我们看看所有电影中流派的分布。有关计数,请参阅响应的方面部分

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

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

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

搜索“哈利波特”

注意第一个结果是电影Dumb & Dumberer: When Harry Met Lloyd?这显然与任何哈利波特电影无关。

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

curl http://localhost: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搜索“哈利波特”

我们返回五个结果,包括哈利波特电影,但请注意,我们仍然有Dumb & Dumberer: When Harry Met Lloyd电影回来?

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

我们只返回四部哈利波特电影,从而得到更精确的结果!我们可以说,我们相信算法B比算法A更好,至少对于这个查询是这样。您可以通过在线 A/B 测试验证此假设,以确认算法B总体上更好。

练习 4 总结

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