Solr8.6.3安装与配置
一、Solr概述
Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
Solr类似开发的web项目,是一个war包,放入Servlet容器下就可以直接运行,因此Solr可以独立运行在Jetty、Tomcat等Servlet容器中。
二、搭建solr服务器(Tomcat)
1.下载
2.Tomcat和Solr整合
在tomcat的webapps目录下创建solr目录。
解压solr-8.6.3,找到D:\Program Files\solr-8.6.3\server\solr-webapp\webapp目录
将该目录下所有文件拷贝到tomcat的webapps/solr目录下
3.添加依赖与配置
找到D:\Program Files\solr-8.6.3\server\lib\ext目录,将所有jar包加入到tomcat的webapps/solr/WEB-INF/lib目录下。
将D:\Program Files\solr-8.6.3\server\resources目录下的所有文件复制到D:\Tomcat\apache-tomcat-9.0.30\webapps\solr\WEB-INF\classes目录下,classes目录不存在,需要创建
修改log4j2.xml配置文件,把所有${sys:solr.log.dir}修改为自己的指定的真实路径
这里再D:\Tomcat\apache-tomcat-9.0.30\webapps\solr目录下创建了logs文件夹
找到D:\Program Files\solr-8.6.3\server\lib目录,将除去jetty-*开头的所有jar包加入到tomcat的webapps/solr/WEB-INF/lib目录下。
4.创建工作空间
在tomcat的webapps/solr目录下创建solrHome目录,把该目录作为solr的工作空间,该工作空间主要用于存储创建索引的索引文件信息。
拷贝D:\Program Files\solr-8.6.3\server\solr\solr.xml到该目录(solrHome)下,solr才能识别该目录为solr工作空间。
5.指定solr工作空间
告诉solr的web工程solrhome的路径。打开tomcat的webapps/solr/WEB-INF下的web.xml文件
添加以下代码
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>自己定义的solrHome路径</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
注释以下代码
<!-- Get rid of error message -->
<!--
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Enable everything but TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method-omission>TRACE</http-method-omission>
</web-resource-collection>
</security-constraint>
-->
6.创建solr索引库
在solrHome目录下创建collection1目录,该目录用于存储创建的索引信息。
索引信息需要引入一些核心配置,对应核心配置在D:\Program Files\solr-8.6.3\server\solr\configsets目录下。
拷贝configsets该目录下的任一目录中的config文件到D:\Tomcat\apache-tomcat-9.0.30\webapps\solr\solrHome\collection1目录中。
7.消除警告
当点击管理界面的logging,由于solr还依赖了其他包,会有警告信息,但不影响solr使用,所以此步可忽略。
将D:\Program Files\solr-8.6.3目录下的contrib和dist目录拷贝到tomcat的webapps/solr/solrHome目录下,并修改solrhome目录下的collection1/conf/solrconfig.xml
${solr.install.dir:}是指当前索引所在的位置,即collection1文件夹,这里从collection1里向上一级查找正好是contrib和dist目录。重启tomcat,黄色警告消失!
8.启动Tomcat
访问http://localhost:8080/solr/index.html
由于手动创建的索引库并未交给solr管理,需要创建对应关联信息。左侧No cores available表示没有索引库,点击创建索引库。
点击Add Core后便会出现collection1索引库对应信息
三、管理界面介绍
1.Dashboard
Solr实例开始启动运行的时间、版本、系统资源、jvm等信息。
2.Logging
Solr运行日志信息
3.Core Admin
Solr Core的管理界面。可以添加/取消关联SolrCore实例。
4.java properties
Solr在JVM 运行环境中的属性信息,包括类路径、文件编码、jvm内存设置等信息。
5.Tread Dump
显示Solr Server中当前活跃线程信息,同时也可以跟踪线程运行栈信息。
6.Core selector
选择一个SolrCore进行详细操作。
dataimport
可以定义数据导入处理器,从关系数据库将数据导入到Solr索引库中。默认没有配置,需要手工配置。
Analysis
可以测试索引分析器和搜索分析器的执行情况。
FieldType: content是进行分词。
通过/update表示更新索引,solr默认根据id(唯一约束)域来更新Document的内容,如果根据id值搜索不到id域则会执行添加操作,如果找到则更新。可以创建索引、更新索引、删除索引等操作。
通过/select执行搜索索引,必须指定“q”查询条件方可搜索。
四、中文分析器IK Analyzer
IK Analyzer概述
IK Analyzer 是一个开源的,基亍 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。从 3.0 版本开始,IK 发展为面向 Java 的公用分词组件,独立亍 Lucene 项目,同时提供了对 Lucene 的默认优化实现。在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化。
配置IK Analyzer
把 IKAnalyzer的依赖包添加到 webapps/solr/WEB-INF/ lib 目录下
把扩展词典、停用词词典、配置文件放到 solr 工程的 WEB-INF/classes 目录下。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic;</entry>
<!--配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopword.dic;</entry>
</properties>
修改D:\Tomcat\apache-tomcat-9.0.30\webapps\solr\solrHome\collection1\conf目录下的managed-schema文件,配置一个FieldType,使用 IKAnalyzer。
<!--IKAnalyzer-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index">
<!--useSmart表示是否不进行分词,true不分词,false分词-->
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" />
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" />
</analyzer>
</fieldType>
上面的index和query的配置分别与客户端的analyzer相对应
使用Ik分词
五、配置域
SolrCore的conf目录下的managed-schema文件,此配置文件中定义了Filed域以及域的类型等一些配置。在solr中域必须先定义后使用。
域相当于数据库的表字段,根据业务需要定义相关的Field(域)。
1.域的常用属性
name:指定域的名称
type:指定域的类型
indexed:是否索引
stored:是否存储
required:是否必须
multiValued:是否多值,存储多个值时设置为true,solr允许一个Field存储多个值,比如存储商品的图片(有多个)
2.域
修改managed-schema文件 设置业务Field
<field name="item_id" type="string" indexed="true" stored="true"/>
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="pfloat" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_desc" type="text_ik" indexed="true" stored="true" />
3.复制域
将多个Field复制到一个Field中,以便进行统一的检索。当创建索引时,solr服务器会自动的将源域的内容复制到目标域中。
复制域的作用在于将某一个Field中的数据复制到另一个域中。在搜索关键词的时候,一般会挨着匹配搜,类似SQL的OR且效率比较低,使用复制域,将多个域的数据集中到一个域中搜索,提高查询效率,简言之就是多个域的值拼接到一起,组成一个新的域。。
source:源域
dest:目标域,搜索时,指定目标域为默认搜索域,可以提高查询效率。
定义目标域:
<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
目标域必须要使用:multiValued=“true”
使用复制域:
<copyField source="item_title" dest="text"/>
SQL示例:
select * from item where title like '%华为%' or brand like '%华为%'
复制域示例:
select * from item where keywords like '%手机%'
示例:
将多个域的值拼接到一起,组成一个新的域。
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_price" dest="item_keywords"/>
<copyField source="item_desc" dest="item_keywords"/>
4.动态域
当需要动态扩充字段时,就需要使用动态域。
<dynamicField name="*_s" type="string" indexed="true" stored="true" />
name:动态域的名称,是一个表达式,*匹配任意字符,只要域的名称和表达式的规则能够匹配就可以使用。
<dynamicField name="item_test_*" type="string" indexed="true" stored="true" />
5.主键域
uniqueKey,相当于主键,每个文档中必须有一个id域。
<uniqueKey>id</uniqueKey>
6.域类型
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
<fieldType name="pint" class="solr.IntPointField" docValues="true"/>
<fieldType name="pfloat" class="solr.FloatPointField" docValues="true"/>
<fieldType name="plong" class="solr.LongPointField" docValues="true"/>
<fieldType name="pdouble" class="solr.DoublePointField" docValues="true"/>
<fieldType name="pdate" class="solr.DatePointField" docValues="true"/>
<fieldType name="pdates" class="solr.DatePointField" docValues="true" multiValued="true"/>
<fieldType name="binary" class="solr.BinaryField"/>
<fieldType name="random" class="solr.RandomSortField" indexed="true" />
<fieldType name="managed_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ManagedStopFilterFactory" managed="english" />
<filter class="solr.ManagedSynonymGraphFilterFactory" managed="english" />
<filter class="solr.FlattenGraphFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ManagedStopFilterFactory" managed="english" />
<filter class="solr.ManagedSynonymGraphFilterFactory" managed="english" />
</analyzer>
</fieldType>
name:域类型的名称
class:指定域类型的solr类型。
analyzer:指定分词器。在FieldType定义的时候最重要的就是定义这个类型的数据在建立索引和进行查询的时候要使用的分析器analyzer,包括分词和过滤。
type:index和query。Index 是创建索引,query是查询索引。
tokenizer:指定分词器
filter:指定过滤器
六、Spring Data Solr操作Solr
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/137098.html