如何在idea中调用solr?java操作solr实例(附源代码)

首先看一下我的示例idea目录:biaozhun和term都是描述文档(下面会说),一个是转换json文件,一个是调用solr文件。(调用solr记得solr要运行中哦)
在这里插入图片描述

1. 添加pom.xml

首先,新建一个项目之后,在pom.xml导入相关的jar包。一个solr包一个日志包一个如果使用mysql需要用到的。

<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.13</version>
</dependency>
<dependency>
           <groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.1.3</version>
</dependency>
<dependency>
			<groupId>org.apache.solr</groupId>
			<artifactId>solr-solrj</artifactId>
			<version>7.7.3</version>
</dependency>

2.描述文档

需要一个java文件来描述你在mysql中导入的entity,如我的数据是这样的,已经通过mysql导入到solr中去了:

mysql如何导入solr请查看我的主页博客,按需索取。

在这里插入图片描述
那我的描述就为:

import org.apache.solr.client.solrj.beans.Field;

public class term {
    @Field(value = "id") //需要在managed-schema中添加field
    private String id;
    @Field(value = "term")
    private String term;
    @Field(value = "Engname")
    private String Engname;
    @Field(value = "Def")//四个属性都要描述到
    private String Def;

//一些get、set函数
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getTerm() {
        return term;
    }
    public void setTerm(String term) {
        this.term = term;
    }
    public String getEngname() {
        return Engname;
    }
    public void setEngname(String Engname) {
        this.Engname = Engname;
    }
    public String getDef() {
        return Def;
    }
    public void setDef(String Def) {
        this.Def = Def;
    }

}

3.创建SolrServer对象

public HttpSolrClient createSolrServer() {
        HttpSolrClient solr = null;
        solr = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000).withSocketTimeout(60000).build();
        return solr;
    }

4.往索引库添加文档

public void addDoc() throws SolrServerException, IOException {
        //构造一篇文档
        SolrInputDocument document = new SolrInputDocument();
        //往doc中添加字段,在客户端这边添加的字段必须在服务端中有过定义
        document.addField("id", "8");
        document.addField("term", "水");
        document.addField("Engname", " water");
        document.addField("Def", "一个氧原子和两个氢原子构成的氢氧化合物");
        //获得一个solr服务端的请求,去提交 ,选择具体的某一个solr core,你的是什么名称就改成什么名称
        HttpSolrClient solr = new HttpSolrClient.Builder(SOLR_URL + "new_core").withConnectionTimeout(10000)
                .withSocketTimeout(60000).build();
        solr.add(document);
        solr.commit();
        solr.close();
        System.out.println("添加成功");
    }

5.根据id从索引库删除文档

    public void deleteDocumentById() throws Exception {
        //选择具体的某一个solr core,修改new_core名称
        HttpSolrClient server = new HttpSolrClient.Builder(SOLR_URL + "new_core").withConnectionTimeout(10000)
                .withSocketTimeout(60000).build();
        //删除文档
        server.deleteById("8");//删除id为8的文档
        //删除所有的索引
        //solr.deleteByQuery("*:*");
        //提交修改
        server.commit();
        server.close();
    }

6.solr查询文档

查询可以设置各种参数。

 public List<term> querySolr_sy() throws Exception {
        HttpSolrClient solrServer = new HttpSolrClient.Builder(SOLR_URL + "shuyu/").withConnectionTimeout(10000)
                .withSocketTimeout(60000).build();
        SolrQuery query = new SolrQuery();
        //下面设置solr查询参数
        query.set("q", "*:*");// 参数q  查询所有
        //query.set("q","水");//相关查询,比如某条数据某个字段含有水这个字将会查询出来 ,这个作用适用于联想查询

        //参数fq, 给query增加过滤查询条件
        // query.addFilterQuery("id:[0 TO 9]");//id为0-4

        //给query增加布尔过滤条件
        //query.addFilterQuery("description:演员");  //description字段中含有“演员”两字的数据

        //参数df,给query设置默认搜索域
        query.set("df", "name");

        //参数sort,设置返回结果的排序规则
        query.setSort("id", SolrQuery.ORDER.desc);

        //设置分页参数
        query.setStart(0);
        query.setRows(10);//每一页多少值,可设置

        //参数hl,设置高亮
        query.setHighlight(true);
        //设置高亮的字段
        query.addHighlightField("term");
        //设置高亮的样式
        query.setHighlightSimplePre("<font color='red'>");
        query.setHighlightSimplePost("</font>");

        //获取查询结果
        QueryResponse response = solrServer.query(query);
        //两种结果获取:得到文档集合或者实体对象

        //查询得到文档的集合
        SolrDocumentList solrDocumentList = response.getResults();
        System.out.println("通过文档集合获取查询的结果");
        System.out.println("查询结果的总数量:" + solrDocumentList.getNumFound());
//遍历列表,这是字段查询输出
        for (SolrDocument doc : solrDocumentList) {
            System.out.println("id:" + doc.get("id") + "   term:" + doc.get("term") + "    Engname:" + doc.get("Engname") + "   Def:" + doc.get("Def"));

        }
//        //得到实体对象
//        List<Person> persons = response.getBeans(Person.class);
        System.out.println(persons.get(0).getName());

//这是通过实体查询
        List<term> tmpLists = response.getBeans(term.class);
        if (tmpLists != null && tmpLists.size() > 0) {
            System.out.println("通过实体集合获取查询的结果:");
            for (term per : tmpLists) {
                System.out.println("id:" + per.getId() + "   术语名称:" + per.getTerm() + "    英文名称:" + per.getEngname() + "   定义:" + per.getDef());
            }
        }
        return tmpLists;
    }

7.转换为json格式输出

这个需要另外建一个java文件写

import java.io.IOException;
import java.util.Collection;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.util.JSONPObject;

/*
 * 简单封装Jackson,提供一些操作json的静态方法
 */
public class JsonSimple {

  private static Logger logger = LoggerFactory.getLogger(JsonSimple.class);
  private static ObjectMapper mapper = null;

  static {
    mapper = new ObjectMapper();
    // 设置输出时包含属性的风格
    mapper.setSerializationInclusion(Include.NON_EMPTY);
    // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
  }

  /**
   * Object可以是POJO,也可以是Collection或数组。 如果对象为Null, 返回"null". 如果集合为空集合, 返回"[]".
   */
  public static String toJson(Object object) {

    try {
      return mapper.writeValueAsString(object);
    } catch (IOException e) {
      logger.warn("write to json string error:" + object, e);
      return null;
    }
  }

  /**
   * 默认返回Map<String,?>
   * #fromJson(String, JavaType)
   */
  @SuppressWarnings("rawtypes")
  public static Map fromJson(String jsonString) {
    return fromJson(jsonString, Map.class);
  }

  /**
   * 反序列化POJO或简单Collection如List<String>.或 List(默认返回Map)
   *
   * 如果JSON字符串为Null或"null"字符串, 返回Null. 如果JSON字符串为"[]", 返回空集合.
   *
   * 如需反序列化复杂Collection如List<MyBean>, 请使用fromJson(String, JavaType)
   #fromJson(String, JavaType)
   */
  public static <T> T fromJson(String jsonString, Class<T> clazz) {
    if (StringUtils.isEmpty(jsonString)) {
      return null;
    }

    try {
      return mapper.readValue(jsonString, clazz);
    } catch (IOException e) {
      logger.warn("parse json string error:" + jsonString, e);
      return null;
    }
  }

  /**
   * 反序列化复杂Collection如List<Bean>, 先使用createCollectionType()或contructMapType()构造类型, 然后调用本函数
   */
  @SuppressWarnings("unchecked")
  public static <T> T fromJson(String jsonString, JavaType javaType) {
    if (StringUtils.isEmpty(jsonString)) {
      return null;
    }

    try {
      return (T) mapper.readValue(jsonString, javaType);
    } catch (IOException e) {
      logger.warn("parse json string error:" + jsonString, e);
      return null;
    }
  }

  /**
   * 构造Collection类型.
   */
  public static JavaType contructCollectionType(
          @SuppressWarnings("rawtypes") Class<? extends Collection> collectionClass,
          Class<?> elementClass) {
    return mapper.getTypeFactory().constructCollectionType(collectionClass, elementClass);
  }

  /**
   * 构造Map类型.
   */
  public static JavaType contructMapType(
          @SuppressWarnings("rawtypes") Class<? extends Map> mapClass, Class<?> keyClass,
          Class<?> valueClass) {
    return mapper.getTypeFactory().constructMapType(mapClass, keyClass, valueClass);
  }

  /**
   * 当JSON里只含有Bean的部分屬性時,更新一個已存在Bean,只覆蓋該部分的屬性.
   */
  public static void update(String jsonString, Object object) {
    try {
      mapper.readerForUpdating(object).readValue(jsonString);
    } catch (JsonProcessingException e) {
      logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e);
    } catch (IOException e) {
      logger.warn("update json string:" + jsonString + " to object:" + object + " error.", e);
    }
  }

  /**
   * 輸出JSONP格式數據.
   */
  public static String toJsonP(String functionName, Object object) {
    return toJson(new JSONPObject(functionName, object));
  }
}

8.main()函数

public static void main(String[] args) throws Exception {
        SolrJTest solr = new SolrJTest();
        solr.createSolrServer();
        solr.querySolr_sy();//查询术语相关
    List<term> f1 = solr.querySolr_sy();
    //json格式输出,具体看你们需要哪种格式就保留哪种,上面query中也有两种:字段+实体,按需
       System.out.println(JsonSimple.toJson(f1));
        System.out.println(f1.size());
      }

9.指定服务器地址

可以指定自己电脑本地端的solr,当然也会有需要连接服务器端的solr。

//指定solr服务器的地址
    //服务器端
    private final static String SOLR_URL = "http://指定ip:8983/solr/";
    //本地端
    private final static String SOLR_URL = "http://localhost:8983/solr/";

分享完毕(。・∀・)ノ

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值