Solr入门和实践以及我对Solr的8点理解
友情提示
Solr的內(nèi)容還是比較多的,一篇文章只能講解一部分。
全面介紹,沒興趣,沒時間,也沒能力,回報還不大。
本文只寫點(diǎn)我認(rèn)為比較重要的知識點(diǎn),獨(dú)特的個人想法。
僅供參考哦,更多細(xì)節(jié)需要自己去琢磨。
概述
Solr是一個高性能,采用Java5開發(fā),基于Lucene的全文搜索服務(wù)器。同時對其進(jìn)行了擴(kuò)展,提供了比Lucene更為豐富的查詢語言,
同時實(shí)現(xiàn)了可配置、可擴(kuò)展并對查詢性能進(jìn)行了優(yōu)化,并且提供了一個完善的功能管理界面,是一款非常優(yōu)秀的全文搜索引擎。
工作方式
文檔通過Http利用XML 加到一個搜索集合中。
查詢該集合也是通過http收到一個XML/JSON響應(yīng)來實(shí)現(xiàn)。
它的主要特性包括:高效、靈活的緩存功能,垂直搜索功能,高亮顯示搜索結(jié)果,通過索引復(fù)制來提高可用性,
提供一套強(qiáng)大Data Schema來定義字段,類型和設(shè)置文本分析,提供基于Web的管理界面等。
需求場景
查詢和搜索,我們直接查詢數(shù)據(jù)庫MySQL。查詢數(shù)據(jù)庫主要有一些局限性:
比如多表查詢效率低,大文本字段不好建立索引和搜索,復(fù)雜的條件查詢和搜索功能不夠強(qiáng)大,或者說不夠簡單。
使用Solr的話,就很簡單地解決了以上問題。
以上需求,或者說關(guān)系型數(shù)據(jù)庫mysql的問題,只是目前的一點(diǎn)理解。
雖說能夠使用MySQL和Sorl解決實(shí)際中的問題,但畢竟都是中低難度的問題(自認(rèn)為如此哦)。
非要說深入理解,剖析Solr的好處,MySQL是否“干的過”Solr,真心不懂。
單獨(dú)搞MySQL,夠你研究5年以上,DBA畢竟是個傳說。
Solr,想搞懂,也得好多年。
個人同時學(xué)習(xí)Java服務(wù)端、Android、iOS、Web前端,目標(biāo)是能夠解決工作中最常見的問題,并不想要
深入學(xué)習(xí)有限的幾種技術(shù),比如MySQL,達(dá)到那種“再難的問題,也可以搞定”的程度。
我對Solr的8點(diǎn)理解
1.定義數(shù)據(jù)源接口,獲得數(shù)據(jù)。
比如定義MySQL查詢語句,把一個表或多個表的數(shù)據(jù),導(dǎo)入到Solr中。
這個地方我覺得特別“不公平”,數(shù)據(jù)都是從別的地方搞過來的。外界的數(shù)據(jù)如果會變化,意味著,必須處理“數(shù)據(jù)同步”。
實(shí)時性要求不高的情況下,可以每天“全量更新”。要求高的情況下,單條數(shù)據(jù)的變化,需要“實(shí)時更新-單條”。
因此,Solr和Mysql并不是“直接競爭”關(guān)系,而是“互補(bǔ)”的關(guān)系。
2.把Mysql等數(shù)據(jù)源的數(shù)據(jù),導(dǎo)入到Solr中去。
Solr定義數(shù)據(jù),可以理解成一張很大的表,包含了很多字段,比如可以包含mysql中3個表的所有字段。
這樣,查詢就不存在“多表”的問題。
既然是一張表,建立索引,查詢就很快了。
3.自帶緩存功能。
Mysql,Solr,Redis等數(shù)據(jù)源或者有能力獲得數(shù)據(jù)和管理數(shù)據(jù)的組件,只要需要,就可以提供“緩存”功能。
Solr簡化了查詢,緩存就更容易了。
4.索引和全文搜索。
Solr底層采用Lucene建立索引,全文索引,這樣可以實(shí)現(xiàn)更多的“搜索功能”,可以說增強(qiáng)了Mysql的查詢。
5.站內(nèi)搜索的另外一種形式。
百度等搜索引擎,可以為網(wǎng)站提供“站內(nèi)搜索”功能,他們爬去數(shù)據(jù)可以是公開的URL的形式。
如果需要和百度等合作,可以申請使用百度的搜索API,將站內(nèi)數(shù)據(jù),更友好,更快速地告訴百度。
而Solr和百度提供的搜索相關(guān)接口就基本一樣,只不過是處在我們的管理之下。
6.簡潔使用的管理界面。
后臺有Web界面,導(dǎo)入數(shù)據(jù),更新,可以通過可視化的操作來管理,比較方便。
7.功能服務(wù)化。
Solr提供的查詢等功能,有Java等多種語言的實(shí)現(xiàn)。
建立數(shù)據(jù)結(jié)構(gòu),導(dǎo)入數(shù)據(jù),維護(hù)緩存和實(shí)時性,最重要的就是“查詢”和“搜索”了。
8.最大的“隱患”。
只用Mysql管理數(shù)據(jù)和查詢的時候,我們必須并且只需要保障mysql的“高可用性”。
不能出任何問題,如果只用1個Mysql,意味著我們需要實(shí)時監(jiān)控Mysql是否可用,如果出了問題,我們需要立即修復(fù)它。
如果是多臺Mysql,我們需要用主從,或者更復(fù)雜的主從。
現(xiàn)在用了Solr,意味著,我們很多查詢和搜索,優(yōu)先使用Solr,不再使用Mysql。
這個時候,為了“高可靠性”,我們也必須保障Solr是靠譜的。
單臺Solr服務(wù)器,可靠性怎么樣,我不太清楚。
無論單臺Solr是否靠譜,多臺Solr更加靠譜,這都意味著
“我們程序中必須可靠的基礎(chǔ)服務(wù)更多了”。
常見的必須“高可用性”的服務(wù)有
a.Mysql
b.Redis
3.Nginx
4.Solr
高可用性的服務(wù)越多,意味著我們的程序越復(fù)雜。
大部分的公司,都是中小型企業(yè)。
大部分的應(yīng)用,都是為了快速推出,看看是否有效果。
真正需要保障“高可靠性”的項(xiàng)目,是很少的,如果遇到了,是很幸運(yùn)的。
官方網(wǎng)站:http://lucene.apache.org/solr/
本地環(huán)境:Windows-5.3.1版本
運(yùn)行和建立工程
啟動:solr.cmd start(類似這樣)
建立工程:
name=raikou
config=solrconfig.xml
schema=schema.xml
dataDir=J:\SoftData\Solr\raikou\data
指定config、schema等多種參數(shù)。
(圖文并茂的入門指引,可以參考其它博主的文章,本人覺得這種“圖文并茂”的太尼瑪費(fèi)事了。
方便了讀者,但是“技術(shù)含量”不夠高,博主表示不過癮o(︶︿︶)o )
簡要介紹下幾個配置,附帶源文件內(nèi)容
core.properties
| 1 2 3 4 | name=raikou(項(xiàng)目名稱) config=solrconfig.xml(Solr配置) schema=schema.xml(模式定義) dataDir=J:\SoftData\Solr\raikou\data (存儲索引等數(shù)據(jù)) |
Web界面輸入的內(nèi)容,保存在這了,入口配置,可以這么說。
schema.xml
| 1 2 3 4 | <field indexed="true" multivalued="false" name="id" required="true" stored="true" type="long"> <field indexed="true" name="title" required="true" stored="true" type="string"> <field indexed="true" name="content" stored="true" type="string"> <field indexed="true" name="summary" stored="true" type="string"> </field></field></field></field> |
定義了幾個字段
id
title
唯一字段,默認(rèn)查詢字段
schemal.xml還配置了若干其它配置文件,比如“stopwords_en.txt”、“protwords.txt”、“stopwords.txt”等。
如果Solr啟動報錯,可能是缺少了這些字段。
data-config.xml
| 1 2 3 4 5 6 7 8 9 | <!--?xml version=1.0 encoding=UTF-8?-->? <dataconfig>? <datasource driver="com.mysql.jdbc.Driver" password="mypassword/" type="JdbcDataSource" url="jdbc:mysql://localhost:3306/raikou?useUnicode=true&characterEncoding=UTF-8" user="root">? ??? <document name="raikou_article">?????????? ????<entity deltaimportquery="select" deltaquery="select" from="" id="${dih.delta.id}" name="raikou_article" query="select" raikou_article="" update_time="" where=""> '${dataimporter.last_index_time}'>??????????????????? ????????????????<field column="id" name="id">? ????????????????<field column="title" name="title"> </field></field></entity></document></datasource></dataconfig> |
定義了數(shù)據(jù)導(dǎo)入、增量更新的查詢語句。
web.xml 這段配置,可能有用
E:Mongodb-Redis-Nginxsolr-5.3.1serversolr-webappwebappWEB-INFweb.xml
| 1 2 3 4 5 6 7 8 9 | <!-- People who want to hardcode their Solr Home directly into the ??????WAR File can set the JNDI property here... ??--> ?? ???<env-entry> ??????<env-entry-name>solr/home</env-entry-name> ??????<env-entry-value>J:SoftDataSolr</env-entry-value> ??????<env-entry-type>java.lang.String</env-entry-type> ???</env-entry> |
Java程序訪問
maven配置
| 1 2 3 4 5 | <dependency> ????????<groupid>org.apache.solr</groupid> ????????solr-solrj</artifactid> ????????<version>5.3.1</version> ????</dependency> |
包名:org.apache.solr.client.solrj
工具類
SolrHelper.java 查詢(查詢語句構(gòu)造和執(zhí)行查詢,分頁查詢),更新,重建索引
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 | import java.beans.PropertyDescriptor; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrInputDocument; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.pagehelper.Page; /**查詢(查詢語句構(gòu)造),更新,重建索引*/ public class SolrHelper<t> { ????protected final Logger logger = LoggerFactory.getLogger(SolrHelper.class); ????private HttpSolrClient server; ????private StringBuffer queryString; ????public SolrHelper(String reqUrl) { ????????server = new HttpSolrClient(reqUrl); ????????queryString = new StringBuffer(); ????} ????public void andEquals(String fieldName, String val) { ????????queryString.append( && ).append(fieldName).append(:).append(val); ????} ????public void orEquals(String fieldName, String val) { ????????queryString.append( || ).append(fieldName).append(:).append(val); ????} ????public void andNotEquals(String fieldName, String val) { ????????queryString.append( && ).append(-).append(fieldName).append(:) ????????????????.append(val); ????} ????public void orNotEquals(String fieldName, String val) { ????????queryString.append( || ).append(-).append(fieldName).append(:) ????????????????.append(val); ????} ????public void andGreaterThan(String fieldName, String val) { ????????queryString.append( && ).append(fieldName).append(:[).append(val) ????????????????.append( TO ).append(*]); ????} ????public void orGreaterThan(String fieldName, String val) { ????????queryString.append( || ).append(fieldName).append(:[).append(val) ????????????????.append( TO ).append(*]); ????} ????public void andGreaterThanOrEqualTo(String fieldName, String val) { ????????queryString.append( && ).append(fieldName).append(:[).append(val) ????????????????.append( TO ).append(*]); ????} ????public void orGreaterThanOrEqualTo(String fieldName, String val) { ????????queryString.append( || ).append(fieldName).append(:[).append(val) ????????????????.append( TO ).append(*]); ????} ????public void andDateGreaterThan(String fieldName, Date val) { ????????queryString.append( && ).append(fieldName).append(:[) ????????????????.append(formatUTCString(val)).append( TO ).append(*]); ????} ????public void orDateGreaterThan(String fieldName, Date val) { ????????queryString.append( || ).append(fieldName).append(:[) ????????????????.append(formatUTCString(val)).append( TO ).append(*]); ????} ????public void andDateGreaterThanOrEqualTo(String fieldName, Date val) { ????????queryString.append( && ).append(fieldName).append(:[) ????????????????.append(formatUTCString(val)).append( TO ).append(*]); ????} ????public void orDateGreaterThanOrEqualTo(String fieldName, Date val) { ????????queryString.append( || ).append(fieldName).append(:[) ????????????????.append(formatUTCString(val)).append( TO ).append(*]); ????} ????public void andLessThan(String fieldName, String val) { ????????queryString.append( && ).append(fieldName).append(:[).append(*) ????????????????.append( TO ).append(val).append(]); ????} ????public void orLessThan(String fieldName, String val) { ????????queryString.append( && ).append(fieldName).append(:[).append(*) ????????????????.append( TO ).append(val).append(]); ????} ????public void andLessThanOrEqualTo(String fieldName, String val) { ????????queryString.append( && ).append(fieldName).append(:[).append(*) ????????????????.append( TO ).append(val).append(]); ????} ????public void orLessThanOrEqualTo(String fieldName, String val) { ????????queryString.append( && ).append(fieldName).append(:[).append(*) ????????????????.append( TO ).append(val).append(]); ????} ????public void andDateLessThan(String fieldName, Date val) { ????????queryString.append( && ).append(fieldName).append(:[).append(*) ????????????????.append( TO ).append(formatUTCString(val)).append(]); ????} ????public void orDateLessThan(String fieldName, Date val) { ????????queryString.append( && ).append(fieldName).append(:[).append(*) ????????????????.append( TO ).append(formatUTCString(val)).append(]); ????} ????public void andDateLessThanOrEqualTo(String fieldName, Date val) { ????????queryString.append( && ).append(fieldName).append(:[).append(*) ????????????????.append( TO ).append(formatUTCString(val)).append(]); ????} ????public void orDateLessThanOrEqualTo(String fieldName, Date val) { ????????queryString.append( && ).append(fieldName).append(:[).append(*) ????????????????.append( TO ).append(formatUTCString(val)).append(]); ????} ????public void andLike(String fieldName, String val) { ????????queryString.append( && ).append(fieldName).append(:*).append(val) ????????????????.append(*); ????} ????public void orLike(String fieldName, String val) { ????????queryString.append( || ).append(fieldName).append(:*).append(val) ????????????????.append(*); ????} ????public void andNotLike(String fieldName, String val) { ????????queryString.append( && ).append(-).append(fieldName).append(:*) ????????????????.append(val).append(*); ????} ????public void orNotLike(String fieldName, String val) { ????????queryString.append( || ).append(-).append(fieldName).append(:*) ????????????????.append(val).append(*); ????} ????public void andIn(String fieldName, String[] vals) { ????????queryString.append( && ); ????????in(fieldName, vals); ????} ????private void in(String fieldName, String[] vals) { ????????List<string> list=Arrays.asList(vals); ????????in(queryString,fieldName,list); ????} ????? ????public void orIn(String fieldName, List<string> vals) { ????????queryString.append( || ); ????????in(queryString,fieldName,vals); ????} ????private static void in(StringBuffer queryString,String fieldName, List<string> vals) { ????????queryString.append((); ????????inStr(queryString, fieldName, vals); ????????queryString.append()); ????} ????private static void inStr(StringBuffer queryString, String fieldName, ????????????List<string> vals) { ????????int index = 0; ????????for (String val : vals) { ????????????if (0 != index) { ????????????????queryString.append( || ); ????????????} ????????????queryString.append(fieldName).append(:).append(val); ????????????index++; ????????} ????} ????? ????// http://stackoverflow.com/questions/634765/using-or-and-not-in-solr-query ????//instead of NOT [condition] use (*:* NOT [condition]) ????public void andNotIn(String fieldName, String[] vals) { ????????List<string> list=Arrays.asList(vals); ????????queryString.append(&&(); ????????queryString.append(*:* NOT ); ????????inStr(queryString, fieldName, list); ????????queryString.append()); ????} ????public void andDateBetween(String fieldName, Date startDate, Date endDate) { ????????queryString.append( && ).append(fieldName).append(:[) ????????????????.append(formatUTCString(startDate)).append( TO ) ????????????????.append(formatUTCString(endDate)).append(]); ????} ????public void orDateBetween(String fieldName, Date startDate, Date endDate) { ????????queryString.append( || ).append(fieldName).append(:[) ????????????????.append(formatUTCString(startDate)).append( TO ) ????????????????.append(formatUTCString(endDate)).append(]); ????} ????public void andDateNotBetween(String fieldName, Date startDate, Date endDate) { ????????queryString.append( && ).append(-).append(fieldName).append(:[) ????????????????.append(formatUTCString(startDate)).append( TO ) ????????????????.append(formatUTCString(endDate)).append(]); ????} ????public void orDateNotBetween(String fieldName, Date startDate, Date endDate) { ????????queryString.append( && ).append(-).append(fieldName).append(:[) ????????????????.append(formatUTCString(startDate)).append( TO ) ????????????????.append(formatUTCString(endDate)).append(]); ????} ????public void andBetween(String fieldName, String start, String end) { ????????queryString.append( && ).append(fieldName).append(:[).append(start) ????????????????.append( TO ).append(end).append(]); ????} ????public void orBetween(String fieldName, String start, String end) { ????????queryString.append( || ).append(fieldName).append(:[).append(start) ????????????????.append( TO ).append(end).append(]); ????} ????public void andNotBetween(String fieldName, String start, String end) { ????????queryString.append( && ).append(-).append(fieldName).append(:[) ????????????????.append(start).append( TO ).append(end).append(]); ????} ????public void orNotBetween(String fieldName, String start, String end) { ????????queryString.append( || ).append(-).append(fieldName).append(:[) ????????????????.append(start).append( TO ).append(end).append(]); ????} ????public void andStartSub() { ????????queryString.append( && (); ????} ????public void orStartSub() { ????????queryString.append( || (); ????} ????public void endSub() { ????????queryString.append()); ????} ????private String formatUTCString(Date d) { ????????SimpleDateFormat sdf = new SimpleDateFormat(yyyy-MM-dd'T'HH:mm:ss'Z'); ????????String s = sdf.format(d); ????????return s; ????} ????public int execQueryTotalCount() { ????????SolrQuery params = handleQuery(); ????????params.set(start, 0); ????????params.set(rows, Integer.MAX_VALUE); ????????QueryResponse response = null; ????????try { ????????????response = server.query(params); ????????????return response.getResults().size(); ????????} catch (SolrServerException e) { ????????????logger.error(, e); ????????} catch (IOException e) { ????????????logger.error(, e); ????????} ????????return 0; ????} ????public List<t> query(String sort, Class<t> beanClass) { ????????SolrQuery params = handleQuery(); ????????QueryResponse response = null; ????????List<t> list = null; ????????try { ????????????logger.info(SolyQuery: + params.toString()); ????????????response = server.query(params); ????????????list = (List<t>) response.getBeans(beanClass); ????????} catch (SolrServerException e) { ????????????logger.error(SolrServerException, e); ????????} catch (IOException e) { ????????????logger.error(IOException, e); ????????} ????????return list; ????} ????public Page<t> execQuery(Integer pageNo, Integer rows, String sort, ????????????Class<t> beanClass) { ????????List<t> results = null; ????????Page<t> page = null; ????????SolrQuery params = handleQuery(); ????????if (pageNo != null && rows != null && pageNo > 0 && rows > 0) { ????????????params.set(start, (pageNo - 1) * rows); ????????????params.set(rows, rows); ????????} ????????if (null != sort && !.equals(sort)) { ????????????params.set(sort, sort); ????????} ????????QueryResponse response = null; ????????try { ????????????logger.info(SolyQuery WithPage: + params.toString()); ????????????response = server.query(params); ????????????results = (List<t>) response.getBeans(beanClass); ????????????page = new Page<t>(pageNo, rows, execQueryTotalCount()); ????????????page.addAll(results); ????????} catch (SolrServerException e) { ????????????logger.error(SolrServerException, e); ????????} catch (IOException e) { ????????????logger.error(IOException, e); ????????} ????????return page; ????} ????private SolrQuery handleQuery() { ????????SolrQuery params = new SolrQuery(); ????????String qryFinalStr = queryString.toString(); ????????if (qryFinalStr.startsWith( && )) { ????????????qryFinalStr = qryFinalStr.replaceFirst( && , ); ????????} else if (qryFinalStr.startsWith( || )) { ????????????qryFinalStr = qryFinalStr.replaceFirst( || , ); ????????} ????????// 子查詢開頭的關(guān)聯(lián)符號 ????????if (-1 != qryFinalStr.indexOf(( && )) { ????????????qryFinalStr = qryFinalStr.replaceAll(\( \&\& , (); ????????} ????????if (-1 != qryFinalStr.indexOf(( || )) { ????????????qryFinalStr = qryFinalStr.replaceAll(\( \|\| , (); ????????} ????????if (StringUtils.isBlank(qryFinalStr)) { ????????????qryFinalStr = *:*; ????????} ????????params.set(q, qryFinalStr); ????????return params; ????} ????public void execDelete(String keyName, String keyVal) { ????????try { ????????????server.deleteByQuery(keyName + : + keyVal); ????????????server.commit(); ????????} catch (SolrServerException | IOException e) { ????????????logger.error(, e); ????????} ????} ????public void execUpdate(T model) { ????????Field[] fields = model.getClass().getDeclaredFields(); ????????SolrInputDocument solrDoc = new SolrInputDocument(); ????????try { ????????????for (Field f : fields) { ????????????????PropertyDescriptor pd; ????????????????pd = new PropertyDescriptor(f.getName(), model.getClass()); ????????????????// 屬性名 ????????????????String fieldName = f.getName(); ????????????????Method rM = pd.getReadMethod();// 獲得讀方法 ????????????????solrDoc.addField(fieldName, rM.invoke(model)); ????????????} ????????????server.add(solrDoc); ????????????server.commit(); ????????} catch (Exception e) { ????????????logger.error(, e); ????????} ????} ????public void execUpdate(SolrInputDocument solrDoc) { ????????try { ????????????server.add(solrDoc); ????????????server.commit(); ????????} catch (SolrServerException e) { ????????????logger.error(, e); ????????} catch (IOException e) { ????????????logger.error(, e); ????????} ????} ????/** ?????* 重建索引和增量索引的接口 ?????* ?????* @param delta ?????*/ ????public void buildIndex(boolean delta) { ????????SolrQuery query = new SolrQuery(); ????????// 指定RequestHandler,默認(rèn)使用/select ????????query.setRequestHandler(/dataimport); ????????String command = delta ? delta-import : full-import; ????????String clean = delta ? false : true; ????????String optimize = delta ? false : true; ????????query.setParam(command, command).setParam(clean, clean) ????????????????.setParam(commit, true).setParam(optimize, optimize); ????????try { ????????????server.query(query); ????????} catch (SolrServerException e) { ????????????logger.error(建立索引時遇到錯誤,delta: + delta, e); ????????} catch (IOException e) { ????????????logger.error(建立索引時遇到錯誤,delta: + delta, e); ????????} ????} }</t></t></t></t></t></t></t></t></t></t></string></string></string></string></string></t> |
代碼使用示例:
1.常見的分頁查詢,更新單條數(shù)據(jù)
| 1 2 3 4 5 6 7 8 9 10 | public static void main(String[] args) { ????????SolrHelper<project> sh = new SolrHelper<project>( ????????????????http://host/solr/project); ????????sh.andEquals(id, 32404); ????????List<project> page = sh.execQuery(1, 10, id desc, ????????????????Project.class); ????????Project ps = page.get(0); ????????ps.setTotal(3.1415); ????????sh.execUpdate(ps); ????}</project></project></project> |
2.不修改,直接同步
| 1 2 3 4 5 6 | public void synProject(long id) { ????????ProjectSolrDto solrDto = projectMapper.selectSolrProjectSimple(id); ????????SolrHelper<projectsolrdto> solrHelper = new SolrHelper<projectsolrdto>( ????????????????solrProjectUrl); ????????solrHelper.execUpdate(solrDto); ????}</projectsolrdto></projectsolrdto> |
3.同步某幾個字段
| 1 2 3 4 5 6 7 8 9 10 11 | public void synIntention(Long id) { ????????Intention intention = intentionMapper.selectByPrimaryKey(id); ????????SolrHelper<intention> solrHelper = new SolrHelper<intention>( ????????????????solrIntentionUrl); ????????SolrInputDocument solrDoc = new SolrInputDocument(); ????????solrDoc.addField(id, intention.getId()); ????????solrDoc.addField(intro, intention.getIntro()); ????????solrDoc.addField(industry, intention.getIndustry()); ????????solrHelper.execUpdate(solrDoc); ????} ????</intention></intention> |
4.刪除
| 1 2 3 4 5 | public void delFund(Long id) { ????????SolrHelper<intention> solrHelper = new SolrHelper<intention>( ????????????????solrFundUrl); ????????solrHelper.execDelete(id, id.toString()); ????}</intention></intention> |
幾點(diǎn)補(bǔ)充
1.需要有“定時器”,定時“全量更新”和“重建索引”,防止數(shù)據(jù)不一致,或者查詢效率低。
2.SolrHelper中的代碼,或者說Solr的相關(guān)代碼,無非就是“增刪改查CRUD”,比較特殊的
“重建索引”和為了執(zhí)行查詢,拼接查詢條件的“And,Or”等工具方法。
3.分頁有個實(shí)體類,用到了Github上的1個工具,個人覺得一般般,Page類的定義比較糟糕。
如有需要,自己引入,或者自行改造。
寫在最后
IT互聯(lián)網(wǎng)技術(shù)很多,更新很快,問題也很多,深入需要實(shí)踐,深入需要時間。
技術(shù)方面的博學(xué)和專注,自己去平衡吧~
技術(shù)和技術(shù)之外的平衡,自己看著辦哦~
轉(zhuǎn)載于:https://www.cnblogs.com/duanxz/p/5208365.html
總結(jié)
以上是生活随笔為你收集整理的Solr入门和实践以及我对Solr的8点理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CORBA GIOP消息格式学习
- 下一篇: POPTEST老李分享修改dns ip的