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