美文网首页
solr 7.0 与spring-data 3.0整合 --(2

solr 7.0 与spring-data 3.0整合 --(2

作者: AlistairChow | 来源:发表于2018-06-25 15:02 被阅读0次

虽然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);
        }
    }
}

执行结果如下


相关文章

网友评论

      本文标题:solr 7.0 与spring-data 3.0整合 --(2

      本文链接:https://www.haomeiwen.com/subject/vkdyyftx.html