SolrJ、Request Handler
2015-07-21 13:39
381 查看
什么是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.jar2、 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);
//正常取值
SolrDocumentList docs = response.getResults();
Iterator<SolrDocument> it =response.getResults().iterator();
这边的精华就是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的使用是不是很简单呢:),当然这只是一些基本的使用。下面看一个完整的客户端例子:
public class test {
public static void main(String[] args) throws SolrServerException, IOException{
String url = "http://localhost:8080/solr/collection1"; //solr+索引库
SolrServer server = new HttpSolrServer(url);
SolrQuery query = new SolrQuery();
// query.setQuery("*:*"); //设置查询条件
query.setQuery("t_name:包大人");
query.setRows(10);// 设置每次取多少条
query.setStart(0);//设置从第几条开始查询
query.setSort("t_id",ORDER.desc); //设置排序字段
//以下几行设置查询结果关键字高亮显示
query.setHighlight(true);
query.setParam("hl.fl", "t_name"); // hl.fl参数表示哪几个Field字段高亮
query.setHighlightSimplePre("<font color=red>");
query.setHighlightSimplePost("</font>");
try {
QueryResponse response = server.query(query); //查询响应
SolrDocumentList docs = response.getResults();
System.out.println("文档个数:" + docs.getNumFound());
System.out.println("查询时间:" + response.getQTime());
for (SolrDocument doc : docs) {
System.out.println("t_id: " + doc.getFieldValue("t_id"));
System.out.println("t_name : " + doc.getFieldValue("t_name"));
}
//正常取值
Iterator<SolrDocument> it =response.getResults().iterator();
while(it.hasNext()){
SolrDocument doc = (SolrDocument)it.next();
System.out.println(">>t_id: " + doc.getFieldValue("t_id"));
System.out.println(">>t_name : " + doc.getFieldValue("t_name"));
}
//用高亮的形式取值
Map<String,Map<String,List<String>>> tempMap = response.getHighlighting();
for(Map.Entry<String, Map<String,List<String>>> entry : tempMap.entrySet()) {
System.out.println(entry.getKey()+">>>>"+entry.getValue().get("t_name").get(0));
}
} catch (Exception e) {
e.printStackTrace();
}
}
查询结果:
文档个数:1
查询时间:1
t_id: 2
t_name : 包大人救救我
>>t_id: 2
>>t_name : 包大人救救我
2>>>><font color=red>包</font><font color=red>大人</font>救救我
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的配置,可以参考文档。
相关文章推荐
- 管理系统UI之四:使用全屏沉浸模式(Using Immersive Full-Screen Mode)
- 响应UI可见性的变化
- iOS8新特性之---- UIAlertController解析
- firefox os 2.1版本号UI接口方面有了质的飞跃
- POJ 1019 Number Sequence
- UITableView以及cell属性
- guestmount
- CodeForces 484B Maximum Value
- IOS学习笔记UIButton
- guestfish 修改 image file
- 设置UIView几个角为圆角
- YUI Compressor使用配置方法 JS/CSS压缩工具
- iOS7中计算UILabel中字符串的高度
- iOS-Core-Animation-Advanced-Techniques(六)
- iOS-Core-Animation-Advanced-Techniques(四)
- iOS-Core-Animation-Advanced-Techniques(一)
- 【xib】加载的一些问题,以UICollectionView 为例
- ContentResolver query 参数详解
- 【EasyUI】——EasyUI的布局
- iOS 中如何除去UIAlertView 规避delegate对象销毁后接收消息的crash