设为首页 收藏本站
查看: 985|回复: 0

[经验分享] solr newSearcher 跟 firstSearcher的监听器扩展

[复制链接]

尚未签到

发表于 2015-11-11 15:36:11 | 显示全部楼层 |阅读模式
  自定义SolrEventListener实现searcher的autowarm策略


  


  在solrconfig.xml上可以配置在newSearcher和firstSearcher的监听器,在事件触发时,可以做某些热身搜索,让Searcher做好准备提供服务,特别是服务重启的时候,如果没有做好热身,开始提供服务搜索时都很勉强。
  但原生的配置比较麻烦,如果要做多个搜索请求时,单纯在配置文件上配置略显得麻烦:
  


  

<listener event=&quot;newSearcher&quot; class=&quot;solr.QuerySenderListener&quot;>
<arr name=&quot;queries&quot;>
<lst><str name=&quot;q&quot;>美女</str><str name=&quot;qt&quot;>standard</str><str name=&quot;sort&quot;>rtsTime desc</str></lst>
<lst><str name=&quot;q&quot;>hadoop</str><str name=&quot;qt&quot;>standard</str><str name=&quot;sort&quot;>rtsTime desc</str></lst>
<lst><str name=&quot;q&quot;>zoie</str><str name=&quot;qt&quot;>standard</str><str name=&quot;sort&quot;>rts desc</str></lst>
<lst><str name=&quot;q&quot;>lucene</str><str name=&quot;qt&quot;>standard</str><str name=&quot;sort&quot;>pubdate desc</str></lst>
<lst><str name=&quot;q&quot;>new searcher</str><str name=&quot;qt&quot;>standard</str><str name=&quot;sort&quot;>sourceId desc</str></lst>
<lst><str name=&quot;q&quot;>solr</str><str name=&quot;qt&quot;>standard</str><str name=&quot;sort&quot;>price desc</str></lst>   
</arr>
</listener>


  
  


  现在扩展写另一个事件监听器,可以指定需要加载的某些字段,在预热后加载字段缓存,用于排序或者函数搜索使用的。
  增加每天的热词搜索,每行一个词,比如1000个词。
  


  主要扩展的代码如下:
  


  


  


  

package org.apache.solr.core;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.request.SolrQueryResponse;
import org.apache.solr.search.DocIterator;
import org.apache.solr.search.DocList;
import org.apache.solr.search.SolrIndexSearcher;
/**
* @author yzygenuine
*
*/
public class MyQuerySenderListener extends AbstractSolrEventListener {
/**
* 查询词文件路径
*/
private final static String QUERYKEY_FILE = &quot;queryKeyFile&quot;;
/**
* 需要缓存的字段数组
*/
private final static String SORT_FILEDS = &quot;sortFields&quot;;

public MyQuerySenderListener(SolrCore core) {
super(core);
}
@Override
public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher) {
List<String> sortFields = (List<String>) args.get(SORT_FILEDS);
final SolrIndexSearcher searcher = newSearcher;
NamedList sortParams = null;
if (sortFields != null && !sortFields.isEmpty()) {
sortParams = new NamedList();
for (int i = 0; i < sortFields.size(); i++) {
sortParams.add(CommonParams.SORT, sortFields.get(i) + &quot; desc&quot;);
}
}
String queryKeyFilePath = (String) args.get(QUERYKEY_FILE);
String qt=(String)args.get(CommonParams.QT);
boolean isDone = false;
if (queryKeyFilePath != null && !queryKeyFilePath.isEmpty()) {
log.info(&quot;###############################queryKeyFilePath:&quot; + queryKeyFilePath);
File f = new File(queryKeyFilePath);
if (f.exists() && f.canRead()) {
try {
List<String> keys = FileUtils.readLines(f, &quot;utf-8&quot;);
if (keys != null) {
for (String k : keys) {
if(k.isEmpty()||k.trim().isEmpty())continue;
NamedList params = new NamedList();
if (sortParams != null) {
params.addAll(sortParams);
}
params.add(CommonParams.Q, k);
if(qt!=null&&!qt.isEmpty()){
params.add(CommonParams.QT, qt);
}
reqLocal(params, searcher, currentSearcher);
}
isDone = true;
}
} catch (Exception e) {
log.error(&quot;&quot;, e);
isDone = false;
}
}
}
if (!isDone) {
try {
log.info(&quot;just req sortFields params&quot;);
reqLocal(sortParams, searcher, currentSearcher);
} catch (IOException e) {
log.error(&quot;&quot;, e);
}
}
log.info(&quot;QuerySenderListener sending requests to &quot; + newSearcher);
for (NamedList nlst : (List<NamedList>) args.get(&quot;queries&quot;)) {
try {
reqLocal(nlst, searcher, currentSearcher);
} catch (Exception e) {
}
}
log.info(&quot;QuerySenderListener done.&quot;);
}
/**
* @param nlst
* @param newSearcher
* @param currentSearcher
* @throws IOException
*/
private void reqLocal(NamedList nlst, final SolrIndexSearcher newSearcher, final SolrIndexSearcher currentSearcher)
throws IOException {
if (nlst == null) {
nlst = new NamedList();
}
NamedList params = addEventParms(currentSearcher, nlst);
LocalSolrQueryRequest req = new LocalSolrQueryRequest(core, params) {
@Override
public SolrIndexSearcher getSearcher() {
return newSearcher;
}
@Override
public void close() {
}
};
SolrQueryResponse rsp = new SolrQueryResponse();
core.execute(core.getRequestHandler(req.getParams().get(CommonParams.QT)), req, rsp);
NamedList values = rsp.getValues();
for (int i = 0; i < values.size(); i++) {
Object o = values.getVal(i);
if (o instanceof DocList) {
DocList docs = (DocList) o;
for (DocIterator iter = docs.iterator(); iter.hasNext();) {
newSearcher.doc(iter.nextDoc());
}
}
}
req.close();
}
}

  
  


  


  新的监听器的配置如下:
  

<listener event=&quot;newSearcher&quot; class=&quot;solr.MyQuerySenderListener&quot;>
<arr name=&quot;sortFields&quot;>
<str>title</str>
<str>id</str>
</arr>
<str name=&quot;queryKeyFile&quot;>/Users/yzygenuine/56workspace/solr_jetty/solr/extConf/query.txt</str>
<arr name=&quot;queries&quot;>
<lst><str name=&quot;q&quot;>solr</str><str name=&quot;qt&quot;>standard</str><str name=&quot;sort&quot;>price desc</str></lst>
</arr>
</listener>


  
  


  firstSearcher也可以同样配置
  


  


  


  转贴请声明:


solr newSearcher 跟 firstSearcher的监听器扩展



  





版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138025-1-1.html 上篇帖子: solr 基础知识 下篇帖子: solr4.9之配置中文分词smartcn
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表