热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

搜索学习Solr全文搜索服务器的基本使用(一)——SolrJ的使用

作为一般的Lucene使用者,我们直接用Lucene虽然可以实现很多自己想要的自定义功能,但是对于一般的项目,为了方便开发和维护ÿ

作为一般的Lucene使用者,我们直接用Lucene虽然可以实现很多自己想要的自定义功能,但是对于一般的项目,为了方便开发和维护,我们通常会使用现成的搜索服务器。现在常用的有SolrElasticSearch
对于Solr服务器如何搭建,Solr服务器的搭建,之前已经整理过,这次,我将使用SolrJ来调用Solr服务器。



在Solr中配置Core


在managed-schema中,主要的配置为:


blogId












依赖

org.apache.solrsolr-solrj6.5.1


SolrServer.Java

package top.yuyufeng.learn.lucene.solr;import org.apache.solr.client.solrj.impl.HttpSolrClient;/*** @author yuyufeng* @date 2017/12/6*/
public class SolrServer {private static HttpSolrClient server = null;private final static String solrServerUrl = "http://127.0.0.1:8983/solr/blog";public static HttpSolrClient getServer() {if (server == null) {server = new HttpSolrClient(solrServerUrl);server.setDefaultMaxConnectionsPerHost(1000);server.setMaxTotalConnections(10000);//最大连接数server.setConnectionTimeout(60000);//设置连接超时时间(单位毫秒) 1000server.setSoTimeout(60000); 设置读数据超时时间(单位毫秒) 1000server.setFollowRedirects(false);//遵循从定向server.setAllowCompression(true);//允许压缩}return server;}public static void main(String[] args) {HttpSolrClient client = getServer();System.out.println(client);}
}

BlogCore.java

package top.yuyufeng.learn.lucene.solr.core;import org.apache.solr.client.solrj.beans.Field;import java.util.Date;/*** @author yuyufeng* @date 2017/12/6*/
public class BlogCore {@Fieldprivate String blogId;@Fieldprivate String blogTitle;@Fieldprivate String blogContent;@Fieldprivate Date createTime;@Fieldprivate String keywords;public String getBlogId() {return blogId;}public void setBlogId(String blogId) {this.blogId = blogId;}public String getBlogTitle() {return blogTitle;}public void setBlogTitle(String blogTitle) {this.blogTitle = blogTitle;}public String getBlogContent() {return blogContent;}public void setBlogContent(String blogContent) {this.blogContent = blogContent;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public String getKeywords() {return keywords;}public void setKeywords(String keywords) {this.keywords = keywords;}@Overridepublic String toString() {return "BlogCore{" +"blogId='" + blogId + '\'' +", blogTitle='" + blogTitle + '\'' +", blogContent='" + blogContent + '\'' +", createTime=" + createTime +", keywords='" + keywords + '\'' +'}';}
}

BlogSolrDao.java

package top.yuyufeng.learn.lucene.solr.dao;import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import top.yuyufeng.learn.lucene.solr.SolrServer;
import top.yuyufeng.learn.lucene.solr.core.BlogCore;import java.awt.print.Pageable;
import java.util.List;
import java.util.Map;/*** @author yuyufeng* @date 2017/12/6*/
public class BlogSolrDao{HttpSolrClient server;public BlogSolrDao() {server = SolrServer.getServer();}/*** 按Bean 添加/修改 索引** @throws Exception*/public int addIndex(BlogCore entity) throws Exception {server.addBean(entity);UpdateResponse updateResponse = server.commit();return updateResponse.getStatus();}/*** 按Bean 添加/修改 索引** @throws Exception*/public int addIndexList(List entitys) throws Exception {server.addBeans(entitys);UpdateResponse updateResponse = server.commit();return updateResponse.getStatus();}/*** 删除索引 按查询** @throws Exception*/public int deleteAll() throws Exception {String query = "*:*";server.deleteByQuery(query);server.commit();UpdateResponse updateResponse = server.commit();return updateResponse.getStatus();}/*** 删除索引 按id** @throws Exception*/public int deleteByQuery(Long id) throws Exception {server.deleteById(id + "");server.commit();UpdateResponse updateResponse = server.commit();return updateResponse.getStatus();}//查询所有public List query() throws Exception {SolrQuery query = new SolrQuery();query.setQuery("*:*");query.setStart(0);//开始记录数query.setRows(10000);//总条数QueryResponse queryResponse = server.query(query);List results = queryResponse.getBeans(BlogCore.class);return results;}//搜索keywordspublic List queryByKeyWords(String keywords) throws Exception {SolrQuery query = new SolrQuery();query.set("q", "keywords:" + keywords);//*通配多个字符
// query.set("sort", "product_price desc");//======高亮设置===//开启高亮query.setHighlight(true);//高亮域query.addHighlightField("blogContent");query.addHighlightField("blogTitle");//前缀query.setHighlightSimplePre("");//后缀query.setHighlightSimplePost("");//query.setHighlightSnippets(1);//结果分片数,默认为1//query.setHighlightFragsize(1000);//每个分片的最大长度,默认为100query.setStart(0);//开始记录数query.setRows(100);//总条数QueryResponse queryResponse = server.query(query);long sum = queryResponse.getResults().getNumFound();List results = queryResponse.getBeans(BlogCore.class);//输出高亮Map>> highlighting = queryResponse.getHighlighting();for (BlogCore result : results) {Map> map = highlighting.get(result.getBlogId()+"");List list = map.get("blogTitle");if (list != null && list.size() > 0) {result.setBlogTitle(list.get(0));}list = map.get("blogContent");if (list != null && list.size() > 0) {result.setBlogContent(list.get(0));}}return results;}
}

SolrTest.java

package top.yuyufeng.learn.lucene.solr;import org.junit.Test;
import top.yuyufeng.learn.lucene.solr.core.BlogCore;
import top.yuyufeng.learn.lucene.solr.dao.BlogSolrDao;import java.util.Date;
import java.util.List;/*** @author yuyufeng* @date 2017/12/6*/
public class SolrTest {@Testpublic void testIndex() throws Exception {BlogSolrDao blogSolrDao = new BlogSolrDao();BlogCore blog = new BlogCore();blog.setBlogId("2");blog.setBlogTitle("达摩院超越业界龙头");blog.setBlogContent("达摩院一定也必须要超越英特尔,必须超越微软,必须超越IBM,因为我们生于二十一世纪,我们是有机会后发优势的。");blog.setCreateTime(new Date());blogSolrDao.addIndex(blog);}@Testpublic void testFindAll() throws Exception {BlogSolrDao blogSolrDao = new BlogSolrDao();List list = blogSolrDao.query();for (BlogCore blogCore : list) {System.out.println(blogCore);}}@Testpublic void testSearch() throws Exception {BlogSolrDao blogSolrDao = new BlogSolrDao();List list = blogSolrDao.queryByKeyWords("达摩院");for (BlogCore blogCore : list) {System.out.println(blogCore);}}
}

运行结果:


启动Solr服务器后,我建立了一些索引,然后我执行Search方法

BlogCore{blogId='2', blogTitle='达摩超越业界龙头', blogContent='达摩一定也必须要超越英特尔,必须超越微软,必须超越IBM,因为我们生于二十一世纪,我们是有机会后发优势的。', createTime=Wed Dec 06 13:38:12 CST 2017, keywords='null'}
BlogCore{blogId='1', blogTitle='马云表达愿景', blogContent='10月11日杭州云栖大会上,马云表达了对新建成的阿里巴巴全球研究—阿里巴巴达摩的愿景,希望达摩二十年内成为世界第一大经济体,服务世界二十亿人,创造一亿个工作岗位。', createTime=Wed Dec 06 12:03:56 CST 2017, keywords='null'}


推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • Python的参数解析argparse模块的学习
    本文介绍了Python中参数解析的重要模块argparse的学习内容。包括位置参数和可选参数的定义和使用方式,以及add_argument()函数的详细参数关键字解释。同时还介绍了命令行参数的操作和可接受数量的设置,其中包括整数类型的参数。通过学习本文内容,可以更好地理解和使用argparse模块进行参数解析。 ... [详细]
  • 本文介绍了解决mysql 5.1启动问题的方法,通过修改my.ini文件中的相关配置,包括innodb_data_home_dir和skip-innodb等,可以解决启动问题。同时还介绍了如何调整内存池来存储metadata信息。 ... [详细]
author-avatar
我是你的鹏鹏鹏爷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有