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搜索技术的更多相关文章

  1. 搜索技术---solr

    solr 企业站内搜索技术选型 在一些大型门户网站.电子商务网站等都需要站内搜索功能,使用传统的数据库查询方式实现搜索无法满足一些高级的搜索需求,比如:搜索速度要快.搜索结果按相关度排序.搜索内容格式 ...

  2. 全文搜索技术—Solr

    1.   学习计划 1. Solr的安装及配置 a)    Solr整合tomcat b)    Solr后台管理功能介绍 c)    配置中文分析器 2. 使用Solr的后台管理索引库 a)     ...

  3. 1.搜索引擎的历史,搜索引擎起步,发展,繁荣,搜索引擎的原理,搜索技术用途,信息检索过程,倒排索引,什么是Lucene,Lucene快速入门

     一: 1  搜索引擎的历史 萌芽:Archie.Gopher Archie:搜索FTP服务器上的文件 Gopher:索引网页 2  起步:Robot(网络机器人)的出现与spider(网络爬虫) ...

  4. 关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造)

    关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造) 摘要:在中文搜索中的标点.符号往往也是有语义的,比如我们要搜索“C++”或是“C#”,我们不希望搜索出来的全是“C”吧?那样对程 ...

  5. 百度和 Google 的搜索技术是一个量级吗?

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Kenny Chao 链接:http://www.zhihu.com/question/22447908/answer/2 ...

  6. 什么是Solr搜索

    什么是Solr搜索 一.Solr综述   什么是Solr搜索 我们经常会用到搜索功能,所以也比较熟悉,这里就简单的介绍一下搜索的原理. 当然只是介绍solr的原理,并不是搜索引擎的原理,那会更复杂. ...

  7. 复杂的1秒--图解Google搜索技术

    谷歌(Google),一个非常成功,但又十分神秘,而且带有几分理想化色彩的互联网搜索巨人,它还是一家相当了不起的广告公司,谷歌首页上的那个搜索按钮是其年赢利200亿美元的杀手级应用,也是Interne ...

  8. 渐进反馈式搜索技术助力运维工程师——Linux命令高效检索

    日常生活工作中,我们通过搜索引擎查询相关资料时,经常遇到不知如何指定准确关键词的情况,仅仅根据指定大概范围的关键词时,搜索结果往往不能尽如人意. <信息导航>APP最新版本(Ver 1.1 ...

  9. Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)

    一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...

随机推荐

  1. 强悍的 CSS 扩展语言 -- Sass

    <div class = 'testBorder'> <p> <input/> </p> </div> 假设上面这 3 个 DOM 元素有这 ...

  2. 【CSS学习笔记】a标签的四种伪类

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  3. mongodb tip-1

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px "Helvetica Neue"; color: #454545 } p. ...

  4. configure HDFS(hadoop 分布式文件系统) high available

    注:来自尚学堂小陈老师上课笔记 1.安装启动zookeeper a)上传解压zookeeper包 b)cp zoo_sample.cfg zoo.cfg修改zoo.cfg文件 c)dataDir=/o ...

  5. FZU 2086 餐厅点餐(模拟)

    Problem 2086 餐厅点餐 Problem Description Jack最近喜欢到学校餐厅吃饭,好吃干净还便宜. 在学校餐厅,有a种汤,b种饭,c种面条,d种荤菜,e种素菜. 为了保证膳食 ...

  6. centos安装ganttproject

    官网下载 http://www.ganttproject.biz/ 我的JAVA早已经安装了. 问题:root #ganttproject 提示org.bardsoftware.eclipsito.B ...

  7. hdu1116回溯N皇后问题

    题目连接 经过思考,不难发现:恰好N个皇后放在不同行不同列,那么是不是可以转换成N个皇后所在行分别确定(一人一行)的情况下对她们的所在列的枚举. 也就是列的全排列生成问题,我们用c[x]表示x行皇后的 ...

  8. js两种生成对象模式(公有成员和成员私有)

    假设有个需求,创建一个book类,有isbn码,书名,作者 :可以对isbn进行数据完整性校验:--js设计模式 <script type="text/javascript" ...

  9. Winform DataGridView直接导出Excel

    /// <summary> /// 导出excel /// </summary> /// <param name="fileName">导出文件 ...

  10. android应用编译失败 ResXMLTree_node size 类错误,以及 android studio 项目内搜索

    今天很郁闷,又遇到个很让人崩溃的问题: ResXMLTree_node size 0 is smaller than header size 0x45. 类似这样的错误,提示中看不出任何有用的内容,网 ...