欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-14 20:29:10
...

首先看一下我的示例idea目录:biaozhun和term都是描述文档(下面会说),一个是转换json文件,一个是调用solr文件。(调用solr记得solr要运行中哦)
如何在idea中调用solr?java操作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请查看我的主页博客,按需索取。

如何在idea中调用solr?java操作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/";

分享完毕(。・∀・)ノ 有问题欢迎提问哦~

相关标签: java solr