solr ——搜索引擎实战

2019.11.22

solr ——搜索引擎实战

上一篇笔记讲述了solr的简单配置和分词设置以及导入数据库。在我的项目结合solr实现了站内搜索引擎后,写这篇笔记记录自己是怎么将solr整合到自己的项目当中的。

连接solr服务,java的服务封装solrj

先看对SolrJ的官方介绍:SolrJ是一个使Java应用程序可以轻松与Solr对话的API,SolrJ隐藏了许多连接到Solr的细节,并允许您的应用程序通过简单的高级方法与Solr进行交互.即可以将在solr本地端口网站上的操作封装在api中供程序调用(实际方式是通过http请求来获取一个返回类型为XML或者JSON的字符串)。

去Maven仓库中搜索solr即可找到很多版本,将其配置在maven依赖中即可。
先配置一个和solr源端口交互的客户端,通过以下方式配置即可

private  final  String solr_url = "http://127.0.0.1:8983/solr/questioncommunity";
private HttpSolrClient client = new HttpSolrClient.Builder(solr_url).build();

从solr端查询数据

先生成一条查询语句,是直接用的 solrQuery来先实例化一个query的对象。包含要查找的一个数据。

  SolrQuery query =new SolrQuery(keyWord);

然后给query配置以下参数:

  //返回的数据格式
   query.setRows(count);
  //偏移值,从第几个处开始返回
    query.setStart(offset);
  //设置返回高亮()
    query.setHighlight(true);
   //设置高亮的前缀值
    query.setHighlightSimplePre(hlpre);
   //设置高亮的后缀
    query.setHighlightSimplePost(hlpost);
   //在高亮的返回结果集中选择显示的的字段
    query.set("hl.fl", QUESTION_TITLE_FIELD + "," + QUESTION_CONTENT_FIELD);
    //设置默认的查询字段值,这个很重要(多值查找就用这个字段代替)
    query.set("df",QUERY_FIELD);

执行查询语句,并返回一个response的对象,后续找结果是从这个response对象中去查询

 QueryResponse response = client.query(query);

之后从response中读取经过高亮处理后的数据

response.getHighlighting()

这里的返回值是一个Map<String,Map<String,List<>>的对象,第一个String一般是ID,第二个map中的Key是查询的字段值,即之前设置的在高亮返回结果中显示的字段,而list即是返回的结果字符串,一般list.get(0)即得到查询后高亮的字段.
之后根据系统逻辑,将得到的字段插入到对象中,即可开始使用。

for(Map.Entry<String,Map<String,List<String>>> entry:response.getHighlighting().entrySet()){
    Question question =new Question();
    question.setId(Integer.parseInt(entry.getKey()));
    if(entry.getValue().containsKey(QUESTION_TITLE_FIELD)) {
        List<String> titleList = entry.getValue().get(QUESTION_TITLE_FIELD);
        if (titleList.size() > 0) {
            question.setTitle(titleList.get(0));
        }
    }
    if(entry.getValue().containsKey(QUESTION_CONTENT_FIELD)) {
        List<String> contentList = entry.getValue().get(QUESTION_CONTENT_FIELD);
        if (contentList.size() > 0) {
            question.setContent(contentList.get(0));
        }
    }
    reslist.add(question);
}

然后即可完成服务层,可向上提供接口调用。

向Solr更新索引

在实际的项目中,数据库中的数据是时刻变化的,需要solr中的索引字段也要跟着变化,因此需要在服务端添加和删除的时候对solr的索引也进行实时操作。
向solr更新索引的时候,在solrj中进行如下方法:

	//	构建一个新文档,用来向solr端插入
    SolrInputDocument doc =new SolrInputDocument();
    //设置字段值,需要和在solr配置文件中定义的字段保持一致
    doc.setField("id",id);
    doc.setField("question_content",content);
    doc.setField("question_title",title);
    //添加进索引,执行add方法
    UpdateResponse response = client.add(doc,1000);

向Solr删除索引

可直接删除一个列表或一个单独的ID,或者更具一个query去删除,更具方法参数不同。

client.deleteById()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值