solr常用api
package com.tongzhi.solr; import java.util.List; import java.util.Map; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery.ORDER; import org.apache.solr.client.solrj.impl.HttpSolrServer; 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.Before; import org.junit.Test; import com.tongzhi.vo.SolrItem; /** * solr的添加修改 * @author shan * */ public class SolrTest { private HttpSolrServer httpSolrServer; @Before public void setUp(){ // 初始化httpSolrServer;参数为solr的访问地址 httpSolrServer = new HttpSolrServer("http://localhost:8080/solr"); } /** * 查询索引方式一 * @throws Exception */ @Test public void testSearch1() throws Exception{ //创建查询对象 SolrQuery solrQuery = new SolrQuery(); //搜索标题中包含手机并且状态为1的文档 solrQuery.setQuery("title:手机 AND status:1"); //设置过滤条件,在上面的过滤条件之后再加下面的条件 //返回的数据价格在300000-800000(不包含800000) solrQuery.setFilterQueries("price:[300000 TO 800000]"); //设置排序,根据价格降序排序 solrQuery.setSort("price", ORDER.desc); //设置分页 solrQuery.setStart(0); //设置起始索引号 solrQuery.setRows(10); //页大小 //设置高亮 solrQuery.setHighlight(true); solrQuery.addHighlightField("title"); //添加需要高亮显示的域 solrQuery.setHighlightSimplePre("<em>"); //高亮前缀标签 solrQuery.setHighlightSimplePost("</em>"); //高亮后缀标签] //查询 QueryResponse response = httpSolrServer.query(solrQuery); //获取总记录数 long total = response.getResults().getNumFound(); System.out.println("本次查询到的总记录数为:" + total); //获取结果列表 List<SolrItem> list = response.getBeans(SolrItem.class); //处理高亮标题 if (list != null) { //获得高亮数据 Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); //遍历所有数据 for (SolrItem item : list) { System.out.println("-------------------------------------"); System.out.println("id = " + item.getId()); System.out.println("原标题title = " + item.getTitle()); System.out.println("高亮标题title = " + highlighting.get(item.getId().toString()).get("title").get(0)); System.out.println("price = " + item.getPrice()); System.out.println("image = " + item.getImage()); System.out.println("sellPoint = " + item.getSellPoint()); //因为在schema.xml时没有设置该域是存储的所以为null,但是设置了要索引,所以可以进行搜索 System.out.println("status = " + item.getStatus()); } } } /** * 查询索引方式二 * @throws Exception */ @Test public void testSearch2() throws Exception{ //创建查询对象 SolrQuery solrQuery = new SolrQuery(); //搜索标题中包含手机并且状态为1的文档 solrQuery.setQuery("title:手机 AND status:1"); //设置过滤条件,在上面的过滤条件之后再加下面的条件 //返回的数据价格在300000-800000(不包含800000) solrQuery.setFilterQueries("price:[300000 TO 800000]"); //设置排序,根据价格降序排序 solrQuery.setSort("price", ORDER.desc); //设置分页 solrQuery.setStart(0); //设置起始索引号 solrQuery.setRows(10); //页大小 //设置高亮 solrQuery.setHighlight(true); solrQuery.addHighlightField("title"); //添加需要高亮显示的域 solrQuery.setHighlightSimplePre("<em>"); //高亮前缀标签 solrQuery.setHighlightSimplePost("</em>"); //高亮后缀标签] //查询 QueryResponse response = httpSolrServer.query(solrQuery); //获取总记录数 long total = response.getResults().getNumFound(); System.out.println("本次查询到的总记录数为:" + total); //获取结果列表 SolrDocumentList results = response.getResults(); //处理高亮标题 if (results != null) { //获得高亮数据 Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); //遍历所有数据 for (SolrDocument solrDocument : results) { System.out.println("-------------------------------------"); System.out.println("id = " + solrDocument.get("id")); System.out.println("原标题title = " + solrDocument.get("title")); System.out.println("高亮标题title = " + highlighting.get(solrDocument.get("id").toString()).get("title").get(0)); System.out.println("price = " + solrDocument.get("price")); System.out.println("image = " + solrDocument.get("image")); System.out.println("sellPoint = " + solrDocument.get("sellPoint")); //因为在schema.xml时没有设置该域是存储的所以为null,但是设置了要索引,所以可以进行搜索 System.out.println("status = " + solrDocument.get("status")); } } } /** * 添加方式一:SolrInputDocument * * @throws Exception */ @Test public void testAddDocument() throws Exception{ // 创建SolrInputDocument对象,通过它来添加一个个的域 SolrInputDocument solrInputDocument = new SolrInputDocument(); // 参数1:域的名称,域的名称必须是在schema.xml中定义的; // 参数2:域的值 // 注意:id的域不能少 solrInputDocument.addField("id", 123L); solrInputDocument.addField("title", "通过代码添加--solrInputDocument方式"); solrInputDocument.addField("price", 2000L); solrInputDocument.addField("sellPoint", "我会Java编程"); solrInputDocument.addField("image", "http://image.taotao.com/jd/b43e6da16b414d7eb372863f502034b1.jpg"); solrInputDocument.addField("status", 1); // 将文档添加到索引库索引化 httpSolrServer.add(solrInputDocument); // 提交,在更新solr后要记得提交 httpSolrServer.commit(); } /** * 方式一:Bean * * @throws Exception */ @Test public void testAddBean() throws Exception{ //创建提交的对象 SolrItem solrItem = new SolrItem(); solrItem.setId(124L); solrItem.setTitle("通过代码添加--bean方式"); solrItem.setImage("http://image.taotao.com/jd/b43e6da16b414d7eb372863f502034b1.jpg"); solrItem.setPrice(2000L); solrItem.setSellPoint("我会Java编程"); solrItem.setStatus(1); // 将文档添加到索引库索引化 httpSolrServer.addBean(solrItem); // 提交,在更新solr后要记得提交 httpSolrServer.commit(); } /** * 根据ID删除索引文档 * @throws Exception */ @Test public void testDeleteById() throws Exception{ // 指定要删除的文档id域对应的值 httpSolrServer.deleteById("123"); //提交删除 httpSolrServer.commit(); } /** * 根据条件删除索引文档 * 删除所有 * @throws Exception */ @Test public void testDeleteByQuery() throws Exception{ // 根据条件删除索引文档 httpSolrServer.deleteByQuery("title:代码"); //删除所有的索引文档 //httpSolrServer.deleteByQuery("*:*"); //提交删除 httpSolrServer.commit(); } } ================================================================= SolrParams solrParams=new SolrQuery("(id:2 OR id:3) AND (id:3 OR id:4)"); package cn.flyflyyun.Solrj; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; 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.params.SolrParams; import org.junit.Test; import java.util.List; import java.util.Map; /** * 查询索引 */ public class SolrJQuery { /** * 通过遍历document * @throws SolrServerException */ @Test public void queryIndex() throws SolrServerException { //1.连接Solr服务器 HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/core1"); //2.初始化查询对象(设置查询条件) SolrParams params = new SolrQuery("*:*"); //3.执行查询,并获得查询结果集 QueryResponse query = solrServer.query(params); SolrDocumentList documentList = query.getResults(); System.out.println("共查询到"+documentList.getNumFound()+"条结果"); //4.获得查询字段 for (SolrDocument document : documentList) { System.out.println("id:"+document.getFieldValue("id")); System.out.println("title"+document.getFieldValue("title")); } } /** * 返回Bean * @throws SolrServerException */ @Test public void testBeanQuery() throws SolrServerException { //1.连接Solr服务器 HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/core1"); //2.初始化查询对象(设置查询条件) //SolrParams params = new SolrJQuery("*:*"); //查询所有 //SolrParams params = new SolrQuery("id:5 OR id:6"); //布尔查询 OR //查询Id不是5的数据,布尔查询 NOT //SolrParams params = new SolrQuery("NOT id:5"); //查询id为5且title为"迷惘开头的索引",布尔查询 and //SolrParams params = new SolrQuery("id:5 and title:迷惘*"); //相似度查询,最大修改次为2 //SolrParams params = new SolrQuery("title:挪威的天空~2"); //范围查询(TO区分大小写,必须写大写) SolrParams params = new SolrQuery("title:华夏 OR id:[4 TO 7]"); //3.执行查询,并获得查询结果集 QueryResponse query = solrServer.query(params); //把查询结果封装到Item对象中(如果分页,就只封装当前页数据) List<Item> list = query.getBeans(Item.class); System.out.println("共查询到"+query.getResults().getNumFound()+"条结果"); //4.获得查询字段(遍历List集合) for (Item item : list) { System.out.println("id"+item.getId()); System.out.println("title"+item.getTitle()); } } /** * 排序查询 * @throws SolrServerException */ @Test public void testSortQuery() throws SolrServerException { //1.连接Solr服务器 HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/core1"); //范围查询(TO区分大小写,必须写大写) SolrQuery query = new SolrQuery("id:[4 TO 7]"); //设置排序 query.setSort("id", SolrQuery.ORDER.desc); //3.执行查询,并获得查询结果集 QueryResponse response = solrServer.query(query); //把查询结果封装到Item对象中(如果分页,就只封装当前页数据) List<Item> list = response.getBeans(Item.class); System.out.println("共查询到"+response.getResults().getNumFound()+"条结果"); //4.获得查询字段(遍历List集合) for (Item item : list) { System.out.println("id"+item.getId()); System.out.println("title"+item.getTitle()); } } /** * 分页查询 * @throws SolrServerException */ @Test public void testPageQuery() throws SolrServerException { //准备分页参数 int pageNum=2; //页码 int pageSize=2; //每页显示多少条数据 //1.连接Solr服务器 HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/core1"); //范围查询(TO区分大小写,必须写大写) SolrQuery query = new SolrQuery("id:[4 TO 7]"); //设置排序 query.setSort("id", SolrQuery.ORDER.desc); //设置分页 query.setStart((pageNum-1)*pageSize); //从哪个索引开始查询 query.setRows(pageSize); //每页多少数据 //3.执行查询,并获得查询结果集 QueryResponse response = solrServer.query(query); //把查询结果封装到Item对象中(如果分页,就只封装当前页数据) List<Item> list = response.getBeans(Item.class); System.out.println("共查询到"+response.getResults().getNumFound()+"条结果"); //4.获得查询字段(遍历List集合) for (Item item : list) { System.out.println("id"+item.getId()); System.out.println("title"+item.getTitle()); } } /** * 高亮显示 * @throws SolrServerException */ @Test public void testHighLightingQuery() throws SolrServerException { //1.连接Solr服务器 HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/core1"); //范围查询(TO区分大小写,必须写大写) SolrQuery query = new SolrQuery("title:挪威"); //设置排序 query.setSort("id", SolrQuery.ORDER.desc); //设置高亮 //设置前置标签 query.setHighlightSimplePre("<em>"); //设置后置标签 query.setHighlightSimplePost("</em>"); //设置高亮字段 query.addHighlightField("title"); query.addHighlightField("id"); //3.执行查询,并获得查询结果集 QueryResponse response = solrServer.query(query); //把查询结果封装到Item对象中(如果分页,就只封装当前页数据) List<Item> list = response.getBeans(Item.class); //返回高亮的结果集(id(key):field(value)) Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); System.out.println("共查询到"+response.getResults().getNumFound()+"条结果"); //4.获得查询字段(遍历List集合) for (Item item : list) { System.out.println("id:"+item.getId()); //System.out.println("id:"+highlighting.get(item.getId()).get("id").get(0)); System.out.println("title:"+highlighting.get(item.getId()).get("title").get(0)); } } } ====================================================== package com.kang.solrj.service; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import com.kang.solrj.pojo.Foo; public class SolrjService { // 定义http的solr服务 private HttpSolrServer httpSolrServer; public SolrjService(HttpSolrServer httpSolrServer) { this.httpSolrServer = httpSolrServer; } public void add(Foo foo) throws Exception { this.httpSolrServer.addBean(foo); //添加数据到solr服务器 this.httpSolrServer.commit(); //提交 } public void delete(List<String> ids) throws Exception { this.httpSolrServer.deleteById(ids); this.httpSolrServer.commit(); //提交 } public List<Foo> search(String keywords, Integer page, Integer rows) throws Exception { SolrQuery solrQuery = new SolrQuery(); //构造搜索条件 solrQuery.setQuery("title:" + keywords); //搜索关键词 // 设置分页 start=0就是从0开始,,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了。 solrQuery.setStart((Math.max(page, 1) - 1) * rows); solrQuery.setRows(rows); //是否需要高亮 boolean isHighlighting = !StringUtils.equals("*", keywords) && StringUtils.isNotEmpty(keywords); if (isHighlighting) { // 设置高亮 solrQuery.setHighlight(true); // 开启高亮组件 solrQuery.addHighlightField("title");// 高亮字段 solrQuery.setHighlightSimplePre("<em>");// 标记,高亮关键字前缀 solrQuery.setHighlightSimplePost("</em>");// 后缀 } // 执行查询 QueryResponse queryResponse = this.httpSolrServer.query(solrQuery); List<Foo> foos = queryResponse.getBeans(Foo.class); if (isHighlighting) { // 将高亮的标题数据写回到数据对象中 Map<String, Map<String, List<String>>> map = queryResponse.getHighlighting(); for (Map.Entry<String, Map<String, List<String>>> highlighting : map.entrySet()) { for (Foo foo : foos) { if (!highlighting.getKey().equals(foo.getId().toString())) { continue; } foo.setTitle(StringUtils.join(highlighting.getValue().get("title"), "")); break; } } } return foos; } } ======================= Skip to content Search or jump to… package solr.exe; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; 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 java.io.IOException; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** * 增删改都需要提交事务 * @author lxt * @date 2019-09-04 */ public class SolrTest { private final static String BASE_URL="http://192.168.43.184:8080/solr/"; /** * 增改 * @throws IOException * @throws SolrServerException */ @Test public void testAdd() throws IOException, SolrServerException { SolrServer solrServer=new HttpSolrServer(BASE_URL); SolrInputDocument doc=new SolrInputDocument(); doc.addField("title_ik1","腾讯音乐"); doc.addField("title_ik","百度云音乐"); doc.addField("id","001"); solrServer.add(doc); solrServer.commit(); } /** * 删除 * @throws IOException * @throws SolrServerException */ @Test public void testDelete() throws IOException, SolrServerException { SolrServer client=new HttpSolrServer(BASE_URL); client.deleteById("002"); //client.deleteByQuery("*:*"); client.commit(); } /** * 查询 * @throws IOException * @throws SolrServerException */ @Test public void testQuery() throws IOException, SolrServerException { SolrServer client=new HttpSolrServer(BASE_URL); //查询条件 SolrQuery query=new SolrQuery(); //q query.setQuery("title_ik:音乐"); //分页 query.setStart(0); query.setRows(10); query.setHighlight(true); final String highLightField="title_ik"; query.addHighlightField(highLightField); //前缀便签,后缀标签 query.setHighlightSimplePost("<span style='color:red'>"); query.setHighlightSimplePre("</span>"); QueryResponse response = client.query(query); //response SolrDocumentList results = response.getResults(); //highlighting highlighting和response和responseHeader都是同一数据级别 Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); //solr 8支持lambda for (SolrDocument x : results) { System.out.println(x.getFieldValue("title_ik")); System.out.println(x.getFieldValue("title_ik1")); //第一个是key是id的值 Map<String, List<String>> stringListMap = highlighting.get(x.getFieldValue("id")); if (!stringListMap.isEmpty()){ List<String> strings = stringListMap.get(highLightField); //正常业务逻辑是要返回实体类的,没有该字段的值就应该返回未高亮的 System.out.println(strings.get(0)); } } } } ================================== package org.ten.mue; 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.beans.DocumentObjectBinder; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.client.solrj.response.UpdateResponse; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrInputDocument; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * Created by yang_yancy on 2016/8/21. * Solr Demo * 参考资料 * http://wiki.apache.org/solr/IntegratingSolr?highlight=%28%28SolJava%29%29#Java * http://wiki.apache.org/solr/Solrj */ public class SolrDemo { public static String solrURL = "http://localhost:8080/solr/core1"; public static void main(String[] args) { //addDoc(); //addDoc2(); //addDoc3(); queryDoc(); //delDoc(); //delDoc2(); //delDoc3(); } /**SolrClient solr = new HttpSolrClient(solrURL); * 查询 */ public static void queryDoc(){ SolrClient solr = new HttpSolrClient(solrURL); SolrQuery solrQuery = new SolrQuery(); //solrQuery.setQuery("*ten*"); solrQuery.setQuery("name:ten* id:9988"); solrQuery.setFields("id", "name", "price");//需要返回的数据 //solrQuery.setRows(Integer.MAX_VALUE);//查询文档中所有符合条件的数据 solrQuery.setStart(0);//从文档中第0条数据开始检索,默认时从第0条开始 solrQuery.setRows(10); solrQuery.setSort("price", SolrQuery.ORDER.desc);//排序方式 //只有当设置了分词后,高亮才会有效果 /*solrQuery.setHighlight(true); solrQuery.addHighlightField("name");//高亮显示字段 solrQuery.setHighlightSimplePre("<font color='red'>");//标记高亮关键字前缀 solrQuery.setHighlightSimplePost("</font>");//标记高亮关键字后缀*/ try { QueryResponse response = solr.query(solrQuery); SolrDocumentList list = response.getResults(); System.out.println("文档个数:" + list.getNumFound()); System.out.println("查询耗时:" + response.getQTime()); //普通方式处理查询结果 /*for (SolrDocument document : list){ System.out.println(document.getFieldValue("id")); System.out.println(document.getFieldValue("name")); System.out.println(document.getFieldValue("price")); }*/ //绑定JavaBean对象处理查询结果 DocumentObjectBinder documentObjectBinder = new DocumentObjectBinder(); List<SolrBean> solrBeanList = documentObjectBinder.getBeans(SolrBean.class, list); for (SolrBean solrBean : solrBeanList){ System.out.println("id:" + solrBean.getId()); System.out.println("name:" + solrBean.getName()); System.out.println("price:" + solrBean.getPrice()); } } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 方法一 * 创建索引 */ public static void addDoc() { SolrClient solr = new HttpSolrClient(solrURL); SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", "9988"); doc.addField("name", "my name is yancy"); doc.addField("price", "49.9"); try { UpdateResponse response = solr.add(doc); solr.commit(); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 方法二 * 创建索引 */ public static void addDoc2(){ SolrClient solr = new HttpSolrClient(solrURL); Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>(); for(int i = 0;i <= 1000000;i++){ SolrInputDocument solrDocument = new SolrInputDocument(); solrDocument.addField("id", "100" + i); solrDocument.addField("name", "my name is mue" + i); solrDocument.addField("price", "45.7" + i); docs.add(solrDocument); } try { solr.add(docs); solr.commit(); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 方法三 * 通过对象的方式添加索引 */ public static void addDoc3(){ SolrClient solr = new HttpSolrClient(solrURL); Collection<SolrBean> docs = new ArrayList<SolrBean>(); DocumentObjectBinder documentObjectBinder = new DocumentObjectBinder(); for (int i = 0;i < 10;i++){ SolrBean solrBean = new SolrBean(); solrBean.setId("200" + i); solrBean.setName("ten" + i); solrBean.setPrice(22 + i); SolrInputDocument doc = documentObjectBinder.toSolrInputDocument(solrBean); docs.add(solrBean); } try { solr.addBeans(docs); solr.commit(); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 方法一 * 删除指定索引 */ public static void delDoc(){ SolrClient solr = new HttpSolrClient(solrURL); try { solr.deleteById("2001");//根据id删除索引 //solr.deleteByQuery("name:ten0");//根据指定字段删除索引 solr.commit(); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 方法二 * 删除指定索引 */ public static void delDoc2(){ SolrClient solr = new HttpSolrClient(solrURL); List<String> list = new ArrayList<String>(); for(int i = 0;i < 5;i++){ list.add("200" + i);//根据id删除 } try { UpdateResponse response = solr.deleteById(list); solr.commit(); System.out.println(response.getStatus()); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 方法三 * 清空所有索引 */ public static void delDoc3(){ SolrClient solr = new HttpSolrClient(solrURL); try { UpdateResponse response = solr.deleteByQuery("*:*"); solr.commit(); System.out.println(response.getStatus()); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } ============================================== package com.test.solrj; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.client.solrj.response.UpdateResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrInputDocument; import org.junit.Before; import org.junit.Test; import java.util.List; import java.util.Map; /** * @author chengzhengbo * @Date 2017/11/20 * @TIME 上午11:31 */ public class SolrClient { private static final String URL = "http://localhost:8080/solr-4.1.0/"; private HttpSolrClient server = null; @Before public void init() { // 创建 server server = new HttpSolrClient(URL); } @Test public void addDoc() { SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", "id"); doc.addField("title", "document"); try { UpdateResponse response = server.add(doc); // 提交 server.commit(); System.out.println("########## Query Time :" + response.getQTime()); System.out.println("########## Elapsed Time :" + response.getElapsedTime()); System.out.println("########## Status :" + response.getStatus()); } catch (Exception e) { System.err.print(e); } } /** * 查询 */ @Test public void queryTest() { String query = "*:*"; SolrQuery solrQuery = new SolrQuery(query); //查询语法 // solrQuery.set("q","id:carver"); //过滤插叙 // solrQuery.set("fq","id:carver"); //排序 // solrQuery.setSort("id", SolrQuery.ORDER.desc); //分页 // int pageSize = 1; // int rows = 222; // int start = rows*(pageSize-1); // solrQuery.setStart(start); // solrQuery.setRows(rows); //开启高亮 solrQuery.setHighlight(true); solrQuery.setQuery("title:cainiao"); //高亮字段 solrQuery.addHighlightField("title"); //前缀标志 solrQuery.setHighlightSimplePre("<span color=red>"); //后缀标志 solrQuery.setHighlightSimplePost("</span>"); //用于调试程序 System.out.println(solrQuery+"=========="); try { //相应查询 QueryResponse response = null; response = server.query(solrQuery); //匹配文档 SolrDocumentList solrDocumentList = response.getResults(); System.out.println("总共" + solrDocumentList.getNumFound() + "条记录"); //从响应中获取高亮信息 Map<String, Map<String, List<String>>> map = response.getHighlighting(); for (SolrDocument doc : solrDocumentList) { System.out.println("id : " + doc.get("id") + " title : " + doc.get("title")); //取出高亮信息 if(map!=null){ //根据id取出高亮信息 String id = (String) doc.get("id"); Map<String, List<String>> idMap = map.get(id); //取出高亮字段信息 List<String> title = idMap.get("title"); if(title!=null) { for (int i = 0; i < title.size(); i++) { System.out.println("title=====" + " " + title.get(i)); } } } } } catch (Exception e) { e.printStackTrace(); } } @Test public void updateTest() { SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", "czb"); doc.addField("title", "java think "); try { UpdateResponse add = server.add(doc); System.out.println(add.getRequestUrl()); System.out.println(add.getElapsedTime()); System.out.println(add.getResponse()); System.out.println(add.getElapsedTime()); //查询 queryTest(); } catch (Exception e) { e.printStackTrace(); } } } ================================== import com.baidu.Item; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; 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 java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * @auther SyntacticSugar * @data 2018/11/24 0024下午 11:31 */ public class SolrJTest { @Test public void test() throws IOException, SolrServerException { HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); SolrInputDocument document = new SolrInputDocument(); document.addField("id", "4"); document.addField("title", "五菱宏光,神车"); document.addField("price", 30000F); // server.add(document); //提交 server.commit(); } /** * pojo中属性没有注解@Field,导致solrJ并不知道哪个属性要对应到索引库中 * * @throws IOException * @throws SolrServerException */ @Test public void testCreateIndexBean() throws IOException, SolrServerException { HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); // Item item = new Item(); item.setId("9"); item.setPrice(3000F); item.setTitle("小米手机"); // server中添加bean server.addBean(item); server.commit(); } /** * testDeleteIndexById * 根据id 删除 */ @Test public void testDeleteIndexById() throws IOException, SolrServerException { //使用solrj的jar HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); server.deleteById("1"); server.commit(); } /** * 根据查询条件删除索引 */ @Test public void testDeleteIndexByQuery() throws IOException, SolrServerException { HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); server.deleteByQuery("title:iphone"); server.commit(); } /** * query返回document 的形式 */ @Test public void testQueryToDocument() throws IOException, SolrServerException { HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); //public class SolrQuery extends ModifiableSolrParams SolrQuery query = new SolrQuery("title:手机"); //public QueryResponse query(SolrParams params) QueryResponse response = server.query(query); SolrDocumentList list = response.getResults(); /** * 遍历list ,取出document */ for (SolrDocument entries : list) { System.out.println(entries.getFieldValue("id")); System.out.println(entries.getFieldValue("title")); System.out.println(entries.getFieldValue("price")); } System.out.println("查询的总条数:" + list.size()); } /** * query返回javabean 的形式 */ @Test public void testQueryToJavabean() throws IOException, SolrServerException { HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); /** * 普通查询 */ // SolrQuery query = new SolrQuery("title:iphone"); /** * boolean 查询 */ // SolrQuery query = new SolrQuery("title:iphone OR title:小米"); /** * 相似度查询 ,类似于Lucene的编辑距离0-2 */ // SolrQuery query = new SolrQuery("title:ipHOne~2"); /** * 范围查询 xx TO xx * 闭区间 */ SolrQuery query = new SolrQuery("price:[10 TO 10000]"); // QueryResponse response = server.query(query); List<Item> itemList = response.getBeans(Item.class); for (Item item : itemList) { System.out.println(item); } System.out.println("搜多到的条数:" + itemList.size()); } /** * 使用 solrj 查询排序 */ @Test public void testQueryOrder() throws SolrServerException { //连接solr服务器、创建query对象、设置查询排序参数 、查询 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); SolrQuery query = new SolrQuery("title:手机"); /**设置排序源码 * public SolrQuery setSort(String field, ORDER order) { * return setSort(new SortClause(field, order)); * } */ query.setSort("price", SolrQuery.ORDER.desc); QueryResponse response = server.query(query); // List<Item> itemList = response.getBeans(Item.class); for (Item item : itemList) { System.out.println(item.toString()); } System.out.println("搜索到的条数:" + itemList.size()); } /** * 使用 solrj 高亮显示 testHighlightingQuery * 1、set高亮标签,add高亮字段 * 2、高亮工具 */ @Test public void testHighlightingQuery() throws SolrServerException { //连接solr服务器、创建query对象、高亮、查询 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); SolrQuery query = new SolrQuery("title:手机"); // 标签、字段 query.setHighlightSimplePre("<em>"); query.setHighlightSimplePost("</em>"); query.addHighlightField("title"); // QueryResponse response = server.query(query); /** * 高亮的响应结果 是一个双层map : * id :对应id的高亮字段 * 高亮字段:高亮值 为list */ Map<String, Map<String, List<String>>> map = response.getHighlighting(); /** * 普通查询结果 */ List<Item> itemList = response.getBeans(Item.class); for (Item item : itemList) { System.out.println("id" + item.getId()); // 高亮值 为list System.out.println("title" + map.get(item.getId()).get("title").get(0)); System.out.println("price" + item.getPrice()); } System.out.println("搜索到的条数:" + itemList.size()); } /** * 分页 * 1、准备参数 * 2、设置到query中 */ @Test public void testPagedQuery() throws SolrServerException { //连接solr服务器、创建query对象、设置查询排序参数 、查询 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); SolrQuery query = new SolrQuery("title:手机"); // 设置分页 int currentPage = 2; final int PAGE_SIZE = 4; int start = (currentPage - 1) * PAGE_SIZE; // 设置起始页,设置每页显示数目 query.setStart(start); query.setRows(PAGE_SIZE); // QueryResponse response = server.query(query); List<Item> itemList = response.getBeans(Item.class); //展示数据 System.out.println("当前页:"+currentPage+"共查询数据:"+itemList.size()); for (Item item : itemList) { System.out.println("数据:"+item.toString()); } } } ===========================
package com.tongzhi.solr;
import java.util.List;import java.util.Map;
import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.SolrQuery.ORDER;import org.apache.solr.client.solrj.impl.HttpSolrServer;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.Before;import org.junit.Test;
import com.tongzhi.vo.SolrItem;
/** * solr的添加修改 * @author shan * */public class SolrTest {private HttpSolrServer httpSolrServer;@Beforepublic void setUp(){// 初始化httpSolrServer;参数为solr的访问地址httpSolrServer = new HttpSolrServer("http://localhost:8080/solr");}/** * 查询索引方式一 * @throws Exception */@Testpublic void testSearch1() throws Exception{//创建查询对象SolrQuery solrQuery = new SolrQuery();//搜索标题中包含手机并且状态为1的文档solrQuery.setQuery("title:手机 AND status:1");//设置过滤条件,在上面的过滤条件之后再加下面的条件//返回的数据价格在300000-800000(不包含800000)solrQuery.setFilterQueries("price:[300000 TO 800000]");//设置排序,根据价格降序排序solrQuery.setSort("price", ORDER.desc);//设置分页solrQuery.setStart(0);//设置起始索引号solrQuery.setRows(10);//页大小//设置高亮solrQuery.setHighlight(true);solrQuery.addHighlightField("title");//添加需要高亮显示的域solrQuery.setHighlightSimplePre("<em>");//高亮前缀标签solrQuery.setHighlightSimplePost("</em>");//高亮后缀标签]//查询QueryResponse response = httpSolrServer.query(solrQuery);//获取总记录数long total = response.getResults().getNumFound();System.out.println("本次查询到的总记录数为:" + total);//获取结果列表List<SolrItem> list = response.getBeans(SolrItem.class);//处理高亮标题if (list != null) {//获得高亮数据Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();//遍历所有数据for (SolrItem item : list) {System.out.println("-------------------------------------");System.out.println("id = " + item.getId());System.out.println("原标题title = " + item.getTitle());System.out.println("高亮标题title = " + highlighting.get(item.getId().toString()).get("title").get(0));System.out.println("price = " + item.getPrice());System.out.println("image = " + item.getImage());System.out.println("sellPoint = " + item.getSellPoint());//因为在schema.xml时没有设置该域是存储的所以为null,但是设置了要索引,所以可以进行搜索System.out.println("status = " + item.getStatus());}}}/** * 查询索引方式二 * @throws Exception */@Testpublic void testSearch2() throws Exception{//创建查询对象SolrQuery solrQuery = new SolrQuery();//搜索标题中包含手机并且状态为1的文档solrQuery.setQuery("title:手机 AND status:1");//设置过滤条件,在上面的过滤条件之后再加下面的条件//返回的数据价格在300000-800000(不包含800000)solrQuery.setFilterQueries("price:[300000 TO 800000]");//设置排序,根据价格降序排序solrQuery.setSort("price", ORDER.desc);//设置分页solrQuery.setStart(0);//设置起始索引号solrQuery.setRows(10);//页大小//设置高亮solrQuery.setHighlight(true);solrQuery.addHighlightField("title");//添加需要高亮显示的域solrQuery.setHighlightSimplePre("<em>");//高亮前缀标签solrQuery.setHighlightSimplePost("</em>");//高亮后缀标签]//查询QueryResponse response = httpSolrServer.query(solrQuery);//获取总记录数long total = response.getResults().getNumFound();System.out.println("本次查询到的总记录数为:" + total);//获取结果列表SolrDocumentList results = response.getResults();//处理高亮标题if (results != null) {//获得高亮数据Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();//遍历所有数据for (SolrDocument solrDocument : results) {System.out.println("-------------------------------------");System.out.println("id = " + solrDocument.get("id"));System.out.println("原标题title = " + solrDocument.get("title"));System.out.println("高亮标题title = " + highlighting.get(solrDocument.get("id").toString()).get("title").get(0));System.out.println("price = " + solrDocument.get("price"));System.out.println("image = " + solrDocument.get("image"));System.out.println("sellPoint = " + solrDocument.get("sellPoint"));//因为在schema.xml时没有设置该域是存储的所以为null,但是设置了要索引,所以可以进行搜索System.out.println("status = " + solrDocument.get("status"));}}}/** * 添加方式一:SolrInputDocument * * @throws Exception */@Testpublic void testAddDocument() throws Exception{// 创建SolrInputDocument对象,通过它来添加一个个的域SolrInputDocument solrInputDocument = new SolrInputDocument();// 参数1:域的名称,域的名称必须是在schema.xml中定义的;// 参数2:域的值// 注意:id的域不能少solrInputDocument.addField("id", 123L);solrInputDocument.addField("title", "通过代码添加--solrInputDocument方式");solrInputDocument.addField("price", 2000L);solrInputDocument.addField("sellPoint", "我会Java编程");solrInputDocument.addField("image", "http://image.taotao.com/jd/b43e6da16b414d7eb372863f502034b1.jpg");solrInputDocument.addField("status", 1);// 将文档添加到索引库索引化httpSolrServer.add(solrInputDocument);// 提交,在更新solr后要记得提交httpSolrServer.commit();}/** * 方式一:Bean * * @throws Exception */@Testpublic void testAddBean() throws Exception{//创建提交的对象SolrItem solrItem = new SolrItem();solrItem.setId(124L);solrItem.setTitle("通过代码添加--bean方式");solrItem.setImage("http://image.taotao.com/jd/b43e6da16b414d7eb372863f502034b1.jpg");solrItem.setPrice(2000L);solrItem.setSellPoint("我会Java编程");solrItem.setStatus(1);// 将文档添加到索引库索引化httpSolrServer.addBean(solrItem);// 提交,在更新solr后要记得提交httpSolrServer.commit();}/** * 根据ID删除索引文档 * @throws Exception */@Testpublic void testDeleteById() throws Exception{// 指定要删除的文档id域对应的值httpSolrServer.deleteById("123");//提交删除httpSolrServer.commit();}/** * 根据条件删除索引文档 * 删除所有 * @throws Exception */@Testpublic void testDeleteByQuery() throws Exception{// 根据条件删除索引文档httpSolrServer.deleteByQuery("title:代码");//删除所有的索引文档//httpSolrServer.deleteByQuery("*:*");//提交删除httpSolrServer.commit();}} ================================================================= SolrParams solrParams=new SolrQuery("(id:2 OR id:3) AND (id:3 OR id:4)"); package cn.flyflyyun.Solrj;
import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.SolrServerException;import org.apache.solr.client.solrj.impl.HttpSolrServer;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.params.SolrParams;import org.junit.Test;
import java.util.List;import java.util.Map;
/** * 查询索引 */
public class SolrJQuery {
/** * 通过遍历document * @throws SolrServerException */ @Test public void queryIndex() throws SolrServerException { //1.连接Solr服务器 HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/core1");
//2.初始化查询对象(设置查询条件) SolrParams params = new SolrQuery("*:*");
//3.执行查询,并获得查询结果集 QueryResponse query = solrServer.query(params); SolrDocumentList documentList = query.getResults();
System.out.println("共查询到"+documentList.getNumFound()+"条结果");
//4.获得查询字段 for (SolrDocument document : documentList) { System.out.println("id:"+document.getFieldValue("id")); System.out.println("title"+document.getFieldValue("title")); } }
/** * 返回Bean * @throws SolrServerException */ @Test public void testBeanQuery() throws SolrServerException { //1.连接Solr服务器 HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/core1");
//2.初始化查询对象(设置查询条件) //SolrParams params = new SolrJQuery("*:*"); //查询所有 //SolrParams params = new SolrQuery("id:5 OR id:6"); //布尔查询 OR
//查询Id不是5的数据,布尔查询 NOT //SolrParams params = new SolrQuery("NOT id:5");
//查询id为5且title为"迷惘开头的索引",布尔查询 and //SolrParams params = new SolrQuery("id:5 and title:迷惘*");
//相似度查询,最大修改次为2 //SolrParams params = new SolrQuery("title:挪威的天空~2");
//范围查询(TO区分大小写,必须写大写) SolrParams params = new SolrQuery("title:华夏 OR id:[4 TO 7]");
//3.执行查询,并获得查询结果集 QueryResponse query = solrServer.query(params); //把查询结果封装到Item对象中(如果分页,就只封装当前页数据) List<Item> list = query.getBeans(Item.class);
System.out.println("共查询到"+query.getResults().getNumFound()+"条结果");
//4.获得查询字段(遍历List集合) for (Item item : list) { System.out.println("id"+item.getId()); System.out.println("title"+item.getTitle()); } }
/** * 排序查询 * @throws SolrServerException */ @Test public void testSortQuery() throws SolrServerException { //1.连接Solr服务器 HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/core1");
//范围查询(TO区分大小写,必须写大写) SolrQuery query = new SolrQuery("id:[4 TO 7]");
//设置排序 query.setSort("id", SolrQuery.ORDER.desc);
//3.执行查询,并获得查询结果集 QueryResponse response = solrServer.query(query);
//把查询结果封装到Item对象中(如果分页,就只封装当前页数据) List<Item> list = response.getBeans(Item.class);
System.out.println("共查询到"+response.getResults().getNumFound()+"条结果");
//4.获得查询字段(遍历List集合) for (Item item : list) { System.out.println("id"+item.getId()); System.out.println("title"+item.getTitle()); } }
/** * 分页查询 * @throws SolrServerException */ @Test public void testPageQuery() throws SolrServerException {
//准备分页参数 int pageNum=2; //页码 int pageSize=2; //每页显示多少条数据
//1.连接Solr服务器 HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/core1");
//范围查询(TO区分大小写,必须写大写) SolrQuery query = new SolrQuery("id:[4 TO 7]");
//设置排序 query.setSort("id", SolrQuery.ORDER.desc);
//设置分页 query.setStart((pageNum-1)*pageSize); //从哪个索引开始查询 query.setRows(pageSize); //每页多少数据
//3.执行查询,并获得查询结果集 QueryResponse response = solrServer.query(query);
//把查询结果封装到Item对象中(如果分页,就只封装当前页数据) List<Item> list = response.getBeans(Item.class);
System.out.println("共查询到"+response.getResults().getNumFound()+"条结果");
//4.获得查询字段(遍历List集合) for (Item item : list) { System.out.println("id"+item.getId()); System.out.println("title"+item.getTitle()); } }
/** * 高亮显示 * @throws SolrServerException */ @Test public void testHighLightingQuery() throws SolrServerException {
//1.连接Solr服务器 HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/core1");
//范围查询(TO区分大小写,必须写大写) SolrQuery query = new SolrQuery("title:挪威");
//设置排序 query.setSort("id", SolrQuery.ORDER.desc);
//设置高亮 //设置前置标签 query.setHighlightSimplePre("<em>");
//设置后置标签 query.setHighlightSimplePost("</em>");
//设置高亮字段 query.addHighlightField("title"); query.addHighlightField("id");
//3.执行查询,并获得查询结果集 QueryResponse response = solrServer.query(query);
//把查询结果封装到Item对象中(如果分页,就只封装当前页数据) List<Item> list = response.getBeans(Item.class);
//返回高亮的结果集(id(key):field(value)) Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); System.out.println("共查询到"+response.getResults().getNumFound()+"条结果");
//4.获得查询字段(遍历List集合) for (Item item : list) { System.out.println("id:"+item.getId()); //System.out.println("id:"+highlighting.get(item.getId()).get("id").get(0)); System.out.println("title:"+highlighting.get(item.getId()).get("title").get(0)); } }
}
======================================================package com.kang.solrj.service;
import java.util.List;import java.util.Map;
import org.apache.commons.lang3.StringUtils;import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.impl.HttpSolrServer;import org.apache.solr.client.solrj.response.QueryResponse;
import com.kang.solrj.pojo.Foo;
public class SolrjService {
// 定义http的solr服务 private HttpSolrServer httpSolrServer;
public SolrjService(HttpSolrServer httpSolrServer) { this.httpSolrServer = httpSolrServer; }
public void add(Foo foo) throws Exception { this.httpSolrServer.addBean(foo); //添加数据到solr服务器 this.httpSolrServer.commit(); //提交 }
public void delete(List<String> ids) throws Exception { this.httpSolrServer.deleteById(ids); this.httpSolrServer.commit(); //提交 }
public List<Foo> search(String keywords, Integer page, Integer rows) throws Exception { SolrQuery solrQuery = new SolrQuery(); //构造搜索条件 solrQuery.setQuery("title:" + keywords); //搜索关键词 // 设置分页 start=0就是从0开始,,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了。 solrQuery.setStart((Math.max(page, 1) - 1) * rows); solrQuery.setRows(rows);
//是否需要高亮 boolean isHighlighting = !StringUtils.equals("*", keywords) && StringUtils.isNotEmpty(keywords);
if (isHighlighting) { // 设置高亮 solrQuery.setHighlight(true); // 开启高亮组件 solrQuery.addHighlightField("title");// 高亮字段 solrQuery.setHighlightSimplePre("<em>");// 标记,高亮关键字前缀 solrQuery.setHighlightSimplePost("</em>");// 后缀 }
// 执行查询 QueryResponse queryResponse = this.httpSolrServer.query(solrQuery); List<Foo> foos = queryResponse.getBeans(Foo.class); if (isHighlighting) { // 将高亮的标题数据写回到数据对象中 Map<String, Map<String, List<String>>> map = queryResponse.getHighlighting(); for (Map.Entry<String, Map<String, List<String>>> highlighting : map.entrySet()) { for (Foo foo : foos) { if (!highlighting.getKey().equals(foo.getId().toString())) { continue; } foo.setTitle(StringUtils.join(highlighting.getValue().get("title"), "")); break; } } }
return foos; }
}
=======================Skip to contentSearch or jump to… package solr.exe;
import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.SolrServer;import org.apache.solr.client.solrj.SolrServerException;import org.apache.solr.client.solrj.impl.HttpSolrServer;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 java.io.IOException;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;
/** * 增删改都需要提交事务 * @author lxt * @date 2019-09-04 */public class SolrTest {
private final static String BASE_URL="http://192.168.43.184:8080/solr/";
/** * 增改 * @throws IOException * @throws SolrServerException */ @Test public void testAdd() throws IOException, SolrServerException { SolrServer solrServer=new HttpSolrServer(BASE_URL); SolrInputDocument doc=new SolrInputDocument(); doc.addField("title_ik1","腾讯音乐"); doc.addField("title_ik","百度云音乐"); doc.addField("id","001"); solrServer.add(doc); solrServer.commit(); }
/** * 删除 * @throws IOException * @throws SolrServerException */ @Test public void testDelete() throws IOException, SolrServerException { SolrServer client=new HttpSolrServer(BASE_URL); client.deleteById("002"); //client.deleteByQuery("*:*"); client.commit(); }
/** * 查询 * @throws IOException * @throws SolrServerException */ @Test public void testQuery() throws IOException, SolrServerException { SolrServer client=new HttpSolrServer(BASE_URL); //查询条件 SolrQuery query=new SolrQuery(); //q query.setQuery("title_ik:音乐"); //分页 query.setStart(0); query.setRows(10); query.setHighlight(true); final String highLightField="title_ik"; query.addHighlightField(highLightField); //前缀便签,后缀标签 query.setHighlightSimplePost("<span style='color:red'>"); query.setHighlightSimplePre("</span>"); QueryResponse response = client.query(query); //response SolrDocumentList results = response.getResults(); //highlighting highlighting和response和responseHeader都是同一数据级别 Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); //solr 8支持lambda for (SolrDocument x : results) { System.out.println(x.getFieldValue("title_ik")); System.out.println(x.getFieldValue("title_ik1")); //第一个是key是id的值 Map<String, List<String>> stringListMap = highlighting.get(x.getFieldValue("id")); if (!stringListMap.isEmpty()){ List<String> strings = stringListMap.get(highLightField); //正常业务逻辑是要返回实体类的,没有该字段的值就应该返回未高亮的
System.out.println(strings.get(0));
}
}
}
}==================================package org.ten.mue;
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.beans.DocumentObjectBinder;import org.apache.solr.client.solrj.impl.HttpSolrClient;import org.apache.solr.client.solrj.response.QueryResponse;import org.apache.solr.client.solrj.response.UpdateResponse;import org.apache.solr.common.SolrDocumentList;import org.apache.solr.common.SolrInputDocument;
import java.io.IOException;import java.util.ArrayList;import java.util.Collection;import java.util.List;
/** * Created by yang_yancy on 2016/8/21. * Solr Demo * 参考资料 * http://wiki.apache.org/solr/IntegratingSolr?highlight=%28%28SolJava%29%29#Java * http://wiki.apache.org/solr/Solrj */public class SolrDemo {
public static String solrURL = "http://localhost:8080/solr/core1";
public static void main(String[] args) { //addDoc(); //addDoc2(); //addDoc3(); queryDoc(); //delDoc(); //delDoc2(); //delDoc3(); }
/**SolrClient solr = new HttpSolrClient(solrURL); * 查询 */ public static void queryDoc(){ SolrClient solr = new HttpSolrClient(solrURL);
SolrQuery solrQuery = new SolrQuery(); //solrQuery.setQuery("*ten*"); solrQuery.setQuery("name:ten* id:9988"); solrQuery.setFields("id", "name", "price");//需要返回的数据 //solrQuery.setRows(Integer.MAX_VALUE);//查询文档中所有符合条件的数据 solrQuery.setStart(0);//从文档中第0条数据开始检索,默认时从第0条开始 solrQuery.setRows(10); solrQuery.setSort("price", SolrQuery.ORDER.desc);//排序方式
//只有当设置了分词后,高亮才会有效果 /*solrQuery.setHighlight(true); solrQuery.addHighlightField("name");//高亮显示字段 solrQuery.setHighlightSimplePre("<font color='red'>");//标记高亮关键字前缀 solrQuery.setHighlightSimplePost("</font>");//标记高亮关键字后缀*/ try { QueryResponse response = solr.query(solrQuery); SolrDocumentList list = response.getResults(); System.out.println("文档个数:" + list.getNumFound()); System.out.println("查询耗时:" + response.getQTime()); //普通方式处理查询结果 /*for (SolrDocument document : list){ System.out.println(document.getFieldValue("id")); System.out.println(document.getFieldValue("name")); System.out.println(document.getFieldValue("price")); }*/
//绑定JavaBean对象处理查询结果 DocumentObjectBinder documentObjectBinder = new DocumentObjectBinder(); List<SolrBean> solrBeanList = documentObjectBinder.getBeans(SolrBean.class, list); for (SolrBean solrBean : solrBeanList){ System.out.println("id:" + solrBean.getId()); System.out.println("name:" + solrBean.getName()); System.out.println("price:" + solrBean.getPrice()); } } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
/** * 方法一 * 创建索引 */ public static void addDoc() {
SolrClient solr = new HttpSolrClient(solrURL);
SolrInputDocument doc = new SolrInputDocument(); doc.addField("id", "9988"); doc.addField("name", "my name is yancy"); doc.addField("price", "49.9"); try { UpdateResponse response = solr.add(doc); solr.commit(); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
}
/** * 方法二 * 创建索引 */ public static void addDoc2(){ SolrClient solr = new HttpSolrClient(solrURL);
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>(); for(int i = 0;i <= 1000000;i++){ SolrInputDocument solrDocument = new SolrInputDocument(); solrDocument.addField("id", "100" + i); solrDocument.addField("name", "my name is mue" + i); solrDocument.addField("price", "45.7" + i); docs.add(solrDocument); } try { solr.add(docs); solr.commit(); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
/** * 方法三 * 通过对象的方式添加索引 */ public static void addDoc3(){ SolrClient solr = new HttpSolrClient(solrURL);
Collection<SolrBean> docs = new ArrayList<SolrBean>(); DocumentObjectBinder documentObjectBinder = new DocumentObjectBinder(); for (int i = 0;i < 10;i++){ SolrBean solrBean = new SolrBean(); solrBean.setId("200" + i); solrBean.setName("ten" + i); solrBean.setPrice(22 + i); SolrInputDocument doc = documentObjectBinder.toSolrInputDocument(solrBean); docs.add(solrBean); }
try { solr.addBeans(docs); solr.commit(); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
/** * 方法一 * 删除指定索引 */ public static void delDoc(){ SolrClient solr = new HttpSolrClient(solrURL);
try { solr.deleteById("2001");//根据id删除索引 //solr.deleteByQuery("name:ten0");//根据指定字段删除索引 solr.commit(); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
/** * 方法二 * 删除指定索引 */ public static void delDoc2(){ SolrClient solr = new HttpSolrClient(solrURL);
List<String> list = new ArrayList<String>(); for(int i = 0;i < 5;i++){ list.add("200" + i);//根据id删除 } try { UpdateResponse response = solr.deleteById(list); solr.commit(); System.out.println(response.getStatus()); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
}
/** * 方法三 * 清空所有索引 */ public static void delDoc3(){ SolrClient solr = new HttpSolrClient(solrURL);
try { UpdateResponse response = solr.deleteByQuery("*:*"); solr.commit(); System.out.println(response.getStatus()); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }}==============================================package com.test.solrj;
import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.impl.HttpSolrClient;import org.apache.solr.client.solrj.response.QueryResponse;import org.apache.solr.client.solrj.response.UpdateResponse;import org.apache.solr.common.SolrDocument;import org.apache.solr.common.SolrDocumentList;import org.apache.solr.common.SolrInputDocument;import org.junit.Before;import org.junit.Test;
import java.util.List;import java.util.Map;
/** * @author chengzhengbo * @Date 2017/11/20 * @TIME 上午11:31 */public class SolrClient { private static final String URL = "http://localhost:8080/solr-4.1.0/";
private HttpSolrClient server = null;
@Before public void init() { // 创建 server server = new HttpSolrClient(URL); }
@Test public void addDoc() {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "id"); doc.addField("title", "document");
try { UpdateResponse response = server.add(doc); // 提交 server.commit();
System.out.println("########## Query Time :" + response.getQTime()); System.out.println("########## Elapsed Time :" + response.getElapsedTime()); System.out.println("########## Status :" + response.getStatus());
} catch (Exception e) { System.err.print(e); } }
/** * 查询 */ @Test public void queryTest() { String query = "*:*"; SolrQuery solrQuery = new SolrQuery(query);
//查询语法// solrQuery.set("q","id:carver"); //过滤插叙// solrQuery.set("fq","id:carver"); //排序// solrQuery.setSort("id", SolrQuery.ORDER.desc); //分页// int pageSize = 1;// int rows = 222;// int start = rows*(pageSize-1);// solrQuery.setStart(start);// solrQuery.setRows(rows);
//开启高亮 solrQuery.setHighlight(true); solrQuery.setQuery("title:cainiao"); //高亮字段 solrQuery.addHighlightField("title"); //前缀标志 solrQuery.setHighlightSimplePre("<span color=red>"); //后缀标志 solrQuery.setHighlightSimplePost("</span>");
//用于调试程序 System.out.println(solrQuery+"=========="); try { //相应查询 QueryResponse response = null; response = server.query(solrQuery); //匹配文档 SolrDocumentList solrDocumentList = response.getResults();
System.out.println("总共" + solrDocumentList.getNumFound() + "条记录"); //从响应中获取高亮信息 Map<String, Map<String, List<String>>> map = response.getHighlighting();
for (SolrDocument doc : solrDocumentList) { System.out.println("id : " + doc.get("id") + " title : " + doc.get("title")); //取出高亮信息 if(map!=null){ //根据id取出高亮信息 String id = (String) doc.get("id"); Map<String, List<String>> idMap = map.get(id); //取出高亮字段信息 List<String> title = idMap.get("title"); if(title!=null) { for (int i = 0; i < title.size(); i++) { System.out.println("title=====" + " " + title.get(i)); } }
} } } catch (Exception e) { e.printStackTrace(); } }
@Test public void updateTest() {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "czb"); doc.addField("title", "java think ");
try { UpdateResponse add = server.add(doc); System.out.println(add.getRequestUrl()); System.out.println(add.getElapsedTime()); System.out.println(add.getResponse()); System.out.println(add.getElapsedTime()); //查询 queryTest();
} catch (Exception e) { e.printStackTrace(); }
}
}==================================import com.baidu.Item;import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.SolrServerException;import org.apache.solr.client.solrj.impl.HttpSolrServer;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 java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Map;
/** * @auther SyntacticSugar * @data 2018/11/24 0024下午 11:31 */public class SolrJTest {
@Test public void test() throws IOException, SolrServerException { HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); SolrInputDocument document = new SolrInputDocument(); document.addField("id", "4"); document.addField("title", "五菱宏光,神车"); document.addField("price", 30000F); // server.add(document); //提交 server.commit(); }
/** * pojo中属性没有注解@Field,导致solrJ并不知道哪个属性要对应到索引库中 * * @throws IOException * @throws SolrServerException */ @Test public void testCreateIndexBean() throws IOException, SolrServerException { HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); // Item item = new Item(); item.setId("9"); item.setPrice(3000F); item.setTitle("小米手机"); // server中添加bean server.addBean(item); server.commit(); }
/** * testDeleteIndexById * 根据id 删除 */ @Test public void testDeleteIndexById() throws IOException, SolrServerException { //使用solrj的jar HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); server.deleteById("1"); server.commit(); }
/** * 根据查询条件删除索引 */ @Test public void testDeleteIndexByQuery() throws IOException, SolrServerException { HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); server.deleteByQuery("title:iphone"); server.commit(); }
/** * query返回document 的形式 */ @Test public void testQueryToDocument() throws IOException, SolrServerException { HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); //public class SolrQuery extends ModifiableSolrParams SolrQuery query = new SolrQuery("title:手机"); //public QueryResponse query(SolrParams params) QueryResponse response = server.query(query); SolrDocumentList list = response.getResults(); /** * 遍历list ,取出document */ for (SolrDocument entries : list) { System.out.println(entries.getFieldValue("id")); System.out.println(entries.getFieldValue("title")); System.out.println(entries.getFieldValue("price")); } System.out.println("查询的总条数:" + list.size()); }
/** * query返回javabean 的形式 */ @Test public void testQueryToJavabean() throws IOException, SolrServerException { HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); /** * 普通查询 */// SolrQuery query = new SolrQuery("title:iphone"); /** * boolean 查询 */// SolrQuery query = new SolrQuery("title:iphone OR title:小米"); /** * 相似度查询 ,类似于Lucene的编辑距离0-2 */// SolrQuery query = new SolrQuery("title:ipHOne~2"); /** * 范围查询 xx TO xx * 闭区间 */ SolrQuery query = new SolrQuery("price:[10 TO 10000]");
// QueryResponse response = server.query(query); List<Item> itemList = response.getBeans(Item.class); for (Item item : itemList) { System.out.println(item); } System.out.println("搜多到的条数:" + itemList.size()); }
/** * 使用 solrj 查询排序 */ @Test public void testQueryOrder() throws SolrServerException { //连接solr服务器、创建query对象、设置查询排序参数 、查询 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); SolrQuery query = new SolrQuery("title:手机"); /**设置排序源码 * public SolrQuery setSort(String field, ORDER order) { * return setSort(new SortClause(field, order)); * } */ query.setSort("price", SolrQuery.ORDER.desc); QueryResponse response = server.query(query); // List<Item> itemList = response.getBeans(Item.class); for (Item item : itemList) { System.out.println(item.toString()); } System.out.println("搜索到的条数:" + itemList.size()); }
/** * 使用 solrj 高亮显示 testHighlightingQuery * 1、set高亮标签,add高亮字段 * 2、高亮工具 */ @Test public void testHighlightingQuery() throws SolrServerException { //连接solr服务器、创建query对象、高亮、查询 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); SolrQuery query = new SolrQuery("title:手机"); // 标签、字段 query.setHighlightSimplePre("<em>"); query.setHighlightSimplePost("</em>"); query.addHighlightField("title"); // QueryResponse response = server.query(query); /** * 高亮的响应结果 是一个双层map : * id :对应id的高亮字段 * 高亮字段:高亮值 为list */ Map<String, Map<String, List<String>>> map = response.getHighlighting(); /** * 普通查询结果 */ List<Item> itemList = response.getBeans(Item.class); for (Item item : itemList) { System.out.println("id" + item.getId()); // 高亮值 为list System.out.println("title" + map.get(item.getId()).get("title").get(0)); System.out.println("price" + item.getPrice()); } System.out.println("搜索到的条数:" + itemList.size()); }
/** * 分页 * 1、准备参数 * 2、设置到query中 */ @Test public void testPagedQuery() throws SolrServerException { //连接solr服务器、创建query对象、设置查询排序参数 、查询 HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/core1"); SolrQuery query = new SolrQuery("title:手机"); // 设置分页 int currentPage = 2; final int PAGE_SIZE = 4; int start = (currentPage - 1) * PAGE_SIZE; // 设置起始页,设置每页显示数目 query.setStart(start); query.setRows(PAGE_SIZE); // QueryResponse response = server.query(query); List<Item> itemList = response.getBeans(Item.class); //展示数据 System.out.println("当前页:"+currentPage+"共查询数据:"+itemList.size()); for (Item item : itemList) { System.out.println("数据:"+item.toString()); } }
}===========================

浙公网安备 33010602011771号