Solr搜索技术
Solr搜索技术
今日大纲
回顾上一天的内容:
倒排索引
lucene和solr的关系
lucene api的使用 CRUD
文档、字段、目录对象(类)、索引写入器类、索引写入器配置类、IK分词器
查询解析器、查询对象(用户要查询的内容)、索引搜索器(索引库的物理位置)、排名文档集合(包含得分文档数组)
六种高级查询(相似度查询)
分词器(扩展词典、停用词典)
分页
得分(激励因子(作弊))
高亮
排序
● Solr简介、运行
● Solr基本使用
● Solr Core 配置
● Solr高级功能
● Solr与数据库交互
*****************************************************************************************************
1. Solr 4.x简介
1.1 什么是Solr
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的文件,生成索引;也可以通过提出查找请求,并得到返回结果。
Solr实际上就是封装了lucene,提供更加强大的功能,更加方便的使用。(集群分布式)
1.2 下载solr
官网:http://lucene.apache.org/solr/
下载网址:http://www.apache.org/dyn/closer.cgi/lucene/solr/
下载solr
1.3 Solr包结构
打开 solr-4.10.2.zip,包含文件如下:
- contrib:使用solr功能,依赖相关jar包
- dist :存放solr自己的jar包和solr.war
- docs :文档目录
- example:存放solr案例
Solr案例主要由两部分组成:
、Web应用程序部分。
主要负责对索引库中的数据进行各种操作,并提供Web形式的管理界面。它可以通过Solr内嵌的jetty服务器运行,也可以部署在其它的Web服务器(如:Tomcat)中运行。对应位置在:solr-4.10.2\example\webapps\solr.war
、索引库部分。
主要负责用来存放索引数据,好比Lucene中的索引库文件。Solr可以同时拥有多个索引库。对应位置在:solr-4.10.2\example\solr\collection1
*****************************************************************************************************
2. Solr安装运行
2.1 运行Solr服务器
2.1.1 内嵌jetty服务器方式
1、进入solr-4.10.2\example
2、通过 java -jar 运行 start.jar
3、通过jetty服务器默认访问端口 8983 访问服务
浏览器中输入:http://localhost:8983/solr 进入管理页面
2.1.2 部署Tomcat服务器方式
1、部署Web应用程序:将solr-4.10.2/example/webapps/solr.war解压后,复制到tomcat/webapps下
2、在Tomcat中加入相关jar包:将"相关资料\jar包\solr在tomcat运行需要导入的jar包\lib"下的jar包复制tomcat/webapps/solr/WEB-INF/lib下
Jar包名:
slf4j-log4j12-1.7.2.jar
slf4j-api-1.7.6.jar
IKAnalyzer2012FF_u1.jar
commons-logging-1.1.1.jar
log4j-1.2.16.jar
3、创建索引库:将 solr-4.10.2/example/solr复制到 d:/mysolr/solr (目录随意)
4、在Tomcat中指定索引库目录:
(1)在tomcat/bin/catalina.bat 配置set "JAVA_OPTS=-Dsolr.solr.home=d:/mysolr/solr" ,但这种配置需要手动通过tomcat/bin/startup.bat运行
(2)在myeclipse配置tomcat启动参数选择菜单:window->preferences->Tomcat7.x->JDK,配置 -Dsolr.solr.home=d:/mysolr/solr,这样就可以通过myeclipse运行tomcat
5、启动Tomcat后,浏览器中输入:http://localhost:8080/solr 进入管理页面,注意端口与Tomcat的端口一致
*****************************************************************************************************
2.2 Solr管理界面简介
2.2.1 Dashboard
控制面板:显示solr运行硬软件环境
2.2.2 logging
日志信息:显示相关日志信息
Logging 下的 Level 中查看临时改变日志设置
2.2.3 Core Admin
Core管理中心:所有索引库的管理界面,一个solr的core就好比是以前lucene的一个索引库
2.2.5 Core Selector
Core选择器:用于选择指定的Core,进行更详细的操作和管理
2.2.4 Theard Dump
线程堆栈:查看 JVM 中的所有活动线程
*****************************************************************************************************
3. Solr基本使用
3.1 配置IK分词器
1、将IKAnalyzer-2012-4x.jar拷贝到WEB-INF\lib下
2、在D:\mysolr\solr\collection1\conf\schema.xml文件中添加fieldType:
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
3、将指定名称的查询模式(比如:title)中的type="text_ik"
记得重启tomcat
4、通过Core Selector选择指定的core并选择Analysis进行分词器测试
*****************************************************************************************************
3.2 使用管理界面手动添加Documents
通过Core Selector选择指定的core并选择Documents
*****************************************************************************************************
3.3 使用管理界面的Query功能
通过Core Selector选择指定的core并选择Query
高亮显示(hl.fl:高亮显示的字段,hl.simple.pre:高亮标签,可自定义)
*****************************************************************************************************
4. Solr Core配置详解
4.1 solr core的概念
一个core 就是一个索引的服务,里面包含大量功能(通过handler实现),核心配置文件 schema.xml 和 solrconfig.xml
solrconfig.xml 是 core的搜索服务整体配置(索引库的位置等等)
schema.xml 是索引的配置(field等等)
4.2 solr.home标准目录结构
一个solr.home 可以有多个core
主要包含三个配置文件 solr.xml 、solrconfig.xml 、schema.xml
solr.xml:整个solr索引服务器下的整体配置,主要用来配置当前solr服务器下拥有多少core。
solrconfig.xml:每个core下的配置,例如配置索引库的位置
schema.xml:每个core下具体索引的配置,例如配置field
4.3 solr.xml 配置multicore
如果solr_home下没有solr.xml ,那么solr服务器默认回去寻找名称为collection1的core
如果solr.xml 没有任何配置,那么solr_home下每个文件夹就是一个core,在文件夹里面需要提供core.properties
配置 name=core的名称
可以在solr.xml 配置多个core,这样就不在需要core.properties
<solr>
<cores adminPath="/admin/cores">
<core name="core1" instanceDir = "core1" />
<core name="core2" instanceDir = "core2" />
</cores>
</solr>
adminPath 这是一个访问SolrCore 管理界面的相对URL路径
如果出错,要查看到solr启动的错误信息,需要载入log4j配置文件
4.4 core.properties
4.5 schema.xml
1、通过<field>节点定义建立索引查询数据的字段
name代表数据字段名称
type代表数据类型
indexed代表是否被索引
stored代表是否被存储
multiValued是否有多个值,如果字段可能有多个值,尽可能设为true
_version节点和_root节点建议保留,不要删除
2、通过<fieldType>节点定义数据类型
name指定的是节点定义的名称
class指向org.apache.solr.analysis中定义的类型名称
solr.TextField 允许用户通过分析器来定制索引和查询,分析器包括一个分词器(tokenizer)和多个过滤器(filter)
<analyzer>指定分词器
<!-- 自定义新的字段 -->
<field name="mao" type="text_ik" indexed="true" stored="true" multiValued="true"/>
<!-- 动态字段的定义,只要以yun开头,都可以使用这个字段 -->
<dynamicField name="yun*" type="text_ik" indexed="true" stored="true"/>
4.6 solrconfig.xml
1、lib 引入外部jar包
可以将 solr解压目录/contrib和dist 复制 solr.home 下
修改 lib的路径,引用到jar包
2、索引相关配置
<luceneMatchVersion> solr低层使用lucene版本
<dataDir> 配置索引文件位置,默认./data
<directoryFactory>配置索引的路径工厂
<indexConfig> 进行索引相关配置
3、Request Dispatcher请求转发器的配置
<requestHandler name="/select" class="solr.SearchHandler">
<requestHandler name="/query" class="solr.SearchHandler">
<requestHandler name="/get" class="solr.RealTimeGetHandler">
<requestHandler name="/update" class="solr.UpdateRequestHandler">
wt是通讯数据格式,indent是否缩进,df是默认搜索的字段,q是查询条件
一般不会去改它,具体的设置还是通过外部的参数传入
*****************************************************************************************************
5. SolrJ基本功能
5.1 SolrJ的概念
solr的客户端代码和solr服务器之间的增删改查索引操作是通过类似WebService接口API,所以在操作时,只要遵循一定的接口规范即可。
5.2 添加、修改索引
添加、修改索引使用相同的API
准备环境(注意)
第一步:导入solrj jar包到项目
第二步:运行solr服务器
5.2.1 传统方式
/**
* 创建索引(传统方式)
*
* @throws IOException
* @throws SolrServerException
*/
@Test
public void createIndex1() throws SolrServerException, IOException {
// 使用HttpSolr服务端(HttpSolrServer)创建solr服务器端对象
HttpSolrServer solrServer = new HttpSolrServer(
"http://localhost:8080/solr/core1");
// 使用solr输入文档(SolrInputDocument)创建文档对象
SolrInputDocument document = new SolrInputDocument();
// 添加字段到文档对象
document.addField("id", "3");
document.addField("title", "这是来自solrj客户端的第一个title");
document.addField("content", "这是来自solrj客户端的第一个content");
//添加文档到solr服务器对象
solrServer.add(document);
// 提交
solrServer.commit();
}
5.2.2 Bean注解方式
1、创建实体bean类,对实体数据Bean 添加 @Field注解,直接传递Bean
import org.apache.solr.client.solrj.beans.Field;
/**
* @author Administrator 文章实体Bean
*/
public class Article {
@Field
private String id;
@Field
private String title;
@Field
private String content;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
、通过bean创建索引
/**
* 创建索引(Bean注解方式)
* @throws SolrServerException
* @throws IOException
*/
@Test
public void createIndex2() throws IOException, SolrServerException {
// 使用HttpSolr服务端(HttpSolrServer)创建solr服务器端对象
HttpSolrServer solrServer = new HttpSolrServer(
"http://localhost:8080/solr/core1");
for (int i = 0; i < 30; i++) {
//创建bean
Article article = new Article();
//添加值
article.setId(""+i);
article.setTitle("这是来自solrj客户端的第一个title"+i);
article.setContent("这是来自solrj客户端的第一个content"+i);
//添加实体对象到solr服务器对象中
solrServer.addBean(article);
//提交
}
solrServer.commit();
}
*****************************************************************************************************
5.3 删除索引
5.3.1 根据id方式
/**
* 删除索引(根据id)
* @throws IOException
* @throws SolrServerException
*/
@Test
public void deleteIndex1() throws SolrServerException, IOException {
// 使用HttpSolr服务端(HttpSolrServer)创建solr服务器端对象
HttpSolrServer solrServer = new HttpSolrServer(
"http://localhost:8080/solr/core1");
//删除
solrServer.deleteById("2");
//提交
solrServer.commit();
}
5.3.2 Query表达式方式
/**
* 删除索引(根据Query表达式删除)
* @throws IOException
* @throws SolrServerException
*/
@Test
public void deleteIndex2() throws SolrServerException, IOException {
// 使用HttpSolr服务端(HttpSolrServer)创建solr服务器端对象
HttpSolrServer solrServer = new HttpSolrServer(
"http://localhost:8080/solr/core1");
// 删除
solrServer.deleteByQuery("id:1*");
// 提交
solrServer.commit();
}
*****************************************************************************************************
5.4 查询索引
5.4.1 传统方式
/**
* 查询索引(传统方式)
* @throws SolrServerException
*/
@Test
public void queryIndex1() throws SolrServerException {
// 使用HttpSolr服务端(HttpSolrServer)创建solr服务器端对象
HttpSolrServer solrServer = new HttpSolrServer(
"http://localhost:8080/solr/core1");
// 创建solr查询对象(solrquery)并且载入要查询的内容
SolrQuery solrQuery = new SolrQuery("title:这是");
// 添加返回结果的列
solrQuery.addField("id");
solrQuery.addField("title");
// 设置查询结果返回的行数
solrQuery.setRows(20);
// 设置排序方式
solrQuery.setSort("id", ORDER.desc);
// 开始查询,返回查询响应对象(QueryResponse)
QueryResponse response = solrServer.query(solrQuery);
// 通过查询响应对象(QueryResponse)获得结果
SolrDocumentList results = response.getResults();
// 对结果进行遍历,获得solr文档对象,并打印出结果
for (SolrDocument solrDocument : results) {
System.out.println(solrDocument.getFieldValue("id"));
System.out.println(solrDocument.getFieldValue("title"));
//List titles = (List) solrDocument.getFieldValue("title");
//System.out.println(titles.get(0));
System.out.println(solrDocument.getFieldValue("content"));
}
}
5.4.2 Bean注解方式
/**
* 查询结果(返回bean形式)
* @throws SolrServerException
*/
@Test
public void queryIndex2() throws SolrServerException {
// 使用HttpSolr服务端(HttpSolrServer)创建solr服务器端对象
HttpSolrServer solrServer = new HttpSolrServer(
"http://localhost:8080/solr/core1");
// 创建solr查询对象(solrquery)并且载入要查询的内容
SolrQuery solrQuery = new SolrQuery("title:这是");
// 设置返回结果的列
solrQuery.addField("id");
solrQuery.addField("title");
// 设置查询结果返回的行数
solrQuery.setRows(20);
// 开始查询,返回查询响应对象(QueryResponse)
QueryResponse response = solrServer.query(solrQuery);
// 通过查询响应对象(QueryResponse)获得结果(Bean返回形式)
List<Article> beans = response.getBeans(Article.class);
// 对结果进行遍历,并打印出结果
for (Article article : beans) {
System.out.println(article.getId());
System.out.println(article.getTitle());
System.out.println(article.getContent());
}
}
注意:如果配置schema.xml中配置指定的field的multiValued为true,其对应的实体Bean属性应为List,不然会出错。或者将multiValued的值改为false
*****************************************************************************************************
6. SolrJ高级功能
6.1 多条件查询
//new SolrQuery("查询表达式")
SolrQuery solrQuery = new SolrQuery("title:3 or id:5");
6.1.1 常用查询语法(了解)
、匹配所有文档:*:* (通配符?和*:"*"表示匹配任意字符;"?"表示匹配出现的位置)
、布尔操作:AND、OR和NOT布尔操作
、子表达式查询(子查询):可以使用"()"构造子查询。 比如:(make AND up) OR (french AND Kiss)
、模糊查询、相似查询:
(1)一般模糊查询:title:titla~
(2)门槛模糊查询:对模糊查询可以设置查询门槛,门槛是0~1之间的数值,门槛越高表面相似度越高。title:titla~0.5
、范围查询(Range Query):Lucene支持对数字、日期甚至文本的范围查询。结束的范围可以使用"*"通配符。
(1)日期范围(ISO-8601 时间GMT):a_begin_date:[1990-01-01T00:00:00.000Z TO 1999-12-31T24:59:99.999Z]
(2)数字:salary:[2000 TO *]
)文本:entryNm:[a TO a]
、日期匹配:YEAR, MONTH, DAY, DATE (synonymous with DAY) HOUR, MINUTE, SECOND, MILLISECOND, and MILLI (synonymous with MILLISECOND)可以被标志成日期。
(1)r_event_date:[* TO NOW-2YEAR]:2年前的现在这个时间
(2)r_event_date:[* TO NOW/DAY-2YEAR]:2年前前一天的这个时间
6.2 查询结果高亮处理
/**
* 查询结果(高亮模式)
*
* @throws SolrServerException
*/
@Test
public
void queryIndex5() throws SolrServerException {
// 使用HttpSolr服务端(HttpSolrServer)创建solr服务器端对象
HttpSolrServer solrServer = new HttpSolrServer(
"http://localhost:8080/solr/core1");
// 创建solr查询对象(solrquery)并且载入要查询的内容
// new SolrQuery("查询表达式")
SolrQuery solrQuery = new SolrQuery("title:这是");
// 设置要查询的列
solrQuery.addField("id");
solrQuery.addField("title");
solrQuery.addField("content");
// 设置查询结果返回的行数
solrQuery.setRows(20);
/*************************高亮设置及查询********************************/
// 是否高亮
solrQuery.setHighlight(true);
// 摘要长度
solrQuery.setHighlightFragsize(50);
// 设置前后缀
solrQuery.setHighlightSimplePre("<font color='red'>");
solrQuery.setHighlightSimplePost("</font>");
// 添加高亮的field
solrQuery.addHighlightField("title");
// 开始查询,返回查询响应对象(QueryResponse)
QueryResponse response = solrServer.query(solrQuery);
System.out.println(response.getResponse());
// 处理结果集第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名
Map<String, Map<String, List<String>>> highlighting = response
.getHighlighting();
for (Map.Entry<String, Map<String, List<String>>> entry : highlighting.entrySet()) {
System.out.println("key:"+entry.getKey());
System.out.println("value:" + entry.getValue());
}
/***********************************************************/
}
*****************************************************************************************************
7. Solr数据导入并索引
7.1 Solr导入数据库中的数据
1、建立数据库,将 "solr搜索通过JDBC导入练习" 中article.sql 导入数据库
数据库 solr
用户名密码: root/123456
数据表 article
2、配置服务器core/conf/solrconfig.xml 添加导入handler
(1)将/dist目录复制到solr core 所在目录。
(2)在solrconfig.xml中添加
<lib dir="../dist/" regex="solr-dataimporthandler-\d.*\.jar" />
注意相对路径一定要正确
(3)在core/conf中新建配置文件 db-data-config.xml并写入内容:
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solr"
user="root"
password="123456"/>
<document>
<entity name="id" query="select id,title,content from article"></entity>
</document>
</dataConfig>
(4)在solrconfig.xml中继续添加
<requestHandler name="/import" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">db-data-config.xml</str>
</lst>
</requestHandler>
(5)将mysql驱动包复制 tomcat/webapps/solr/WEB-INF/lib下
(6)启动服务,并访问 http://localhost:8080/solr/#/core1/dataimport//import 点击Execute按钮
或者直接访问 http://localhost:8080/solr/core1/import?command=full-import
*****************************************************************************************************
8. 总结
1、solr的启动(jetty方式,tomcat方式)
2、solr的管理界面(添加数据,查询数据)
3、solr配置文件
(1) solr.xml --> 配置多个core(索引库)
(2) schema.xml --> 配置字段类型,特性
(3) solrconfig.xml --> 索引库的jar包,导入数据功能
4、solrj使用:使用java代码访问solr服务器 crud new HttpSolrServer("xxxx不要有#");
5、solr导入数据库数据步骤
*****************************************************************************************************
Solr搜索技术的更多相关文章
- 搜索技术---solr
solr 企业站内搜索技术选型 在一些大型门户网站.电子商务网站等都需要站内搜索功能,使用传统的数据库查询方式实现搜索无法满足一些高级的搜索需求,比如:搜索速度要快.搜索结果按相关度排序.搜索内容格式 ...
- 全文搜索技术—Solr
1. 学习计划 1. Solr的安装及配置 a) Solr整合tomcat b) Solr后台管理功能介绍 c) 配置中文分析器 2. 使用Solr的后台管理索引库 a) ...
- 1.搜索引擎的历史,搜索引擎起步,发展,繁荣,搜索引擎的原理,搜索技术用途,信息检索过程,倒排索引,什么是Lucene,Lucene快速入门
一: 1 搜索引擎的历史 萌芽:Archie.Gopher Archie:搜索FTP服务器上的文件 Gopher:索引网页 2 起步:Robot(网络机器人)的出现与spider(网络爬虫) ...
- 关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造)
关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造) 摘要:在中文搜索中的标点.符号往往也是有语义的,比如我们要搜索“C++”或是“C#”,我们不希望搜索出来的全是“C”吧?那样对程 ...
- 百度和 Google 的搜索技术是一个量级吗?
著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Kenny Chao 链接:http://www.zhihu.com/question/22447908/answer/2 ...
- 什么是Solr搜索
什么是Solr搜索 一.Solr综述 什么是Solr搜索 我们经常会用到搜索功能,所以也比较熟悉,这里就简单的介绍一下搜索的原理. 当然只是介绍solr的原理,并不是搜索引擎的原理,那会更复杂. ...
- 复杂的1秒--图解Google搜索技术
谷歌(Google),一个非常成功,但又十分神秘,而且带有几分理想化色彩的互联网搜索巨人,它还是一家相当了不起的广告公司,谷歌首页上的那个搜索按钮是其年赢利200亿美元的杀手级应用,也是Interne ...
- 渐进反馈式搜索技术助力运维工程师——Linux命令高效检索
日常生活工作中,我们通过搜索引擎查询相关资料时,经常遇到不知如何指定准确关键词的情况,仅仅根据指定大概范围的关键词时,搜索结果往往不能尽如人意. <信息导航>APP最新版本(Ver 1.1 ...
- Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)
一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...
随机推荐
- 强悍的 CSS 扩展语言 -- Sass
<div class = 'testBorder'> <p> <input/> </p> </div> 假设上面这 3 个 DOM 元素有这 ...
- 【CSS学习笔记】a标签的四种伪类
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- mongodb tip-1
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px "Helvetica Neue"; color: #454545 } p. ...
- configure HDFS(hadoop 分布式文件系统) high available
注:来自尚学堂小陈老师上课笔记 1.安装启动zookeeper a)上传解压zookeeper包 b)cp zoo_sample.cfg zoo.cfg修改zoo.cfg文件 c)dataDir=/o ...
- FZU 2086 餐厅点餐(模拟)
Problem 2086 餐厅点餐 Problem Description Jack最近喜欢到学校餐厅吃饭,好吃干净还便宜. 在学校餐厅,有a种汤,b种饭,c种面条,d种荤菜,e种素菜. 为了保证膳食 ...
- centos安装ganttproject
官网下载 http://www.ganttproject.biz/ 我的JAVA早已经安装了. 问题:root #ganttproject 提示org.bardsoftware.eclipsito.B ...
- hdu1116回溯N皇后问题
题目连接 经过思考,不难发现:恰好N个皇后放在不同行不同列,那么是不是可以转换成N个皇后所在行分别确定(一人一行)的情况下对她们的所在列的枚举. 也就是列的全排列生成问题,我们用c[x]表示x行皇后的 ...
- js两种生成对象模式(公有成员和成员私有)
假设有个需求,创建一个book类,有isbn码,书名,作者 :可以对isbn进行数据完整性校验:--js设计模式 <script type="text/javascript" ...
- Winform DataGridView直接导出Excel
/// <summary> /// 导出excel /// </summary> /// <param name="fileName">导出文件 ...
- android应用编译失败 ResXMLTree_node size 类错误,以及 android studio 项目内搜索
今天很郁闷,又遇到个很让人崩溃的问题: ResXMLTree_node size 0 is smaller than header size 0x45. 类似这样的错误,提示中看不出任何有用的内容,网 ...