solr sdk 基础操作

在公司的生产环境下,solr一般以集群的方式solrcloud模式部署运行。涉及到的操作一般有
增、删、改、查、全量索引、增量索引、获取分词结果等。本文以springboot 2.0.5.RELEASE 框架引入spring-boot-starter-data-solr 进性基础操作SDK测试。

git地址: https://github.com/gsonkeno/solr-training

环境搭建

新建springboot项目,pom文件引入solr starter依赖,如下:

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-solr</artifactId>
 </dependency>

基础操作SDK测试

基本说明: SDK操作最终是发送http请求到solr服务上,结合solr admin控制台的使用,可以帮助你更好地理解测试代码

package com.gsonkeno.solrtraining;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.request.FieldAnalysisRequest;
import org.apache.solr.client.solrj.response.AnalysisResponseBase;
import org.apache.solr.client.solrj.response.FieldAnalysisResponse;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.ModifiableSolrParams;
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 java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTest {

    // 自动注入client,见配置项
    // spring.data.solr.host=http://127.0.0.1:8983/solr
    // spring.data.solr.zk-host=127.0.0.1:2181/rc
    @Autowired
    private CloudSolrClient client;

    // springboot + solr 测试新增
    // 更新也是该方法,若文档已存在,则覆盖而已
    @Test
    public void testAdd() throws IOException, SolrServerException {

        SolrInputDocument doc = new SolrInputDocument();
        doc.addField("id",5);
        doc.addField("item_title","周杰伦的黑色毛衣");
        doc.addField("shop_name","周杰伦时尚店");
        doc.addField("img_url","http://www.baidu.com/197739.jpg");
        doc.addField("item_score",0.83);
        doc.addField("shop_score",0.83);
        doc.addField("sales_score",0.83);
        doc.addField("create_time",new Date());
        doc.addField("type",1);

        client.add("item_v2",doc);
        UpdateResponse response = client.commit("item_v2");
        System.out.println(response);
    }

    // springboot + solr 测试查询
    @Test
    public void testQuery() throws IOException, SolrServerException {
        ModifiableSolrParams params = new ModifiableSolrParams();
        params.add("q","item_title:大衣");
        QueryResponse response = client.query("item_v2", params);
        System.out.println(response);
    }

    // springboot + solr 测试删除
    @Test
    public void testDel() throws IOException, SolrServerException {
        List<String> ids = new ArrayList<>();
        ids.add("1");
        ids.add("2");
        ids.add("3");
        ids.add("4");
        UpdateResponse updateResponse = client.deleteById("item_v2",ids);
        //这句很重要,否则不会删除
        client.commit("item_v2");
        System.out.println("删除结果:" + updateResponse);

    }

    // springboot + solr 测试删除
    @Test
    public void testDelByQuery() throws IOException, SolrServerException {
        UpdateResponse response = client.deleteByQuery("item_v2", "*:*");
        //这句很重要,否则不会删除
        client.commit("item_v2");
        System.out.println("根据查询删除:" + response);
    }



    // springboot + solr 全量索引
    @Test
    public void testFullIndex() throws IOException, SolrServerException {
        SolrQuery solrQuery = new SolrQuery();
        //默认情况下是/select,其值与solrconfig.xml内容有关,全量索引时,赋值/dataimport
        solrQuery.setRequestHandler("/dataimport");
        solrQuery.set("command", "full-import");

        QueryResponse response = client.query("item_v2", solrQuery);
        System.out.println(response);
    }

    // springboot + solr 增量索引
    @Test
    public void testDeltaIndex() throws IOException, SolrServerException {
        SolrQuery solrQuery = new SolrQuery();
        //默认情况下是/select,其值与solrconfig.xml内容有关,增量索引时,赋值/dataimport
        solrQuery.setRequestHandler("/dataimport");
        //增量索引
        solrQuery.set("command", "delta-import");

        QueryResponse response = client.query("item_v2", solrQuery);
        System.out.println(response);
    }

    // springboot + solr 测试分词结果
    // 对应请求url http://localhost:8983/solr/item_v2/analysis/field?&analysis.fieldtype=text_ik&analysis.query=%E9%BB%91%E8%89%B2%E6%AF%9B%E8%A1%A3&wt=json
    @Test
    public void testAnalysis() throws IOException, SolrServerException {
        FieldAnalysisRequest analysisRequest = new FieldAnalysisRequest();
        ArrayList<String> fieldTypes = new ArrayList<>();
//        fieldTypes.add("text_ik");
//        analysisRequest.setQuery("黑色毛衣");
//        analysisRequest.setFieldValue("黑色毛衣");

        fieldTypes.add("text_ngrm");
        analysisRequest.setQuery("马夹");
        analysisRequest.setFieldValue("马夹");
        analysisRequest.setFieldTypes(fieldTypes);

        FieldAnalysisResponse response = analysisRequest.process(client, "item_v2");
        System.out.println(response);

        //FieldAnalysisResponse.Analysis fieldTypeAnalysisRes = response.getFieldTypeAnalysis("text_ik");
        FieldAnalysisResponse.Analysis fieldTypeAnalysisRes = response.getFieldTypeAnalysis("text_ngrm");

        Iterable<AnalysisResponseBase.AnalysisPhase> analysisPhaseIterable = fieldTypeAnalysisRes.getQueryPhases();
        Iterator<AnalysisResponseBase.AnalysisPhase> analysisPhaseIterator = analysisPhaseIterable.iterator();

        while (analysisPhaseIterator.hasNext()){
            AnalysisResponseBase.AnalysisPhase analysisPhase = analysisPhaseIterator.next();
            System.out.println(analysisPhase.getClassName());
            List<AnalysisResponseBase.TokenInfo> tokens = analysisPhase.getTokens();
            for (AnalysisResponseBase.TokenInfo token:tokens) {
                System.out.println(token.getText() + "  " + token.getType() + "  " );
            }
        }
    }



}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值