solr 7.0 与spring-data 3.0整合 --(2)自定义查询

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

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

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

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

新建自定义接口

public interface CustomMusicRepository {
   /**
    * @Author Alistair.Chow
    * @Description 根据歌手名字歌曲名字进行分页搜索
    * @Date 14:39 2018/6/25
    * @Param [collection, searchTerm, page]
    * @return java.util.List<com.ali.model.Music>
    **/
    public List<Music> findByName(String collection, String searchTerm, Pageable page);

}

更改MusicRepository

让其同时继承CustomMusicRepository

public interface MusicRepository extends CustomMusicRepository, SolrCrudRepository<Music, String> {
}

编写实现类

@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 List<Music> findByName(String collection, String searchTerm, Pageable page) {
        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.setPageRequest(page);

        Page results = solrTemplate.queryForPage(collection, search, Music.class);
        return results.getContent();
    }

    /**
     * @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() {
        Pageable page = PageRequest.of(0, 10);

        List<Music> musicList = musicRepository.findByName(Music.CORE_NAME, "赵传", page);
        for (Music music : musicList) {
            System.out.println(music);
        }
    }
}

执行结果如下


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,269评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,005评论 6 342
  • 你是春天的禾苗,挺胸昂头; 你是希望的花朵,美好芳秀。 愿阳光明媚,愿雨露绸缪; 愿你的理想带...
    太阳哥月亮妹阅读 195评论 0 1
  • 在两座城市之间奔波,离开之际总是思念想念感慨万千,成长离我们并不遥远,只是离开家才知道,自己究竟是什么模样。 现在...
    北冥吃鱼_阅读 243评论 0 0