使用JAVA操作solr

首先需要搭建一个solr环境,在此,我使用docker安装一个solr

docker pull solr
docker run --name my_solr -d -p 8983:8983 -t solr

访问web控制台http://ip:8983
这样环境说明已安装,我们为了使用java操作solr,我们需要建立一个core,因为我们的数据全部存储在core中,有点类似数据库的概念。
我们可以使用命令来创建core,也可以使用浏览器发送请求来新增。

我们取名为mycore

docker exec -it --user=solr my_solr bin/solr create_core -c mycore

在这里插入图片描述

或者使用浏览器方式
http://192.168.37.129:8983/solr/admin/cores?action=CREATE&name=mycore&instanceDir=mycore

如下可以看到collection中的mycore
在这里插入图片描述
我们添加一点测试数据
在这里插入图片描述
查询下:
在这里插入图片描述
作为开发人员,你必须学会这种界面操作,以下是界面的各种简称含义。
fq表示filter query 过滤条件 和q是and的关系支持各种逻辑运算符 (参考https://cwiki.apache.org/confluence/display/solr/The+Standard+Query+Parser)
sort表示排序 的字段 字段名 asc|desc
start 表示从第几行开始 rows表示查询的总行数
fl表示查询显示的列 比如只需要查询 name_s,sex_i 这两列 使用,隔开
df表示默认的查询字段 一般不设置
Raw Query Parameters表示原始查询字段 可以使用 start=0&rows=10这种url的方式传入参数
wt(write type)表示写入的格式 可以使用json和xml
shards 多核同时搜索 solrhome拷贝mycore为mycore1 管理平台添加core 设置参数为 路径,路径来设置需要搜索的核

java操作solr

新建maven项目,引入pom依赖

<dependency>
	<groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>7.2.1</version>
</dependency>

我们测试索引的CRUD,为了配合,我们新建实体类Person

package com.hbk.entity;

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

public class Person {
    @Field(value = "id")
    private String id;

    @Field(value = "name")
    private String name;

    @Field(value = "description")
    private String description;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

我们的工具类SolrUtil

package com.hbk.util;

import com.hbk.entity.Person;
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.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;

import java.io.IOException;
import java.util.List;
import java.util.Map;

public class SolrUtil {
    //solr服务器所在的地址,mycore为自己创建的文档库目录
    private final static String SOLR_URL = "http://192.168.37.129:8983/solr/mycore";

    /**
     * 往索引库添加文档
     *
     * @throws SolrServerException
     * @throws IOException
     */
    @Test
    public void addDoc() throws SolrServerException, IOException {
        SolrInputDocument document = new SolrInputDocument();
        document.addField("id", "001");
        document.addField("name", "黄宝康");
        document.addField("description", "IT程序员多年,微信:19979454223,欢迎有项目合作");
        HttpSolrClient solr = new HttpSolrClient.Builder(SOLR_URL).withConnectionTimeout(10000)
                .withSocketTimeout(60000).build();
        solr.add(document);
        solr.commit();
        solr.close();
        System.out.println("添加成功");
    }

    /**
     * 根据ID从索引库删除文档
     *
     * @throws SolrServerException
     * @throws IOException
     */
    public void deleteDocumentById() throws SolrServerException, IOException {
        HttpSolrClient server = new HttpSolrClient.Builder(SOLR_URL)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000).build();

        server.deleteById("001");
        server.commit();
        server.close();
    }

  @Test
    public void querySolr() throws Exception {

        HttpSolrClient server = new HttpSolrClient.Builder(SOLR_URL)
                .withConnectionTimeout(10000)
                .withSocketTimeout(60000).build();
        SolrQuery query = new SolrQuery();

        //下面设置solr查询参数

//        query.set("q", "*:*");// 参数q  查询所有
        query.set("q", "黄宝康");//相关查询,比如某条数据某个字段含有周、星、驰三个字  将会查询出来 ,这个作用适用于联想查询
        //参数fq, 给query增加过滤查询条件
        query.addFacetQuery("id:[0 TO 9]");
//        query.addFilterQuery("description:微信");

        //参数df,给query设置默认搜索域,从哪个字段上查找,这个结合上面的q
        query.set("df", "name");
        //参数sort,设置返回结果的排序规则
        query.setSort("id", SolrQuery.ORDER.desc);

        //设置分页参数
        query.setStart(0);
        query.setRows(10);

        //设置高亮显示以及结果的样式
        query.setHighlight(true);
        query.addHighlightField("name");
        query.setHighlightSimplePre("<font color='red'>");
        query.setHighlightSimplePost("</font>");

        //执行查询
        QueryResponse response = server.query(query);

        //获取返回结果
        SolrDocumentList resultList = response.getResults();

        for(SolrDocument document: resultList){
            System.out.println("id:"+document.get("id")+"   document:"+document.get("name")+"    description:"+document.get("description"));
        }
        // 获取高亮
        Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
        for (Map.Entry entry : highlighting.entrySet()){
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }
        //获取实体对象形式
        List<Person> persons = response.getBeans(Person.class);
        System.out.println(persons.get(0).getName());

    }
}

一开始跑的时候,报了如下错
在这里插入图片描述
原因是,name字段的索引类型问题,可以看到,带了中括号
在这里插入图片描述
我们修改下数据类型
进入docker容器,查看/var/solr/data/mycore/conf/managed-schema文件,
把text_general成string,并reload下解决问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
博客若对你有用,欢迎扫码打赏,你的打赏是我写作的动力。
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄宝康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值