顶级架构师学习——第二十五阶段:最新版Solr使用

25 篇文章 2 订阅
8 篇文章 0 订阅

因为看的视频是几年前的qwq,所以视频的教程用不上了,自己慢慢撸~这里使用的是目前最新的版本Solr7.7.1

目录

一、简介

二、部署

三、schema.xml详解

四、中文分词

五、导入数据


一、简介

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到包括XML格式在内的多种形式在内的返回结果。

Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎

文档通过Http利用XML 加到一个搜索集合中。查询该集合也是通过http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。

二、部署

我们使用的是当前的最新版本Solr7.7.1~~~这里是需要相应的JDK环境(8以上)和Tomcat(8以上,我使用的是9)支持的!!!

1、从官网上下载下来Solr并解压:http://www.apache.org/dyn/closer.lua/lucene/solr/7.7.1

2、拷贝项目:将解压目录下solr-7.1.1/server/solr-webapp/webapp目录移到tomcat的webapp目录下面,修改名字为solr(当然不改也没关系)

3、导包:solr-7.1.1/server/lib/ext目录下所有、solr-7.1.1/server目录下以metrics开头的五个jar包、solr-7.7.1/dist目录下solr-dataimporthandler-7.7.1.jar和solr-dataimporthandler-extras-7.7.1.jar全部导入tomcat里webapp目录下solr项目的/WEB-INF/lib目录下

4、创建solrhome目录:将solr-7.1.1/server/solr/目录的所有内容拷贝到新建的solrhome目录下

5、修改solr项目下的web.xml:添加一下内容,设置solrhome

<env-entry>
	<env-entry-name>solr/home</env-entry-name>
	<!-- 在这里修改成刚才创建的solrhom目录的全路径 -->
	<env-entry-value>D:\solr\solrhome</env-entry-value>
	<env-entry-type>java.lang.String</env-entry-type>
</env-entry>

注释掉<security-constraint>的全部内容~

6、启动tomcat:http://localhost:8999/solr/index.html#/

7、添加新核:我们发现solr提示核初始化失败,无法添加新核!既然如此,我们手动添加一个~

 在solrhome目录下新建名为new_core1的文件夹,添加solr-7.7.1\server\solr\configsets\_default目录下的conf文件夹,添加core.properties,内容如下:

name=new_core1

总体是这样:

data文件夹是重启tomcat后自动产生的,现在我们可以看到core的存在!!!

三、schema.xml详解

该部分转自https://iamyida.iteye.com/blog/2213354

schema.xml是用来定义索引数据中的域的,包括域名称,域类型,域是否索引,是否分词,是否存储,是否标准化即Norms,是否存储项向量等等。

     schema.xml配置文件的根元素就是schema,有个name属性,name属性值可以随便配,根元素没什么好说的,schema元素下主要有两个标签元素即field和fieldType,field表示域,用来定义域,fieldType用来定义域类型。

     field:元素有很多属性可以配置,我一一做个解释:

     name: 表示域的名称,是强制必须有的属性

     type: 域类型的名称,与fieldType元素的name属性值对应,也是强制必须有的属性,不可省

      required: 表示这个域是否是必须要在document中存在,默认值为false,如果此配置项设为true,则你的document中必须要添加此域,否则你创建索引时会抛异常,例如:Document is missing mandatory field:xxx之类的异常,由于lucene的索引结构是扁平化的,所以一般除了id主键域你可以设置为唯一域,其他域required建议保持默认值false即可

     indexed: true即表示需要对该域进行索引,一般如果你需要在该域上进行查询或排序时,则需要配置为true,默认值为false

     stored: 表示是否需要把域值存储到硬盘上,方便你后续查询时能再次提取出来原样显示给用户

     docValues: 表示此域是否需要添加一个docValues域,这对facet查询,group分组,排序,function查询有好处,尽管这个属性不是必须的,但他能加快索引数据加载,对NRT近实时搜索比较友好,且更节省内存,但它也有一些限制,比如当前docValues域只支持strField,UUIDField,Trie*Field等域,且要求域的域值是单值不能是多值域

     multiValued: 表示这个域是否可以存储多个值,若设置为true,即表示这是一个多值域

     omitNorms: 此属性若设置为true,即表示将忽略域值的长度标准化,忽略在索引过程中对当前域的权重设置,且会节省内存。只有全文本域或者你需要在索引创建过程中设置域的权重时才需要把这个值设为false,对于基本数据类型且不分词的域如intFeild,longField,StrField等默认此属性值就是true,否则默认就是false.

     termVectors: 设置为true即表示需要为该field存储项向量信息,当你需要MoreLikeThis功能时,则需要将此属性值设为true,这样会带来一些性能提升。

     termPositions: 是否存储Term的起始位置信息,这会增大索引的体积,但高亮功能需要依赖此项设置,否则无法高亮

     termOffsets: 表示是否存储索引的位置偏移量,高亮功能需要此项配置,当你使用SpanQuery时,此项配置会影响匹配的结果集

     field里还有两个比较难理解的域,是Solr扩展的,在Lucene中没有的概念,即dynamicField动态域和copyField复制域:

     动态域的属性配置跟普通的field差不多就不多说了,唯一有点区别就是name的属性值,可以用通配符,这样就可以模糊匹配多个域啦,这样设计的目的就是不用频繁的去修改我们的schema.xml中的field配置去增加field域啦,比如之前有个link_s域,某一天你想再增加一个url_s域,那你就需要去修改schema.xml配置文件,由于schema.xml修改过后需要重启tomcat才能生效,重启即意味着程序的中断,这往往是不可接受的。所以引入动态域来避免频繁添加修改域,但前提是你的域需要符合你提前定义的动态域的域名称命名规则。

四、中文分词

 我们使用IKAnalyzer分词器,它支持扩展!!!去网上下载就ok~

1、把IKAnalyzer的jar包添加到solr项目的/WEB-INF/lib目录下

2、赋值IKAnalyzer的配置文件和自定义词典和停用词典到solr的classpath下,即solr项目的/WEB-INF/classes,如果没有,自己建一个

3、在new_core1的managed-schema.xml(我把它改成schema.xml了,不知道你们改不改会不会有什么区别)中添加一个自定义的fieldType,使用分词器

<!-- IKAnalyzer -->
<fieldType name="text_ik" class="solr.TextField">
	<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer">
</fieldType>
<!-- IKAnalyzer Field -->
<field name="title_ik" type="text_ik" indexed="true" stored="true" />
<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true" />

4、现在我们可以使用分词器~

五、导入数据

1、我们需要导入solr-dataimporthandler-7.7.1.jar、solr-dataimporthandler-extras-7.7.1.jar、mysql-connector-java-5.1.7-bin.jar到solrhome/new_core1/lib目录下

2、配置conf目录下solrconfig.xml文件,添加一个RequestHandler

<!-- RequestHandler -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
	<lst name="defaults">
		<str name="config">data-config.xml</str>
	</lst>
</requestHandler>

3、在同一目录建立一个data-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
	<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/lucene" user="root" password="" />
	
	<document>
		<entity name="products" query="SELECT pid, name, catalog_name, price, description, picture FROM products">
			<field column="pid" name="id" />
			<field column="name" name="product_name" />
			<field column="catalog_name" name="product_catalog_name" />
			<field column="price" name="product_price" />
			<field column="description" name="product_description" />
			<field column="picture" name="product_picture" />
		</entity>
	</document>
</dataConfig>

4、修改schema.xml文件

	<!-- products表 -->
	<field name="product_name" type="text_ik" indexed="true" stored="true" />
	<field name="product_catalog_name" type="string" indexed="true" stored="true" />
	<field name="product_price" type="float" indexed="true" stored="true" />
	<field name="product_description" type="text_ik" indexed="true" stored="false" />
	<field name="product_picture" type="string" indexed="false" stored="true" />
	<!-- 关键词搜索 -->
	<field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
	<copyField source="product_name" dest="product_keywords" />
	<copyField source="product_description" dest="product_keywords" />

5、现在可以提交了~~

这是查询结果(PS:昨天晚上怎么搞都不对,改来该去的,今早重启电脑和mysql之后立马就没问题了,所以我认为应该是mysql数据库的问题吧emmm当然也可能是solr的,总之,搞定了就好~)

 


补坑成功~~~

我是小昶,咱明天见呐~

欢迎关注我们的公众号:落饼枫林~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值