热门标签 | 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'}


推荐阅读
  • 一:什么是solrSolr是apache下的一个开源项目,使用Java基于lucene开发的全文搜索服务器;Lucene是一个开放源代 ... [详细]
  • 部署solr建立nutch索引
    2019独角兽企业重金招聘Python工程师标准接着上篇nutch1.4的部署应用,我们来部署一下solr,solr是对lucene进行了封装的企 ... [详细]
  • camel_使用Camel在来自不同来源的Solr中索引数据
    camelApacheSolr是建立在Lucene之上的“流行的,快速的开源企业搜索平台”。为了进行搜索(并查找结果),通常需要从不同的源(例如内容管理 ... [详细]
  • java之学习记录 92lecene 全文检索
    搭建springBoot项目依赖:<?xmlversion=1.0 ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • Android ListView 自定义 CheckBox 实现列表项多选功能详解
    本文详细介绍了在Android开发中如何在ListView的每一行添加CheckBox,以实现列表项的多选功能。用户不仅可以通过点击复选框来选择项目,还可以通过点击列表的任意一行来完成选中操作,提升了用户体验和操作便捷性。同时,文章还探讨了相关的事件处理机制和布局优化技巧,帮助开发者更好地实现这一功能。 ... [详细]
  • 本文整理了Java中org.apache.hadoop.io.ByteWritable.<init>()方法的一些代码示例,展示了ByteWri ... [详细]
  • 继PHP、Ruby、Python和Perl以后,Elasticsearch近来宣布了Elasticsearch.js,Elasticsearch的JavaScript客户端库。能够 ... [详细]
  • 2018深入java目标计划及学习内容
    本文介绍了作者在2018年的深入java目标计划,包括学习计划和工作中要用到的内容。作者计划学习的内容包括kafka、zookeeper、hbase、hdoop、spark、elasticsearch、solr、spring cloud、mysql、mybatis等。其中,作者对jvm的学习有一定了解,并计划通读《jvm》一书。此外,作者还提到了《HotSpot实战》和《高性能MySQL》等书籍。 ... [详细]
  • Yii framwork 应用小窍门
    Yiiframework应用小窍门1.YiiFramework]如何获取当前controller的名称?下面语句就可以获取当前控制器的名称了!Php代码 ... [详细]
  • Lucene系列四:Lucene提供的分词器、IKAnalyze中文分词器集成、扩展 IKAnalyzer的停用词和新词
    一、Lucene提供的分词器StandardAnalyzer和SmartChineseAnalyzer1.新建一个测试Lucene提供的分词器的maven项目LuceneAnal ... [详细]
  • 用到lucene的爬虫的简单实现
    2019独角兽企业重金招聘Python工程师标准小菜鸟我最近研究了一下lucene,以及前面的爬虫的写法,我想到能否用lucene写一个站内搜索& ... [详细]
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社区 版权所有