pom
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--test--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-solr</artifactId> </dependency>
代码:
package com.example.solrdemo.controller;import com.example.solrdemo.pojo.TbItem;import com.example.solrdemo.pojo.TbItemDesc;import com.example.solrdemo.repository.TbItemDescRepository;import com.example.solrdemo.repository.TbItemRepository;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.response.QueryResponse;import org.apache.solr.common.SolrDocument;import org.apache.solr.common.SolrDocumentList;import org.apache.solr.common.SolrInputDocument;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.test.context.junit4.SpringRunner;import org.springframework.web.bind.annotation.RequestMapping;import java.io.IOException;import java.util.List;import java.util.Map;import java.util.UUID;@SpringBootTest@RunWith(SpringRunner.class)public class SolrControllerTest { @Autowired private SolrClient client; @Autowired TbItemRepository repository; @Autowired TbItemDescRepository tbItemDescRepository; //录入数据 @Test public void luru() throws IOException, SolrServerException { List<TbItem> list = repository.findAll(); for (TbItem item:list){ SolrInputDocument doc = new SolrInputDocument(); doc.setField("id", item.getId()); doc.setField("item_title", item.getTitle()); doc.setField("item_sell_point", item.getSellPoint()); doc.setField("item_price", item.getPrice()); doc.setField("item_image", item.getImage()); doc.setField("item_category", item.getCid()); TbItemDesc des = tbItemDescRepository.findById(item.getId()).get(); if (des!=null&&des.getItemDesc()!=null){ doc.setField("item_desc",des.getItemDesc() ); } client.add("collection1", doc); client.commit("collection1"); System.out.println(item); } } //增加 @Test public void teAdd() { try { SolrInputDocument doc = new SolrInputDocument(); doc.setField("id", "test001"); doc.setField("item_title", "测试商品"); doc.setField("item_price", "123213"); client.add("collection1", doc); //client.commit(); client.commit("collection1"); } catch (Exception e) { e.printStackTrace(); } } //查询 @Test public void getById() throws IOException, SolrServerException { SolrDocument document = client.getById("collection1", "test001"); System.out.println(document); } @Test public void slelectParm() throws IOException, SolrServerException { SolrQuery params = new SolrQuery(); //查询条件, 这里的 q 对应 下面图片标红的地方 params.set("q", "魔音"); //匹配title含有手机的 //过滤条件 //params.set("fq", "item_price:[100 TO 100000]"); //排序 // params.addSort("item_price", SolrQuery.ORDER.asc); //分页 params.setStart(0); params.setRows(20); //默认域 //params.set("df", "item_title");//搜索匹配的对象,值匹配item_title存在的关键字 params.set("df", "item_keywords");//使用复制域做搜索对象,可以匹配多个对象 //只查询指定域 params.set("fl", "id,item_title,item_price,item_sell_point,item_desc");//搜索返回的数据项 //高亮 //打开开关 params.setHighlight(true); //指定高亮域 params.addHighlightField("item_title"); //设置前缀 params.setHighlightSimplePre("<span style='color:red'>"); //设置后缀 params.setHighlightSimplePost("</span>"); QueryResponse queryResponse = client.query(params); SolrDocumentList results = queryResponse.getResults(); long numFound = results.getNumFound(); System.out.println(numFound); Map<String, Map<String, List<String>>> highlight = queryResponse.getHighlighting();//获取高亮显示的结果, 高亮显示的结果和查询结果是分开放的 for (SolrDocument result : results) { System.out.println(result.get("id")); System.out.println(result.get("item_title")); System.out.println(result.get("item_price")); Map<String, List<String>> map = highlight.get(result.get("id")); List<String> list = map.get("item_title"); System.out.println(list.get(0)); System.out.println("------------------"); System.out.println(); } } /* /** * 根据id删除索引 * @param id * @return */ public String delete(String id) { try { client.deleteById("collection1",id); client.commit("collection1"); return id; } catch (Exception e) { e.printStackTrace(); } return "error"; } /** * 删除所有的索引 * @return */ public String deleteAll(){ try { client.deleteByQuery("collection1","*:*"); client.commit("collection1"); return "success"; } catch (Exception e) { e.printStackTrace(); } return "error"; }}
sorl的域配置:
<field name="item_title" type="text_ik" indexed="true" stored="true"/><field name="item_sell_point" type="text_ik" indexed="true" stored="true"/><field name="item_price" type="text_ik" indexed="true" stored="true"/><field name="item_image" type="text_ik" indexed="true" stored="true"/><field name="item_category" type="text_ik" indexed="true" stored="true"/><field name="item_desc" type="text_ik" indexed="true" stored="false"/><field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/><copyField source="item_title" dest="item_keywords"/><copyField source="item_sell_point" dest="item_keywords"/><copyField source="item_category" dest="item_keywords"/><copyField source="item_desc" dest="item_keywords"/>