虽然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);
}
}
}
执行结果如下