五、SolrJ、Request Handler

什么是SolrJ

既然Solr是以单独的WebApp形式存在的,那么Solr理应提供与Solr通信的Api吧,对的,这就是SolrJ,既然与solr通信是通过url,那么其实我们也可以不用SolrJ,因为可以拼字符串的嘛。

http://localhost:8983/solr/Artist/select?q=Artist_Name:周杰伦&wt=json&indent=true

这样完全是可以的,但是用SolrJ来拼字符串更方便而已,如果看到这里,你就想用拼字符串的方式,那么将会很痛苦,因为SolrJ最大的好处就是解析返回的结果。如下:

{
  "responseHeader":{
    "status":0,
    "QTime":2},
  "response":{"numFound":1,"start":0,"docs":[
      {
        "Artist_NickName":"周杰伦",
        "Artist_NameQP":"",
        "Artist_IconNo":"0",
        "Artist_MVNum":191,
        "Artist_AuthDes":"",
        "Artist_SpaceID":-1,
        "Artist_Name":"周杰伦",
        "Artist_Name_Exact":"周杰伦",
        "Artist_CategoryID":"1415,1706",
        "Artist_SongNum":847,
        "Artist_Piclink2":"sod/artist/560/Z/周杰伦.jpg",
        "Artist_MobilePic":"sod/artist/mobile/Z/周杰伦.jpg",
        "Artist_ID":519,
        "Artist_Piclink1":"sod/artist/14/03/1394692573546.jpg",
        "Artist_PinYinInitial":"ZJL",
        "_version_":1479005578890051584}]
  }}

如果您非要自己解析…………..

SolrJ的使用

Jar包

  1、 apache-solr-solrj-3.5.0.jar

2、 commons-httpclient-3.1.jar

3、slf4j-api-1.6.0.jar

4、commons-logging-1.1.jar

连接Solr

HttpSolrServer solr = new HttpSolrServer(
            PropertieFactory.getProperty("solr_Song_index_url"));
SolrQuery songQuery = new SolrQuery();

其实就两行代码。其中url需要说明下,我用的是多索引库,所以URL如下:

Localhost:8983/solr/索引库名称

这样就能连接上了。

查询

songQuery.setRows(searchParameters.getPageSize());
      songQuery.setStart(searchParameters.getStarRecord());
      songQuery.setFields("Song_SongID", "Song_Name", "Song_SingerName",
            "Song_SpaceID", "Song_FilePic", "Song_FileMV", "Song_FileOL",
            "Song_CategoryRelated", "Song_CreateTime",
            "Song_ArtistRelated", "Song_UploadFlag", "Song_Quality",
            "Song_Attribute", "Song_PlayNum", "Song_DownNum",
            "Song_MVPlayNum","Song_ArtistID","Song_CategoryID");
      songQuery.setQuery(searchParameters.getSong_Name());
      songQuery.setFilterQueries("Song_Attribute:2");

上面这些都是在设置查询参数,还有很多方法可以参看SolrJ wiki。

其实也可以不用查文档,因为都可以使用如下的形式:

songQuery.set("","");

比如设置查询的内容:

songQuery.set("q","Artist_Name:周杰伦")

q即为Url中的参数格式,所以也可以看到,SolrJ在查询时,其实核心也就是在拼字符串~~

简单解释一下几个常用的设置,setRows和setStart是天然的分页,可以设置返回多少行,从第多少个记录返回。

SetFields是需要返回的Field

SetQuery就是设置查询条件咯

SetFilterQueries就是设置过滤条件,比如上面的代码,就只返回Song_Attribute为2的记录。

解析搜索结果

//查询
QueryResponse response = solr.query(songQuery);
//总共查询到的记录数
Long RecordNum = response.getResults().getNumFound();
//查询到的结果
songList = response.getBeans(com.search.domain.Song.class);

这边的精华就是Solr提供JavaBean接收返回结果。但是前提是需要一个Bean实体类。

@Field
private Integer song_SongID;
@Field标注需要注入的Field

@Field("Song_SongID")
   public void setSong_SongID(Integer song_SongID) {
      this.song_SongID = song_SongID;
   }

上一段代码卸载Set方法中,用处就是如果你在Bean中不想使用和Solr索引库中相同的Field名,可以用这个标注需要将Song_SongID注入到你自己命名的变量中。

需要注意的是,使用Bean接收,返回的是实体类的List。

SolrJ的使用是不是很简单呢:),当然这只是一些基本的使用。

Request Handlers

每个request handler都是由Name和实现的class定义的。通过url可以访问对应的request handler。比如

http://localhost:8983/solr/collection1/select?q=solr

就会访问name为select的request handler。

所以Request Handler的作用也就明了了,request handler可以统一配置对某索引库的访问,其实也类似于filter,对请求进行统一配置,进行预处理,最典型的例子就是highlighting,可参见另一篇博客:六、Solr高亮与Field权重

之所以和SolrJ放在一块,就是因为Request Handler也可以配置一些共用的参数,如分页时,每次查询返回多少行,可以在name为Search的request handler里面配置。这样Solrj在访问时,就不必每次单独指定,还有比如DIH的配置。

其他很多handler的配置,可以参考文档。

时间: 2024-07-30 23:47:18

五、SolrJ、Request Handler的相关文章

一、虚拟环境.二、路由配置主页与404.三、2.x路由分发.四、伪静态.五、request对象.六、FBV与CBV.七、文件上传.

一.虚拟环境 ''' 解决版本共存 1. 用pycharm选择File点击NewProject然后选择virtualenv创建一个纯净环境 2. 打开下载的目录将venv文件夹下的所有文件(纯净的环境)copy到需要指定长期使用的文件夹下 3. 再次创建项目时,将该环境(指定长期使用的文件夹下Scripts文件夹中的python.exe文件)添加到pycharm环境选择(System Interpreter)中 4. 为该环境添加需要处理的版本共存包 ''' 二.路由配置主页与404 ''' 路

【SpringMVC笔记】第五课 改进Handler处理器和视图解析器

第四课 已经对注解的映射器和适配器进行了改进. 接下来需要对Handler处理器和视图解析器进行改进. <!-- 配置handler处理器 --> <bean class="com.king.controller.UserController"></bean> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourc

Android笔记二十五.Android事件Handler消息传递机制

因为Android平台不同意Activity新启动的线程訪问该Activity里的界面控件.这样就会导致新启动的线程无法动态改变界面控件的属性值.但在实际Android应用开发中,尤其是涉及动画的游戏开发中,须要让新启动的线程周期性地改变界面控件的属性值,这就须要借助Handler的消息传递机制实现. 一.Handler类简单介绍 1.功能 Handler类主要有两个作用 (1)在新启动的线程中发送消息; (2)在主线程中获取消息.处理消息.即当须要界面发生变化的时候.在子线程中调用Handle

使用solrj进行DIH操作

背景说明:在一个项目中需要将Mongodb中的数据导入到solr中完成搜索.在solr中Mysql数据库有对应的DIH包,可以通过配置sql语句完成数据的导入.Mongodb下也有开源的工具用来实现数据的导入.看了下文档,感觉这个工具对数据的定制性不高,并且是python的,不是很满足项目需求.最后决定使用solrj来完成数据的导入. 一. 遇到的问题 1. 全量数据很大,在全量或者增量时无法一次性将数据全部获取: 对数据进行分页获取.(关于两种分页获取数据的性能问题,后面会单独介绍) 2. 全

《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth310/itt2zh上面持续更新,本文内容可能不是最新状态,请在GitHub上获得最新版本. 本文也可在http://demo.pythoner.com/itt2zh上进行格式化的预览. 第五章:异步Web服务 到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性

【Solr专题之九】SolrJ教程

一.SolrJ基础 1.相关资料 API:http://lucene.apache.org/solr/4_9_0/solr-solrj/ apache_solr_ref_guide_4.9.pdf:Client APIs---Using SolrJ http://wiki.apache.org/solr/Solrj solr in action:Using the SolrJ client library to add documents from Java, Using SolrJ from

Python开发【第十五篇】:Web框架之Tornado

概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化. Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数

org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: Internal Server Error 错误

Solr报错: { "responseHeader": { "status": 500, "QTime": 11 }, "error": { "trace": "java.lang.RuntimeException\r\n\tat org.apache.solr.search.ExtendedDismaxQParser$ExtendedDismaxConfiguration.<init>

搜索引擎系列十:Solr(solrj 、索引API 、 结构化数据导入)

一.SolrJ介绍 1. SolrJ是什么? Solr提供的用于JAVA应用中访问solr服务API的客户端jar.在我们的应用中引入solrj: <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>7.3.0</version> </dependency> 2. SolrJ的核