当前位置: 首页 > news >正文

[ solr入门 ] - 利用solrJ进行检索

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

[ solr入门 ] - 利用solrJ进行检索

solrJ可以看成是solr的java版客户端,提供基本的索引维护、检索等功能。

 

solrJ和solr服务端有两种“沟通”方式:

第一,利用http进行通信。

第二,直接访问solrCore(solr配置文件、索引文件等),不需要http通信(without http)。

solrJ的SolrServer类结构如下图所示:

EmbeddedSolrServer是第二种方式,CommonsHttpSolrServer,LBHttpSolrServer是第一种方式,

其中LBHttpSolrServer是在CommonsHttpSolrServer的基础上提供了负载均衡的功能(load Balanced)。

在很多应用场景下,我们基本都会选择CommonsHttpSolrServer(LBHttpSolrServer)的方式。最近笔者有这样一个需求,在异构平台上,有多种语言开发的系统都需要对基础数据进行检索,如果每个系统都针对性的开发一个客户端,主要缺陷是紧耦合。因此笔者考虑在solr的基础上开发一套标准的webService接口发布服务,如果在solrCore的基础上进行调整,调整量太大,如果借助solrJ的CommonsHttpSolrServer与solrServer进行沟通,那么就会多走一次http。最后发现EmbeddedSolrServer可以解决这个问题。

然后目前EmbeddedSolrServer也有一些问题需要处理,例如:multiCore、load Balanced等。

 

下面我们从检索入手,初步了解solrJ的使用方法。

第一步:建立solrJ客户端的“通讯员”(CommonsHttpSolrServer)

SolrServer server = new CommonsHttpSolrServer( url );

 

第二步:检索

方式一:借助SolrRequestParsers解析“检索字符串”进行检索

public void query01(String queryString) {

        SolrParams solrParams = SolrRequestParsers

                .parseQueryString(queryString);

        try {

            QueryResponse rsp = solr.query(solrParams);

            List<PatentBean> results = rsp.getBeans(PatentBean.class);

            for (PatentBean bean : results)

                System.out.println(bean.toString());

        } catch (SolrServerException e) {

            e.printStackTrace();

        }

    }

queryString:String queryString = "q=ti:汽车&version=2.2&start=0&rows=10&indent=on";

这种方式简单,但是在应用中通过拼接字符串是比较憋足的,所以这种方式应用较少。

注意:

List<PatentBean> results = rsp.getBeans(PatentBean.class);Bean这种方式,不管索引维护,还是检索都十分方便。

 

方式二:借助ModifiableSolrParams对象接收查询条件进行检索

public void query02(String queryString) {

        ModifiableSolrParams solrParams = new ModifiableSolrParams();

        solrParams.add("q", queryString);

        solrParams.add("start", "0");

        solrParams.add("rows", "10");

        try {

            QueryResponse rsp = solr.query(solrParams);

            List<PatentBean> results = rsp.getBeans(PatentBean.class);

            for (PatentBean bean : results)

                System.out.println(bean.toString());

        } catch (SolrServerException e) {

            e.printStackTrace();

        }

    }

这种方式和第一种类似,如果第一种方式用个StringBuilt接收参数,那么就没什么两样了! 

 

方式三:借助solrQuery对象接收查询条件进行检索

public void query02(String queryString) {

        SolrQuery query = new SolrQuery();

        query.setQuery(queryString);

        query.setStart(0);

        query.setRows(10);

        QueryResponse rsp;

        try {

            rsp = solr.query(query);

            List<PatentBean> results = rsp.getBeans(PatentBean.class);

            for (PatentBean bean : results)

                System.out.println(bean.toString());

        } catch (SolrServerException e) {

            e.printStackTrace();

        }

    }

添加高亮效果:

query.setHighlight(true).setHighlightSnippets(1);

query.setParam("hl.fl", "ti");

 

使用EmbeddedSolrServer进行检索

创建EmbeddedSolrServer对象,如下:

private static CoreContainer.Initializer initializer = null;

    private static CoreContainer coreContainer = null;

    private static EmbeddedSolrServer server = null;

    static {

        try {

            System.setProperty("solr.solr.home", "D:/solrHome/example/solr02");

            initializer = new CoreContainer.Initializer();

            coreContainer = initializer.initialize();

            server = new EmbeddedSolrServer(coreContainer, "");

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

 

转载于:https://my.oschina.net/u/2929819/blog/805209

相关文章:

  • hudson运行出现java.io.IOException Cannot run program的错误分析
  • shell之变量和引用
  • GIT教程
  • ios UIApplocation 中APP启动方式
  • 推送知识点2
  • 各种数据库连接字符串
  • Java程序,JDK的安装、环境的配置
  • 写一个简易的shell脚本(二)
  • css中import与link用法区别
  • 避免死锁
  • ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
  • Linux下如何修改Apache根目录
  • Linux at 定时任务
  • 墨香带你学Launcher之(七)--小部件的加载、添加以及大小调节
  • 命令行工具
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • HomeBrew常规使用教程
  • HTTP中GET与POST的区别 99%的错误认识
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • javascript 总结(常用工具类的封装)
  • node-glob通配符
  • pdf文件如何在线转换为jpg图片
  • PHP那些事儿
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 关于 Cirru Editor 存储格式
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 如何在 Tornado 中实现 Middleware
  • 实现菜单下拉伸展折叠效果demo
  • 携程小程序初体验
  • 学习JavaScript数据结构与算法 — 树
  • 原生JS动态加载JS、CSS文件及代码脚本
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​VRRP 虚拟路由冗余协议(华为)
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • (+4)2.2UML建模图
  • (C语言)fgets与fputs函数详解
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (规划)24届春招和25届暑假实习路线准备规划
  • (六)激光线扫描-三维重建
  • (三十五)大数据实战——Superset可视化平台搭建
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (译) 函数式 JS #1:简介
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET CLR基本术语
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 中让 Task 支持带超时的异步等待
  • .Net的DataSet直接与SQL2005交互
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [ACTF2020 新生赛]Include
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured