標籤:des style blog http color io os 使用 java
什麼是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實體類。
@Fieldprivate 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的配置,可以參考文檔。
五、SolrJ、Request Handler