简介
介绍 :Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提 供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
使用目的:让你的系统查询更给力 更高效。
搭建环境:
1. JDK 1.6 ;
2. Tomcat 6;
3. Solr 3.6;
搭建步骤:
1.tomcat 和solr放到windows 下 D盘(随便放,我是放D盘了)先打开tomcat server.xml修改下请求配置
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"URIEncoding="UTF-8"/> 防止URL乱码 Solr请求是get方式。
2. 在apache-solr-3.6.0\dist目录下找到apache-solr-3.6.0.war把重命名为solr.war 并放到 tomcat/webapps下
3.在conf/Catalina/localhost文件夹下 创建solr.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="D:/apache-tomcat-6.0.35/webapps/solr" debug="0" crossContext="true" >
<Environment name="solr/home" type="java.lang.String" value="D:/solr" override="true" />
</Context>
4.把apache-solr-3.6.0\example目录下的solr文件夹上传到D:/solr目录下.索引文件会默认会放到 tomca\solr\data下.
这里打D:/solr/conf/sorlConfig.xml
找到-><dataDir>${solr.data.dir:D:/solr/data}</dataDir> 把solr.data.dir改成 D:/solr路径
5.重启tomcat 打开 http://localhost/solr/ 会看到Welcome to Solr ! 部署Solr服务器成功
solr 3.5与IKAnalyzer 3.2.8分词的整合
1.下载IKAnalyzer
http://ik-analyzer.googlecode.com/files/IKAnalyzer3.2.8%20bin.zip
2.添加IKAnalyzer3.2.8.jar
把IKAnalyzer3.2.8.jar放到 tomcat\webapps\solr\WEB-INF\lib下;
3.Schema.xml 增加信息
进入目录编辑schema.xml文件,在<Types>下添加以下内容: (在D:/solr/conf下) 配置分词fieldType类型
<!-- ik-->
<fieldType name="text" class="solr.TextField" >
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1"
generateNumberParts="1"
catenateWords="1"
catenateNumbers="1"
catenateAll="0"
splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory"
protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true" words="stopwords.txt"/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1"
generateNumberParts="1"
catenateWords="1"
catenateNumbers="1"
catenateAll="0"
splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory"
protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
4.然后在<fields>下添加
<field name="name1" type="text" indexed="true" stored="true" required="true"/>
5.重新tomcat 在浏览器中输入: http://localhost/solr/analysis.jsp ; 进去 solr admin 显示:
客户端开发 Solrj
Solr是搭建好的lucene服务器 当然不可能完全满足一般的业务需求 可能 要针对各种的架构和业务调整 这里就需要用到Solrj了
Solrj是Solr提供的api库 可以进行Solr 的二次开发。
主要实现原理 服务端利用httpClient发送Solr格式的HTTP请求 到Solr服务器 然后服务器根据请求去找索引( 当然你要先针对数据源创建索引)最后返回SolrDocument. 然后你再进一步处理 高亮 排序 等功能。
1. 创建连接
HttpSolrServer solrServer = SolrServiceConfiger.getInstance().getServer();
//这里创建的一个HTTP请求 用的4.1的JAR Solr3.6之前用的CommonHttpSolrServer.新版改成这个类了 创建一个单例服务。
2. 创建索引
/***
* 创建Solr索引 通过指定的实体
*/
public void create(T t) {
SolrEntityBinder binder = new SolrEntityBinder();//这里这个类是源码DocumentObjectBinder处理类 这里为了实体转换改写了里面一些判断后面会讲到 剩下没改过
SolrInputDocument doc = binder.toSolrInputDocument(t); //把你的实体对象转换成Solr输入文档对象
try {
solrServer.add(doc);//添加文档
solrServer.commit();//提交请求
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
3 .删除索引
/**
* 删除指定ID的索引
*/
public void delete(PK id) {
try {
solrServer.deleteById((String)id );//直接根据ID删除 solrServer.deleteByQuery("*:*");删除所有
solrServer.commit();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
4.修改索引
直接先删除后创建
5.查询索引
public Page<Demo> luceneSearch(String content,Page<Demo> page) {
String id = null;
try {
HttpSolrServer server = SolrServiceConfiger.getInstance().getServer();// 创建服务 */
SolrQuery sQuery = new SolrQuery(); // 创建solr查询对象
String para="";
if(StringUtils.isNotEmpty(content)){ // 拼接solr查询条件
para ="company:"+content;
}
if(!StringUtils.isNotEmpty(para)){
para="*:*";
}
sQuery.setQuery(para)
.setStart((page.getPageNo()-1)*page.getPageSize())
.setRows(page.getPageSize());
//设置高亮
sQuery.setHighlight(true); // 开启高亮组件
sQuery.addHighlightField("company");// 高亮字段
sQuery.setHighlightSimplePre("<font color='red'>");//标记,高亮关键字前缀
sQuery.setHighlightSimplePost("</font>");//后缀
sQuery.setHighlightSnippets(2);//结果分片数,默认为1
sQuery.setHighlightFragsize(1000);//每个分片的最大长度,默认为100
sQuery.setFacet(true).setFacetMinCount(1)
.setFacetLimit(5)//段
.addFacetField("company");//分片字段
//返回结果
QueryResponse response = server.query(sQuery);
//得到文档列表
SolrDocumentList list = response.getResults();
//得到总数 设置
Integer counts=(int) list.getNumFound();
page.setTotalCount(counts);
//得到高亮数据
Map<String,Map<String,List<String>>> highlightMap=response.getHighlighting(); //得到高亮集合
//创建对象转换对象
DocumentObjectBinder binder = new DocumentObjectBinder();
//转换对象
List<Demo> demoList= binder.getBeans(Demo.class, list);
//设置高亮结果
for(Demo d :demoList){
id = d.getId();
List<String> companyList = highlightMap.get(id).get("company");
if(companyList!=null&&companyList.size()>0){
d.setCompany(companyList.get(0));
}
}
//返回结果
page.setResult(demoList);
} catch (Exception e) {
e.printStackTrace();
}
return page;
}
常见问题
1. org.apache.solr.client.solrj.SolrServerException:
Timeout occured while waiting response from server at: http://localhost/solr请求超时
解决方法:设置setConnectionTimeout和setSoTimeout为1分钟
2. org.apache.solr.common.SolrException: undefined field text
解决方法: 设置solrConfig.xml <str name="df">id</str> 默认是text
3. org.apache.solr.common.SolrException: Invalid Date String时间格式化问题
主要是Solr使用的是标准的格林威治(GMT)时间 这种(yyyy-MM-dd'T'HH:mm:ss.SSS'Z')北京在东八区 默认时间会-8小时
所以为了满足他这个减8 我的做法是在创建索引格式化日期类型的时候 判断下 把它时间+8 。
所以重新创建一个SolrEntityBinder类 此类是完全copy的DocumentObjectBinder. 只修改了一处。
修改了类中toSolrInputDocument方法
//判断是否是日期-------------///
if(field.type==Date.class){
Date d = (Date)field.get(obj);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(d.getTime());
cal.add(Calendar.HOUR, 8);
d = cal.getTime();
doc.setField(field.name,d,1.0f);
}else{
doc.setField(field.name, field.get(obj), 1.0f);
}
相关推荐
### Solr基础使用知识点 #### 一、需求分析与实现方法 **1.1 需求** 在电商网站中,商品信息搜索是一项至关重要的功能。用户能够通过输入关键字、选择分类或设定价格范围来查找商品。此外,还支持按照价格进行排序...
Apache Lucene是一个基于Java的全文搜索引擎库,它提供了一个强大的工具集用于索引和搜索文本。Lucene的核心功能包括为文件中的每个单词建立...整体上,这篇文档为读者提供了对Solr的基础知识和高级功能的深入理解。
在本套课程中,我们将全面的讲解Solr,从Solr基础到Solr高级,再到项目实战,基本上涵盖了Solr中所有的知识点。 主讲内容 章节一:Solr基础(上) 1. 环境搭建 2. 核心讲解 3. 数据导入 4. 各种中文分析器 章节二:...
当我们初学tomcat的时候, 肯定先要学习怎样启动tomcat. 在tomcat的bin目录下有两个启动tomcat的文件, 一个是startup.bat, 它用于windows环境下启动tomcat; 另一个是startup.sh, 它用于linux环境下tomcat的启动....
这可能是一个包含Solr基础教程的文档,涵盖了Solr的基本概念,如索引、查询、优化和集群配置。Solr的索引是其高效搜索的关键,它允许快速查找大量数据。索引构建过程中,Solr会将文本数据转换为倒排索引,便于快速...
### Solr基础知识与实践操作详解 #### 一、Solr简介及安装配置 **Solr** 是一个基于 **Lucene** 的开源全文检索服务器。它提供了高性能、全功能的文本搜索服务,支持复杂的搜索语法,并且能够通过插件扩展功能。 ...
### Solr基础知识与单机配置详解 #### 一、Solr概述 - **定义**: Solr是Apache基金会下的一个顶级开源项目,它基于Lucene,提供了高性能的全文检索功能。Solr不仅支持复杂的查询语法,还具备高度的可配置性和扩展...
1. **Solr基础**:涵盖Solr的安装、配置,以及基本的索引和查询操作。 2. **Schema设计**:解释如何创建适合业务需求的Schema,平衡灵活性和性能。 3. **处理多种数据类型**:介绍如何索引和搜索文本、数字、日期、...
1. Solr基础 Solr是一款由Java编写的搜索引擎,其核心功能包括层面搜索、高亮显示、拼写检查、搜索建议、分组统计、自动聚类和相似匹配等。Solr的优势在于其易用性,提供了基于HTTP的管理界面,支持多种输出格式,...
Solr基础知识 - **文档和字段**: - **文档(Document)**:索引的基本单元,包含一组相关的字段。 - **字段(Field)**:文档中的一项具体信息,包含名称、内容及处理方式的元数据。 - **字段类型**:字段可以...
1. Solr基础知识 - 企业搜索引擎方案选型:主要比较了基于Lucene封装、调用第三方搜索引擎API和基于Compass+Lucene三种方案的优劣。 - Solr的特性:描述了Solr是基于Lucene的搜索引擎,并对其扩展性进行了说明;包括...
Solr 构建在 Lucene 的基础上,但增加了许多管理和性能优化的功能,使得其更适合大规模的生产环境。 1. Solr 基础概念 - **Document**:Solr 的核心单元,类似数据库中的记录,由一个或多个 Field 组成。 - **...
1. **Solr基础**: - **索引**:Solr的核心是构建索引,它将原始数据转换成便于搜索的结构。索引过程包括分析、分割和存储文本,以便快速查询。 - **文档与字段**:在Solr中,数据被组织成文档,每个文档包含多个...
不同于Lucene仅提供基础搜索功能,Solr集成了分布式搜索、缓存、负载均衡和多语言支持等功能,使其更适合于企业级应用。搜索服务器指的是可以在服务器容器(如Tomcat或Jetty)中部署并运行的搜索应用程序。 Solr的...
2. **Solr基础知识**:Solr的工作原理、索引构建、查询优化、分布式搜索能力以及SolrCloud的集群管理。 3. **HBase与Solr集成**:介绍如何配置和使用HBase作为Solr的数据源,实现数据的实时索引和检索,包括HBase的...
而Solr则在其基础上增加了分布式搜索、集群管理、结果高亮、 faceting(分类浏览)、近实时搜索(NRT)等高级特性,使得Solr更适合企业级的搜索应用。 总的来说,Solr-9.0.0是一个强大且灵活的搜索平台,适用于需要...
本文来自于简书,本文是一篇基础文章,详细介绍了Solr是什么,及涉及到的层面。 简单来说Solr是基于Lucene的高性能的,开源的Java企业搜索服务器。Solr可以看作一个Web app,运行在tomcat或Jetty这类HTTP服务器上, ...