zoukankan      html  css  js  c++  java
  • 五、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的配置,可以参考文档。

  • 相关阅读:
    鱼站追踪记
    使用sqlmap对进行php+mysql注入实战
    Python黑客——快速编写信息收集器
    Visual Studio 2015 Update 1 安装到最后 KB3022398 错误解决方法
    ACdreamoj 1011(树状数组维护字符串hash前缀和)
    iOS开发--Mac下server搭建
    2.oracle分页,找到员工表中薪水大于本部门平均薪水的员工
    Android面试题3之描写叙述下Android的系统架构
    OpenCV入门笔记(三) 图片处理
    全民Scheme(1):数字游戏
  • 原文地址:https://www.cnblogs.com/edwinchen/p/3976404.html
Copyright © 2011-2022 走看看