solr 7.X 与spring-data 3.X整合 --(2)自定义查询

本文介绍如何通过自定义Solr Repository实现个性化搜索功能。针对歌手名和歌曲名的搜索需求,采用Spring Data Solr进行分页查询。通过具体代码示例展示了如何构造复杂的搜索条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然Spring-data-solr提供了常用的curd操作,但是对于个性化的场景还是不能完全满足我们的需求,需要自己去实现。

代码的相关配置,请参见solr 7.0 与spring-data 3.0整合 –(1)

要实现个性化的查询,我们就需要对repository进行改写。

这里实现一个按照歌手名字喝歌曲名字来进行搜索,并完成分页。

新建自定义接口

@Repository
public class MusicRepositoryImpl implements CustomMusicRepository {
    @Resource
    private SolrTemplate solrTemplate;

    /**
     * @return java.util.List<com.ali.model.Music>
     * @Author Alistair.Chow
     * @Description 按照歌手名字或歌曲名称进行搜索
     * @Date 14:45 2018/6/25
     * @Param [collection, searchTerm, page]
     **/
    @Override
    public ScoredPage<Music> findByName(String collection, String searchTerm, long pageIndex, int pageSize) {
        String[] words = searchTerm.split(" ");
        String[] contidionFields = new String[]{Music.FIELD_SINGER_NAME, Music.FIELD_SONG_NAME};
        Criteria conditions = createSearchConditions(contidionFields, words);
        SimpleQuery search = new SimpleQuery(conditions);
        search.setOffset(pageIndex);
        search.setRows(pageSize);
        ScoredPage<Music> page = solrTemplate.queryForPage(collection, search, Music.class);
        return page;
    }

    /**
     * @return org.springframework.data.solr.core.query.Criteria
     * @Author Alistair.Chow
     * @Description 构造搜索条件
     * @Date 9:53 2018/6/25
     * @Param [conditionFileds]: 搜索字段
     * @Param [words] : 搜索内容
     **/
    private Criteria createSearchConditions(String[] conditionFileds, String[] words) {
        Criteria conditions = null;

        for (String word : words) {
            if (conditions == null) {
                for (int i = 0; i < conditionFileds.length; i++) {
                    if (i == 0) {
                        conditions = new Criteria(conditionFileds[i]).contains(word);
                    } else {
                        conditions = conditions.or(new Criteria(conditionFileds[i]).contains(word));
                    }
                }
            } else {
                for (String condition : conditionFileds) {
                    conditions = conditions.or(new Criteria(condition).contains(word));
                }
            }
        }

        return conditions;
    }
}

测试

编写测试代码,用于测试自定义查询接口,取每页10条记录,取第一页

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = HttpSolrContext.class)
public class repositoryTest {
    @Autowired
    private MusicRepository musicRepository;

    @Test
    public void findByName() {
        ScoredPage<Music> musicList = musicRepository.findByName(Music.CORE_NAME, "赵传", 0, 10);
        for (Music music : musicList.getContent()) {
            System.out.println(music);
        }
    }
}

执行结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值