本练习将使用电影数据集,重点探索Solr的分面(Faceting)功能,这是构建强大搜索界面的关键特性。
集合设置
1. 创建Films集合
使用_default
配置集创建一个新的”films”集合:
1 | bin/solr create -c films --shards 2 --replication-factor 2 |
这将创建一个具有2个分片和2个副本的集合,提供良好的容错性。
模式准备
2. 创建必要的字段
创建”name”字段:
1 | curl -X POST -H 'Content-type:application/json' --data-binary '{ |
添加一个捕获所有字段的复制字段:
1 | curl -X POST -H 'Content-type:application/json' --data-binary '{ |
索引Films数据
3. 导入数据
1 | bin/solr post -c films example/films/films.json |
这将索引包含多部电影信息的JSON文件。
分面技术探索
字段分面(Field Facets)
查询所有文档并按流派分面:
1 | curl "http://localhost:8983/solr/films/select?q=*:*&rows=0&facet=true&facet.field=genre_str" |
限制分面结果(只显示至少有200部电影的流派):
1 | curl "http://localhost:8983/solr/films/select?q=*:*&facet.field=genre_str&facet.mincount=200&facet=on&rows=0" |
范围分面(Range Facets)
按发布日期创建范围分面:
1 | curl "http://localhost:8983/solr/films/select?q=*:*&rows=0\ |
这将显示过去25年中每年发布的电影数量。
透视分面(Pivot Facets)
创建流派和导演的透视分面:
1 | curl "http://localhost:8983/solr/films/select?q=*:*&rows=0&facet=true&facet.pivot=genre_str,directed_by_str" |
这将显示每个流派中各个导演的电影数量,帮助分析导演的专长领域。
分面的实际应用
1. 导航式搜索界面
分面允许用户通过点击类别来细化搜索结果,例如:
- 按流派筛选(动作、喜剧、剧情)
- 按年份范围筛选
- 按导演筛选
2. 数据分析
通过分面统计,可以快速了解数据分布:
- 哪个流派的电影最多?
- 电影产量的年度趋势如何?
- 哪些导演最高产?
3. 动态筛选器
结合多个分面字段,创建复杂的筛选器组合:
1 | curl "http://localhost:8983/solr/films/select?q=*:*&fq=genre_str:Drama&fq=directed_by_str:*Spielberg*&facet=true&facet.field=initial_release_date" |
高级分面技巧
分面排序
按计数降序排序(默认):
1 | facet.sort=count |
按索引顺序(字母顺序)排序:
1 | facet.sort=index |
分面限制
限制返回的分面值数量:
1 | facet.limit=10 |
分面偏移
跳过前N个分面值:
1 | facet.offset=5 |
清理
删除集合(如需要):
1 | bin/solr delete -c films |
关键学习要点
- 分面类型:掌握字段分面、范围分面和透视分面
- 分面参数:了解如何控制分面输出
- 实际应用:理解分面在搜索界面中的作用
- 性能考虑:分面可能消耗资源,需要合理使用
下一步
- 尝试更复杂的分面组合
- 探索JSON Facet API以获得更强大的功能
- 继续练习三,使用自己的数据