solr集成springboot并向solr推送索引数据更新和查询
来源:互联网 发布:简单的c语言程序编写 编辑:程序博客网 时间:2024/05/24 04:42
虽然说是很简单的功能,但是在此记录一下
首先导入maven映射
<dependency><groupId>org.apache.solr</groupId><artifactId>solr-solrj</artifactId></dependency>引入solr的jar镜像之后就可以开始开发了
Junit测试用例:
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;import java.util.HashMap;import java.util.Map;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.http.MediaType;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.web.WebAppConfiguration;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import org.springframework.web.context.WebApplicationContext;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.ObjectWriter;import com.xx.module.constant.CommonConstants;import com.xx.module.request.PushDataIntoSolrRequest;import com.xx.module.request.QuerySolrIndexRequest; @SpringBootTest(classes=DcExternalApiApplication.class)@RunWith(SpringJUnit4ClassRunner.class)@WebAppConfigurationpublic class SolrTests {private MockMvc mockMvc; @Autowired protected WebApplicationContext wac;@Before() public void setup() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); //初始化MockMvc对象 }@Testpublic void pushDataIntoSolr() { //推送solr测试方法Map<String, Object> map = new HashMap<>(); map.put("id", 2); map.put("title", 2); map.put("content", 2); PushDataIntoSolrRequest request = new PushDataIntoSolrRequest(); ObjectMapper mapper = new ObjectMapper(); ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter(); request.setInput(map); request.setCoreName("test_core"); MvcResult result;try {java.lang.String requestJson = ow.writeValueAsString(request);result = mockMvc.perform(post("/solr/pushDataIntoSolr").contentType(MediaType.APPLICATION_JSON_VALUE).content(requestJson)) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) .andReturn();System.out.println(result.getResponse().getContentAsString()); } catch (Exception e) {e.printStackTrace();}}//查询solr方法@Testpublic void querySolrIndex(){MvcResult result;ObjectMapper mapper = new ObjectMapper(); ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter(); QuerySolrIndexRequest request = new QuerySolrIndexRequest();try {request.setCoreName("test_core");request.setQuery("analyzeTime:2");java.lang.String requestJson = ow.writeValueAsString(request);result = mockMvc.perform(get("/solr/querySolrIndex").contentType(MediaType.APPLICATION_JSON_VALUE).content(requestJson)) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))// 预期返回值的媒体类型text/plain;charset=UTF-8 .andReturn();System.out.println(result.getResponse().getContentAsString()); } catch (Exception e) {e.printStackTrace();}}}
solr插入数据的controller:
import java.util.Map;import javax.annotation.Resource;import org.apache.solr.common.SolrDocumentList;import org.apache.solr.common.SolrInputDocument;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.xx.external.api.service.solr.SolrService;import com.xx.module.base.BaseResponse;import com.xx.module.request.PushDataIntoSolrRequest;import com.xx.module.request.QuerySolrIndexRequest;@Controller@RequestMapping(value = "/solr")public class SolrController {@Resourceprivate SolrService solrService;/** * 添加入solr索引 */@RequestMapping(value = "/pushDataIntoSolr" , method = RequestMethod.POST)public BaseResponse pushDataIntoSolr(@RequestBody PushDataIntoSolrRequest request){BaseResponse ress = new BaseResponse();SolrInputDocument input = new SolrInputDocument();for (Map.Entry<String, Object> entry : request.getInput().entrySet()) {input.addField(entry.getKey(), entry.getValue());}if (!solrService.pushDataIntoSolr(request.getCoreName(), input)){ress.setErrorCode("500");ress.setErrorMsg("插入失败,请稍候重试。");} else {ress.setSubMsg("请求成功,数据插入成功。");}return ress;}/** * 按条件查询搜索引擎 */ @RequestMapping(value = "/querySolrIndex" , method = RequestMethod.GET)public SolrDocumentList querySolrIndex(@RequestBody QuerySolrIndexRequest request){return solrService.querySolrIndex(request.getCoreName(), request.getQuery());}}
封装的请求类和响应类
import java.util.Map;import javax.validation.constraints.NotNull;/** *@ClassName:PushDataIntoSolrRequest.java *@ClassDescribe:solr存储请求类 *@author:chenxi *@createDate:2017年9月29日 上午9:44:20 *@version */public class PushDataIntoSolrRequest implements Serializable {private static final long serialVersionUID = 1L;/** * 核心名称 */@NotNullprivate String coreName ;/** * 存储实体 */@NotNullprivate Map<String, Object> input;public String getCoreName() {return coreName;}public void setCoreName(String coreName) {this.coreName = coreName;}public Map<String, Object> getInput() {return input;}public void setInput(Map<String, Object> input) {this.input = input;}}public class QuerySolrIndexRequest implements Serializable {private static final long serialVersionUID = 1L;/** * 核心名称 */private String coreName ;/** * 查询条件 */private String query;public String getCoreName() {return coreName;}public void setCoreName(String coreName) {this.coreName = coreName;}public String getQuery() {return query;}public void setQuery(String query) {this.query = query;}}public class BaseResponse implements Serializable {private static final long serialVersionUID = -1864470087731542406L;private String errorCode;private String errorMsg;private String subCode;private String subMsg;/** * @return the errorCode */public String getErrorCode() {return errorCode;}/** * @param errorCode * the errorCode to set */public void setErrorCode(String errorCode) {this.errorCode = errorCode;}/** * @return the errorMsg */public String getErrorMsg() {return errorMsg;}/** * @param errorMsg * the errorMsg to set */public void setErrorMsg(String errorMsg) {this.errorMsg = errorMsg;}/** * @return the subCode */public String getSubCode() {return subCode;}/** * @param subCode * the subCode to set */public void setSubCode(String subCode) {this.subCode = subCode;}/** * @return the subMsg */public String getSubMsg() {return subMsg;}/** * @param subMsg * the subMsg to set */public void setSubMsg(String subMsg) {this.subMsg = subMsg;}public boolean isSuccess() {return this.errorCode == null && this.subCode == null && this.errorMsg == null && this.subMsg == null;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}}服务层接口和具体实现
import org.apache.solr.common.SolrDocumentList;import org.apache.solr.common.SolrInputDocument;/** *@ClassName:SolrService.java *@ClassDescribe:操作solr *@author:chenxi *@createDate:2017年9月28日 下午2:25:53 *@version */public interface SolrService {/** *@ClassDescribe:向solr插入数据 *@author:chenxi *@createDate:2017年9月28日 下午2:26:58 *@param coreName 核心名称 *@param input 数据封装 *@return */public boolean pushDataIntoSolr(String coreName ,SolrInputDocument input);/** *@ClassDescribe:按条件查询搜索引擎 *@author:chenxi *@createDate:2017年9月28日 下午4:37:12 *@param query solr查询条件 *@return 返回查询集合 */public SolrDocumentList querySolrIndex(String coreName, String query);}
import java.io.IOException; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrInputDocument; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Service; import com.xx.xx.xx.service.solr.SolrService; @Service @ConfigurationProperties(prefix = "solr") public class SolrServiceImpl implements SolrService { private Logger logger = LoggerFactory.getLogger(SolrServiceImpl.class); private String httpSolrClient; private static SolrClient solr; public String getHttpSolrClient() { return httpSolrClient; } public void setHttpSolrClient(String httpSolrClient) { this.httpSolrClient = httpSolrClient; } private HttpSolrClient connetHttpSolrClientServer(String coreName){ HttpSolrClient server = new HttpSolrClient(httpSolrClient + coreName); server.setSoTimeout(5000); server.setConnectionTimeout(1000); server.setDefaultMaxConnectionsPerHost(1000); server.setMaxTotalConnections(5000); return server; } /** *@ClassDescribe:向solr插入数据 *@author:chenxi *@param coreName 核心名称 *@param input 数据封装 * @return */ @Override public boolean pushDataIntoSolr(String coreName, SolrInputDocument input) { boolean flag = false; try { solr = connetHttpSolrClientServer(coreName); solr.add(input); solr.commit(); flag = true; } catch (Exception e) { e.printStackTrace(); logger.error(e.getMessage()); } finally { try { solr.close(); } catch (IOException e) { e.printStackTrace(); logger.error(e.getMessage()); } } return flag; } /** *@ClassDescribe:按条件查询搜索引擎 *@author:chenxi *@param query solr查询条件 *@return 返回查询集合 */ @Override public SolrDocumentList querySolrIndex(String coreName, String query) { SolrDocumentList list = null; try { solr = connetHttpSolrClientServer(coreName); QueryResponse rsp = null; SolrQuery queryStr = new SolrQuery("*:*"); queryStr.addFilterQuery(query); rsp = solr.query(queryStr); list = rsp.getResults(); } catch (IOException | SolrServerException e) { e.printStackTrace(); logger.error(e.getMessage()); } catch (Exception e) { e.printStackTrace(); logger.error(e.getMessage()); } finally { try { solr.close(); } catch (IOException e) { e.printStackTrace(); logger.error(e.getMessage()); } } return list; } }最后在application.xml指定solr的url
solr.httpSolrClient=http://127.0.0.1:8983/solr/
如果solr是集群的 请参考: http://blog.csdn.net/qq_20261343/article/details/50706705,具体没测试。
至此,solr集成springboot推送数据和查询数据完成!
阅读全文
0 1
- solr集成springboot并向solr推送索引数据更新和查询
- solr导入oracle数据并创建索引
- 使用Solr索引查询Mysql数据
- solr的索引更新
- Solr更新、删除索引
- solr创建查询索引
- Solr之查询索引。
- solr 5.5.2 集成mysql 索引增量权利更新
- java 测试 solr更新和查询
- springboot构建solr查询实例
- 数据索引---Solr DIH
- [solr] - 索引数据删除
- [solr] - 索引数据删除
- Solr索引数据删除
- solr 索引数据删除
- Solr索引和基本数据操作
- 集成Nutch和Solr
- 【Solr】solr删除全部索引数据
- rest api 身份验证
- 两个数交换的三种方法
- 安卓布局——ViewPager布局
- SpringMVC工作原理
- iPhone X全屏适配
- solr集成springboot并向solr推送索引数据更新和查询
- SQL必知必会
- CUDA编程主函数模板及实例
- 深入浅出REST
- Spring框架——IOC&DI
- linux 普通用户 root用户无法使用第三方工具正常登录
- BZOJ4382: [POI2015]Podział naszyjnika
- MySQL 正则表达式
- Live555 RtspClient会话管理