搜索引擎

Elasticsearch:
Solr(2004年)在搜索领域占据了多年的主导地位。在2010年后,Elasticsearch成为市场上的另一种选择(Shay Banon在2010年2月发布了Elasticsearch的第一个版本,公司于2018年10月5日在纽约证券交易所挂牌上市)

Solr:
https://lucene.apache.org/solr/
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。

Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。

Elasticsearch 与 Solr 的比较总结:

二者安装都很简单
Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
Solr 支持更多格式的数据(xml,json,pdf,txt,doc),而 Elasticsearch 仅支持json文件格式;
Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。
Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。

Windows版本:
一、启动:
1.进入bin目录按住键盘的shift键不松,然后鼠标右键,在右击菜单中选择在此处打开命令窗口
2.在命令行中输入命令 ‘.\solr.cmd start’,不要关闭窗口(也可以直接在cmd输入solr.cmd start)
3.用浏览器访问对应的8983端口即可访问solr,指定端口用solr.cmd start -p 8888
4.重启停止服务’./solr.cmd restart -p 8983’,’./solr.cmd stop -p 8983 | -all’
5.也可以手动部署到tomcat:https://blog.csdn.net/jaffreyen/article/details/78966429
6.linux在bin目录下: ./solr start -force[不能启动加该参数]

二、solr常用命令:
./solr.cmd start –p 端口号 单机版启动solr服务
./solr.cmd restart –p 端口号 重启solr服务
./solr.cmd stop –p 端口号关闭solr服务
./solr.cmd create –c name 创建一个core实例
./solr.cmd status 查看状态

三、创建core实例:
1.core简介:简单说core就是solr的一个实例,一个solr服务下可以有多个core,每个core下都有自己的索引库和相应的配置文件,所以在操作solr创建索引之前要创建一个core,因为索引都存在core下面。

2.core创建:core的创建方式有很多种,列出常用两种
a、在bin目录下执行./solr.cmd create -c name,创建一个core(全自动创建目录和配置文件)
b、第二种方式是直接使用AdminUI页面Core Admin创建一个core:
先在server/solr下新建一个目录(test),将server/solr/configsets/_default/下conf目录复制到新建目录下server\solr\目录(test)(即test\conf),然后在页面创建core(instanceDir:test)

四、配置Schema
schema.xml|managed-schema配置映射了各种数据类型的索引方案。分词器的配置、索引文档中包含的字段也在此配置。

solrconfig.xml是solr的基础文件,里面配置了各种web请求处理器、请求响应处理器、日志、缓存等。

1.Schema简介:
schema是用来告诉solr如何建立索引的,他的配置围绕着一个schema配置文件,这个配置文件决定着solr如何建立索引,每个字段的数据类型,分词方式等,老版本的schema配置文件的名字叫做schema.xml他的配置方式就是手工编辑,现在新版本的schema配置文件的名字叫做managed-schema,他的配置方式不再是用手工编辑而是使用schemaAPI来配置,官方给出的解释是使用schemaAPI修改managed-schema内容后不需要重新加载core或者重启solr更适合在生产环境下维护,配置文件所在的路径:…\solr-7.x.x\server\solr\core实例\conf\

两种方式可以添加字段。1.在浏览器添加  2.修改配置文件添加

1.在浏览器添加:在Core Selector选择core实例->Schema->Add Field

2.Schema主要成员:
a、fieldType:为field定义类型,最主要作用是定义分词器,分词器决定着如何从文档中检索关键字
b、analyzer:他是fieldType下的子元素,这就是传说中的分词器,他由一组tokenizer和filter组成
c、field:他是创建索引用的字段,如果想要这个字段生成索引需要配置他的indexed属性为true,stored属性为true表示存储该索引

3.Field常用属性:

FieldType:
	实例:`<fieldType name="text_ik" class="org.apache.slor.analysis"></fieldType>`
	name:就是FieldType的名称
	class:指向了org.apache.slor.analysis对应的class名称,用这个来定义类型的行为

Field:
实例:<field name="content_ik" type="text_ik" indexed="true" stored="true"  multiValued="false"/>
name:是查询时的名称
type:这个是之前定义的FieldType的名称
	indexed:是否索引,只要显示而不需要根据其查询可以设置false,如:商品图片路径
stored:是否存储(是否将索引结果存储到索引库)(copyField不需要stored)
multiValued:是否多值(一般配合copyField使用)

CopyField:
实例:
<copyField source="name"   dest="keywords"/>
<copyField source="content" dest="keywords"/>
<field name="keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<field name="name"   type="string"  indexed="true" stored="true"/>
<field name="content" type="string"  indexed="true" stored="true"/>
source:是Field域的名称
dest:是destination的缩写 目标域
 	应用场景:我们在搜索时比如输入java,一篇文章分为标题、简介、内容等很多字段,输入的关键字需要指定solr中的域进行检索,不可能从一个表中将所有字段进行索引,因为有些字段不需要索引,所以出现copyField域,把多个域的关键词复制到同一个域,多个域时,可以放到一个域中。就不用定义那么多域了。搜索比较方便
 
DynamicField:
实例:<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
name为*_i,定义它的type为int,那么在使用这个字段的时候,任何以_i结果的字段都被认为符合这个定义

4.中文分词器:
solr自带了一些中文分词器,比较好用的是SmartChineseAnalyzer,但是扩展性比较差不能自定义扩展中文词库,所以这里选择使用IKAnalyzer,这是第三方的一个分词器可以很好的扩展中文词库
a、解压后把核心jar(.jar)文件复制到solr WEB应用的lib文件夹下:solr-7.x.x/server/solr-webapp/webapp/WEB-INF/lib
b、把配置文件(.xml)和词库(.dic)文件复制到WEB应用的classes文件夹下,如果子WEB-INF下没有这个文件夹自己创建即可,如果想要扩展词库可以在ext.dic文件中配置自定义的中文词组,例如:青鸟这个词组,这个分词器的算法是算不出来的但是通过我们自定义词库,分词器也可以把青鸟列出关键词
c、配置core实例下./conf/managed-schema

 <fieldType name="text_ik" class="solr.TextField">
    
	 <analyzer type="index" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
    	   	 <analyzer type="query" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
                </fieldType>

五、DIH导入索引数据(Documents也可以手动添加json数据,Query可以查询)
1.DIH简介:
DIH全称是Data Import Handler 数据导入处理器,顾名思义这是向solr中导入数据的,我们的solr目的就是为了能让我们的应用程序更快的查询出用户想要的数据,而数据存储在应用中的各种地方,如xml、pdf、doc、txt、关系数据库中,那么solr首先就要能够获取这些数据并在这些数据中建立索引来达成快速搜索的目的,这里就列举最常用的从关系型数据库中向solr导入索引数据。

2.找到core实例目录配置环境:

第一步:配置数据导入文件
这个文件可以在solr根目录下的示例文件中(solr-7.x.x\example\example-DIH\solr\db\conf\db-data-config.xml)copy一份到core实例/conf目录下,也就是跟solrconfig.xml在一个目录

Copy过去之后这个文件名可以自定义,如mydata-config.xml
1)首先配置数据源关系型数据库基本四项,驱动类,url,用户名,密码
2)配置document,可以把它当作与mysql中数据库一个层级的对象
3)配置entity,可以把它当作与数据库中一个表对应,在query中书写查询sql
4)配置field与表中的字段与之对应。

<dataConfig>
    <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql:///test" user="root" password="root" />
    <document>
        <entity name="item" query="select * from emp" pk="empno">
            <field column="empno" name="empno" />
	    <field column="ename" name="ename" />         
        </entity>
    </document>
</dataConfig>

带参增量查询添加:

deltaQuery="select * from emp limit 
${dataimporter.request.offset},${dataimporter.request.size}"

配置导入参数:
offset=3&size=2

第二步:需要在solrconfig.xml文件中配置数据导入文件的映射位置:

 <!-- DIH -->
  <requestHandler name="/dataimport"         class="org.apache.solr.handler.dataimport.DataImportHandler">
	<lst name="defaults">
		<str name="config">mydata-config.xml</str>
	</lst>
  </requestHandler>
原690行:<requestHandler name="/select" class="solr.SearchHandler">

第三步:
a、将数据库驱动放在solr-7.x.x/server/solr-webapp/webapp/WEB-INF/lib目录下;
b、将solr-7.x.x/dist/solr-dataimporthandler-7.x.x.jar复制到solr-7.x.x/server/solr-webapp/webapp/WEB-INF/lib目录下;

3.DIH 命令
DIH命令采用的方式是URL的方式
全导入:
http://localhost:8983/solr/test/dataimport?command=full-import&commit=ture
增量导入:
http://localhost:8983/solr/test/dataimport?command=delta-import&clean=false&commit=ture

或者:
core(test)下的Dataimport菜单,点击Execute按钮也可以执行全导入或增量导入

带参:
在Custom Parameters输入参数offset=2&size=5
http://localhost:8983/solr/test/dataimport?command=full-import&commit=ture&offset=2

接下来在Query验证下数据是否真的导入成功了
fq:过滤的字段,df:默认查询字段,start,rows:分页配置,sort:排序
更多关于查询语句的介绍请参考http://lucene.apache.org/solr/guide/7_6/searching.html

删除:
1、在solr客户端,访问你的索引库Document

1)documents type 选择 XML
2)documents 输入下面语句

<delete><query>*:*</query></delete><commit/>

点击Submit Document 即可

六、solrJ(java客户端)
简介:solrJ是java访问solr的客户端工具包,solr也提供了其他语言访问的客户端

1.导入solrJ依赖(SolrClient)

<dependency>
 <groupId>org.apache.solr</groupId>
 <artifactId>solr-solrj</artifactId>
 <version>7.6.0</version>
</dependency>
  1. 向solr查询添加更改索引
    a、java实体对象与solr索引映射(@Field)
    b、向solr添加或更新索引,如果此实体在solr索引库中已有则作为更新操作

七、Spring+Solr:(SoleTemplate)

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-solr</artifactId>
    <version>4.0.3.RELEASE</version>
</dependency>

八、SpringBoot+Solr:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>

spring:
  data:
    solr:
      host: http://127.0.0.1:8983/solr

面试题:
为什么使用solr不直接使用mysql内存数据库:
严格来说,lucene负责数据存储,而solr只是一个引擎提供搜索和插入而已,跟数据库的解释器一样,有什么好处呢,比如一个数据库有一个字段存了1000个字,你想从这些字里面搜一个词的时候,普通的数据库只会让你使用like去查询,他会遍历每个字去模糊匹配,效率很低,而且有些是无法查询的,当然除了像一些特殊的数据库带有分词,比如postgresql,那lucene做的事情就是分词,然后去匹配分词的词中是否有你想搜的词就好了,当然了,为了提高这种检索效率和内存节省底层做了很复杂的事情,可以这么简单的认为,全文搜索这件事情上数据库是无法满足的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值