Solr7.x學習(8)-使用spring-data-solr

一、maven配置java

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-solr</artifactId>
    <version>4.0.10.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>7.7.2</version>
</dependency>

二、application-solr.xml配置spring

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:solr="http://www.springframework.org/schema/data/solr"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                https://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/data/solr
                https://www.springframework.org/schema/data/solr/spring-solr.xsd">

    <solr:solr-client id="solrClient" url="${solr.url}" />
    <solr:repositories base-package="com.zhi.demo.**.repository" />

    <bean name="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
        <constructor-arg name="solrClient" ref="solrClient" />
        <!-- 根據Indexed註解建立不存在的字段 -->
        <property name="schemaCreationFeatures">
            <list>
                <value>CREATE_MISSING_FIELDS</value>
            </list>
        </property>
    </bean>
</beans>

注意schemaCreationFeatures選擇,若是有CREATE_MISSING_FIELDS選擇,Spring會在啓動時根據Indexed註解在solr中建立沒定義的field。關鍵代碼:apache

 

 

 三、建立Beanapp

    Dept.javadom

package com.zhi.demo.dept.model;

import java.util.Date;

import org.springframework.data.annotation.Id;
import org.springframework.data.solr.core.mapping.Indexed;
import org.springframework.data.solr.core.mapping.SolrDocument;

/**
 * 部門信息,collection爲對應的core名稱,Indexed註解會自動在solr添加對應的field
 * 
 * @author zhi
 * @time 2016年12月22日09:55:08
 *
 */
@SolrDocument(collection = "dept")
public class Dept {
    /**
     * 部門ID
     */
    @Id
    @Indexed
    private String id;
    /**
     * 部門名稱
     */
    @Indexed(type = "text_ik")
    private String name;
    /**
     * 建立時間
     */
    @Indexed(name = "createTime", type = "pdate")
    private Date createTime;
    /**
     * 備註
     */
    @Indexed(type = "text_ik")
    private String remark;

    public Dept() {
        super();
    }

    public Dept(String id, String name, Date createTime, String remark) {
        super();
        this.id = id;
        this.name = name;
        this.createTime = createTime;
        this.remark = remark;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

}
View Code

    Person.javamaven

package com.zhi.demo.person.model;

import java.io.Serializable;
import java.util.Date;

import org.springframework.data.annotation.Id;
import org.springframework.data.solr.core.mapping.Indexed;

/**
 * 人員信息
 * 
 * @author 張遠志
 * @time 2016年12月22日09:55:42
 *
 */
@SuppressWarnings("serial")
public class Person implements Serializable {
    /**
     * 主鍵
     */
    @Id
    @Indexed
    private String id;
    /**
     * 人員名稱
     */
    @Indexed
    private String name;
    /**
     * 地址
     */
    @Indexed
    private String addr;
    /**
     * 年齡
     */
    private Integer age;
    /**
     * 部門ID
     */
    private String deptId;
    /**
     * 是否可用
     */
    private boolean usable;
    /**
     * 建立時間
     */
    private Date createTime;
    /**
     * 備註
     */
    private String remark;

    public Person() {
        super();
    }

    public Person(String id, String name, String addr, Integer age, String deptId, boolean usable, Date createTime,
            String remark) {
        super();
        this.id = id;
        this.name = name;
        this.addr = addr;
        this.age = age;
        this.deptId = deptId;
        this.usable = usable;
        this.createTime = createTime;
        this.remark = remark;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getDeptId() {
        return deptId;
    }

    public void setDeptId(String deptId) {
        this.deptId = deptId;
    }

    public boolean isUsable() {
        return usable;
    }

    public void setUsable(boolean usable) {
        this.usable = usable;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

}
View Code

四、使用Repository方式進行CRUD操做ide

    建立DeptRepository.java測試

package com.zhi.demo.dept.repository;

import java.util.List;

import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SolrCrudRepository;

import com.zhi.demo.dept.model.Dept;

/**
 * 部門增刪改查操做
 * 
 * @author zhi
 * @since 2019年9月27日14:05:15
 *
 */
public interface DeptRepository extends SolrCrudRepository<Dept, String> {

    @Query("name:?0 OR remark:?0")
    List<Dept> findList(String text);
}
View Code

    定義Dept操做接口和實現this

package com.zhi.demo.dept.service;

import java.util.List;

import com.zhi.demo.dept.model.Dept;

/**
 * 部門操做接口
 * 
 * @author zhi
 * @since 2019年9月27日13:12:26
 *
 */
public interface IDeptService {
    /**
     * 保存
     * 
     * @param model
     * @return
     */
    Dept save(Dept model);

    /**
     * 批量保存
     * 
     * @param models
     * @return
     */
    List<Dept> saveBatch(List<Dept> models);

    Dept findById(String id);

    List<Dept> list(String text);
}
View Code
package com.zhi.demo.dept.service.impl;

import java.util.List;
import java.util.Optional;

import org.apache.commons.collections4.IteratorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.zhi.demo.dept.model.Dept;
import com.zhi.demo.dept.repository.DeptRepository;
import com.zhi.demo.dept.service.IDeptService;

/**
 * 部門操做接口實現
 * 
 * @author zhi
 * @since 2019年9月27日13:12:26
 *
 */
@Service
public class DeptServiceImpl implements IDeptService {
    @Autowired
    private DeptRepository deptRepository;

    @Override
    public Dept save(Dept model) {
        deptRepository.save(model);
        return model;
    }

    @Override
    public List<Dept> saveBatch(List<Dept> models) {
        deptRepository.saveAll(models);
        return models;
    }

    @Override
    public Dept findById(String id) {
        Optional<Dept> optional = deptRepository.findById(id);
        if (optional.isPresent()) {
            return optional.get();
        }
        return null;
    }

    @Override
    public List<Dept> list(String text) {
        if (StringUtils.isEmpty(text)) {
            return IteratorUtils.toList(deptRepository.findAll().iterator());
        } else {
            return deptRepository.findList(text);
        }
    }
}
View Code

     Junit測試url

package com.zhi.test;

import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.zhi.demo.dept.model.Dept;
import com.zhi.demo.dept.service.IDeptService;

/**
 * Solr部門測試
 * 
 * @author zhi
 * @since 2019年9月29日15:06:06
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:application.xml", "classpath*:application-*.xml" })
public class DeptTest {
    private Logger logger = LogManager.getLogger(this.getClass());
    @Autowired
    private IDeptService deptService;

    @Test
    public void saveBatch() {
        try {
            deptService.saveBatch(ModelData.getDeptData());
            logger.info("保存成功");
        } catch (Exception e) {
            logger.error("保存出錯", e);
        }
    }

    @Test
    public void findOne() {
        try {
            Dept dept = deptService.findById("01");
            if (dept == null) {
                logger.info("根據ID未查詢到記錄");
            } else {
                logger.info("查詢結果:id={},name={},remark{}", dept.getId(), dept.getName(), dept.getRemark());
            }
        } catch (Exception e) {
            logger.error("查詢出錯", e);
        }
    }

    @Test
    public void list() {
        try {
            List<Dept> list = deptService.list("公司");
            logger.info("查詢到的數據長度:{}", list.size());
            for (Dept dept : list) {
                logger.info("id={},name={},remark{}", dept.getId(), dept.getName(), dept.getRemark());
            }
        } catch (Exception e) {
            logger.error("查詢出錯", e);
        }
    }
}
View Code

五、使用SolrTemplate進行CRUD刪除

    定義接口和實現

package com.zhi.demo.person.service;

import java.util.List;

import com.zhi.demo.person.model.Person;

/**
 * 人員操做接口
 * 
 * @author zhi
 * @since 2019年9月27日11:33:31
 *
 */
public interface IPersonService {
    /**
     * 保存人員,
     * 
     * @param model
     * @return
     */
    Person save(Person model);

    /**
     * 批量保存人員
     * 
     * @param models
     * @return
     */
    List<Person> saveBatch(List<Person> models);

    /**
     * 根據ID查詢人員信息
     * 
     * @param id
     * @return
     */
    Person findById(String id);

    /**
     * 根據關鍵字查詢人員列表
     * 
     * @param text 與name和addr字段匹配
     * @return 列表長度由solr默認分頁長度決定
     */
    List<Person> list(String text);

    /**
     * 根據可用狀態查找人員列表
     * 
     * @param usable 與usable字段匹配
     * @return 列表長度由solr默認分頁長度決定
     */
    List<Person> usable(Boolean usable);
}
View Code
package com.zhi.demo.person.service.impl;

import java.time.Duration;
import java.util.List;
import java.util.Optional;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.data.solr.core.query.SimpleStringCriteria;
import org.springframework.stereotype.Service;

import com.zhi.demo.person.model.Person;
import com.zhi.demo.person.service.IPersonService;

/**
 * 人員操做接口實現
 * 
 * @author zhi
 * @since 2019年9月27日11:33:31
 *
 */
@Service
public class PersonServiceImpl implements IPersonService {
    @Autowired
    private SolrTemplate solrTemplate;

    @Override
    public Person save(Person model) {
        solrTemplate.saveBean("person", model);
        solrTemplate.commit("person"); // 手工提交數據
        return model;
    }

    @Override
    public List<Person> saveBatch(List<Person> models) {
        solrTemplate.saveBeans("person", models, Duration.ofSeconds(2)); // 自動提交
        return models;
    }

    public Person findById(String id) {
        Criteria criteria = new Criteria("id");
        criteria.is(id);
        Optional<Person> optional = solrTemplate.queryForObject("person", new SimpleQuery(criteria), Person.class);
        return optional.isPresent() ? optional.get() : null;
    }

    @Override
    public List<Person> list(String text) {
        SimpleQuery query = new SimpleQuery();
        if (!StringUtils.isEmpty(text)) {
            Criteria criteria = new SimpleStringCriteria("name:" + text + " OR addr:" + text);
            query.addCriteria(criteria);
        }
        Page<Person> page = solrTemplate.query("person", query, Person.class);
        return page.getContent();
    }

    @Override
    public List<Person> usable(Boolean usable) {
        SimpleQuery query = new SimpleQuery();
        if (usable != null) {
            Criteria criteria = new Criteria("usable");
            criteria.is(usable);
            query.addCriteria(criteria);
        }
        Page<Person> page = solrTemplate.query("person", query, Person.class);
        return page.getContent();
    }
}
View Code

    Junit測試

package com.zhi.test;

import java.util.Date;
import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.zhi.demo.person.model.Person;
import com.zhi.demo.person.service.IPersonService;
import com.zhi.demo.utils.TimerUtil;

/**
 * Solr人員操做測試
 * 
 * @author 張遠志
 * @since 2019年9月29日15:34:55
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:application.xml", "classpath*:application-*.xml" })
public class PersonTest {
    private Logger logger = LogManager.getLogger(this.getClass());
    @Autowired
    private IPersonService personService;

    @Test
    public void saveBatch() {
        try {
            personService.saveBatch(ModelData.getPersonData());
            logger.info("保存成功");
        } catch (Exception e) {
            logger.error("保存出錯", e);
        }
    }

    @Test
    public void findOne() {
        try {
            Person model = personService.findById("01");
            if (model == null) {
                logger.info("根據ID未查詢到記錄");
            } else {
                logger.info("查詢結果:id={},name={},addr={}", model.getId(), model.getName(), model.getAddr());
            }
        } catch (Exception e) {
            logger.error("查詢出錯", e);
        }
    }

    @Test
    public void list() {
        try {
            List<Person> list = personService.list("武漢");
            logger.info("查詢到的數據長度:{}", list.size());
            for (Person item : list) {
                logger.info("id={},name={},addr={}", item.getId(), item.getName(), item.getAddr());
            }
        } catch (Exception e) {
            logger.error("查詢出錯", e);
        }
    }

    @Test
    public void usable() {
        try {
            List<Person> list = personService.usable(false);
            logger.info("查詢到的數據長度:{}", list.size());
            for (Person item : list) {
                logger.info("id={},name={},addr={}", item.getId(), item.getName(), item.getAddr());
            }
        } catch (Exception e) {
            logger.error("查詢出錯", e);
        }
    }

    @Test
    public void pressure() {
        Date start = new Date();
        for (int i = 0; i < 10000; i++) {
            personService.list("武漢");
        }
        logger.info(TimerUtil.format(start));
    }
}
View Code
相關文章
相關標籤/搜索