Solr的部署tomcat
本教程所用到的资料
链接:https://pan.baidu.com/s/1w09soa-59ZSewdFlpsYE3w
提取码:yt3r
第一步
下载solr.zip解压到新建的solr-tomcat文件夹
下载tomcat解压到新建的solr-tomcat文件夹
把 solr/server/solr-webapp下webapp底下所有文件部署到 tomcat /webapps/文件夹下(文件名改为项目名如solr或者web_solr等等,自定义)
第二步
将solr/server/lib/ext/里面的jar包复制到tomcat项目中WEB-INF/lib/下
将solr/server/lib/metrics开头的jar包复制到 tomcat里的项目下的WEB-INF/lib/下
第三步
在solr/bin目录启动 cmd, 使用命令: solr.cmd start
创建core 命令: solr.cmd create -c corename(这个是core的名字可自定义)
将solr/server/solr/所有文件复制到solr-tomcat/solrhome/下(手动创建solrhome)
第四步
并将tomcat/项目名/WEB-INF/web.xml加上这一段代码
d:/solr-tomcat/solrhome : solrhome的绝对路径
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>d:/solr-tomcat/solrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
注释掉这段代码:
<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>
第五步
拷贝solr下contrib和dist文件夹至solr-home目录下。
同时将classes解压到项目/WEB-INF/下(里面包含了log4j和IK的配置,注意ik在2012年就不再更新了,也就是说想要使用ik必须自己将其进行封装)
第六步
修改Tomcat\bin下的catalina.bat,增加solr.log.dir系统变量,指定solr日志记录存放地址。(我这一步被卡了好久,很多教程都没说到这一步)
if not "%JSSE_OPTS%" == "" goto gotJsseOpts
set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
:gotJsseOpts
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
set "JAVA_OPTS=%JAVA_OPTS% -Dsolr.log.dir=C:\study\solrhome\logs"--增加的一行
访问solr
http://localhost:8080/solr/index.html
这样就完成部署了
非重点就不介绍了
首先点击core selector,会发现里面有个名字正是我们刚刚用cmd创建的core,选择它
页面的功能:
Analysis :分词功能
DataImport :数据导入,比如从数据库中导入数据
Documents :可以操作document,比如添加、修改、删除操作
Query :查询操作
solrhome\newcore\conf\
managed-schema以及solrconfig.xml
介绍上面两个文件
managed-schema:solr的field文件,比如sql的表中字段,这些需要我们创建
solrconfig.xml:solr的配置文件
常用field类型:
相信大家一看基本都可以了解这些属性类型,因为都是常见的,只是多了一个p(屁),不行,快笑喷了
pint
pints
string
strings
text_general
plong
plogos
boolean
booleans
pfloat
pfloats
pdouble
pdoubles
random
fields各个属性说明:
name: 必须属性 - 字段名
type: 必须属性 - <types>中定义的字段类型
indexed: 如果字段需要被索引(用于搜索或排序),属性值设置为true
stored: 如果字段内容需要被返回显示,值设置为true
multiValued: 如果这个字段在每个文档中可能包含多个值,设置为true
required:字段必须有值,否则会抛异常 default: 在增加文档时,可以根据需要为字段设置一个默认值,防止为空
==以上的都比较常见,重点了解==
termVectors: [false]设置为true后,会保存所给字段的相关向量(vector)当使用MoreLikeThis时,用于相似度判断的字段需要设置为stored来达到最佳性能.
termPositions: 保存和向量相关的位置信息,会增加存储开销
termOffsets: 保存 offset 和向量相关的信息,会增加存储开销
docValues: 如果这个字段应该有文档值(doc values),设置为true。文档值在门面搜索,分组,排序和函数查询中 会非常有用。虽然不是必须的,而且会导致生成索引变大变慢,但这样设置会使索引加载更快,更加NRT友好,更高的内 存使用效率。然而也有一些使用限制:目前仅支持StrField, UUIDField和所有Trie*Fields, 并且依赖字段类型,可能要求字段为单值(single-valued)的,必须的或者有默认值。
<!--字段名由字母数字下划线组成,且不能以数字开头。两端为下划线的字段为保留字段,如(_version_)。-->
<!--保留字段,不能删除,否则报错 -->
<field name="_version_" type="long"indexed="true" stored="true"/>
<!-- 文档的唯一标识,可理解为主键,除非标识为required="false", 否则值不能为空-->
<uniqueKey>id</uniqueKey>
了解五个标签
FieldType
此标签是field的类型,比如自定义了text_ik类型
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="com.chunuo.lucene.IKAnalyzer4Lucene7"/>
</fieldType>
Field
field就是字段 ,类型是text_ik,然后名字为lastName;
可以理解为:text_ik类型,lastName为变量名或字段名
<field name="lastName" type="text_ik" indexed="true" stored="true"/>
uniqueKey
主键,sql的primary key
<uniqueKey>uuid</uniqueKey>
copyField
有这么一个需求,比如搜索会查询标题以及内容,
那么单独分开查询的话会分两次查询,效率低,就有了复制域,
将user_username和department_Name都复制到user_depa域中
<field name="user_depa" type="text_ik" indexed="true" stored="true" multiValued="true"/>
<copyField source="user_username" dest="user_depa"/>
<copyField source="department_Name" dest="user_depa"/>
dynamicField
比如一个项目中,可能会出现很多的字段,不可估计,那么就可以用动态域,
*表示任意字符,只要符合xxx_i就可以了
<dynamicField name="*_i" type="pint" indexed="true" stored="true"/>
安装IK分词器
将ik.jar包拷贝到项目/WEB-INF/lib/下
将classes压缩到项目/WEB-INF/下
(这一个上面已经完成过了,因为同一步操作就不分两部了)
此路径下solrhome\newcore(这个是利用cmd命令创建的自定义名字)\conf\managed-schema
添加配置,然后对lastName进行分词测试
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="com.chunuo.lucene.IKAnalyzer4Lucene7"/>
</fieldType>
<field name="lastName" type="text_ik" indexed="true" stored="true"/>
改完后重启项目,测试IK分词的效果
修改主键为uuid类型
因为如果有多表需求的话,id主键会重复,那么就会覆盖数据,因此将主键改为uuid,并且将id类型改为int(默认string)
此路径下solrhome\newcore(这个是利用cmd命令创建的自定义名字)\conf\managed-schema
添加以下两端
<fieldType name="uuid" class="solr.UUIDField" indexed="true" />
<field name="uuid" type="uuid" indexed="true" stored="true" required="true"/>
找到<uniqueKey>id</uniqueKey>改为:
<uniqueKey>uuid</uniqueKey>
注意,如果不是每次都用默认id的话,需要把required="false",否则每条数据必须有id这个字段
type的默认是string,因为我这边习惯用int类型,所以改为int
<field name="id" type="pint" indexed="true" stored="true" required="false" multiValued="false" />
_root_必须与id类型一致,所以修改_root_类型为uuid
<field name="_root_" type="uuid" indexed="true" stored="false" docValues="false" />
solrconfig.xml做一下修改
在以下代码:
<requestHandler name="/updauuidte/extract"
startup="lazy"
class="solr.extraction.ExtractingRequestHandler" >
<lst name="defaults">
<str name="lowernames">true</str>
<str name="fmap.meta">ignored_</str>
<str name="fmap.content">_text_</str>
</lst></requestHandler>
的前面添加代码:
<requestHandler name="/update" class="solr.UpdateRequestHandler">
<lst name="defaults">
<str name="update.chain">uuid</str>
</lst>
</requestHandler>
注释掉以下的配置:
<searchComponent name="elevator" class="solr.QueryElevationComponent" >
<str name="queryFieldType">string</str>
<str name="config-file">elevate.xml</str>
</searchComponent>
如果是集群部署的话,上传到zookeeper中,并且创建
collection:/data/soft/solr/bin/solr create -c uuidconn1 -d /data/solr/config-files/uuidconfigs -s 1 -rf 2 -n uuidconn1
query功能:
q:title:智能汽车 //查询title有智能汽车的
fq:money:{10 TO *} //且10块钱起但不包含10块钱
fq:message:性价比高 //且message包含性价比高
sort:money asc/desc //升序/倒序
start,rows :0 - 5 //从0开始,查询5条数据
fl:id,title //只查询id和title域
df:默认域
hl(高亮:可以设置某个域有特殊形式显示)
高亮的效果
solr简单的使用基本操作
默认:创建和修改(只要指明的id重复了,那么就成了修改)id是string类型
但是我们将主键改为uuid了,也就是说id可以重复
删除操作:删除uuid=ce50ac90-7eec-486c-bc9d-b4c7635601a7的数据
批量插入数据
第一步、拷贝solr-6.6.3\dist 下solr-dataimporthandler jar 包,solr-dataimporthandler-extras-6.6.3.jar 包 到solrhome/corename/lib/下,
并且导入数据库的jar(mysql.jar)
solrhome/newcore(这个是刚刚用cmd命令创建的core)/conf/solrconfig.xml
第二步、配置solrconfig.xml文件,添加一个
<requestHandler name="/dataimport"
class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
<str name="update.chain">uuid</str>
</lst>
</requestHandler>
设置高亮:
同文件添加以下代码
lastName:高亮的字段名
<requestHandler name="standard" class="solr.SearchHandler" default="true">
<!-- default values for query parameters -->
<lst name="defaults">
<str name="echoParams">explicit</str>
<bool name="hl">true</bool>
<str name="hl.fl">lastName</str>
<int name="hl.snippets">3</int>
</lst>
</requestHandler>
第三步、创建文件collection1/conf/data-config.xml写入数据
(field column是数据库的字段 name对应solr Scheme.xml的field)
如果没有将主键改为uuid的话,多表需求的话可以用以下方法,避免id重复而导致覆盖,可以改为:select concat(“book_”,id),driving,motor,title,message from smart
data-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://134.175.87.59:3306/springboot?useUnicode=true&characterEncoding=utf8"
user="chunuo"
password="root"/>
<document name="springboot">
<entity name="department" query="select departmentName from department">
<field column="id" name="department_id"/>
<field column="departmentName" name="department_Name"/>
</entity>
<entity name="user" query="select id,username,password,date,money,depa_id from user">
<field column="id" name="user_id"/>
<field column="username" name="user_username"/>
<field column="password" name="user_password"/>
<field column="date" name="user_date"/>
<field column="money" name="user_money"/>
<field column="depa_id" name="user_depa_id"/>
</entity>
</document>
</dataConfig>
managed-schema
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="com.chunuo.lucene.IKAnalyzer4Lucene7"/>
</fieldType>
<field name="lastName" type="text_ik" indexed="true" stored="true"/>
<field name="user_id" type="pint" indexed="true" stored="true"/>
<field name="user_username" type="text_ik" indexed="true" stored="true"/>
<field name="user_password" type="string" indexed="false" stored="false"/>
<field name="user_date" type="pdate" indexed="false" stored="false"/>
<field name="user_money" type="pfloat" indexed="true" stored="true"/>
<field name="user_depa_id" type="pint" indexed="true" stored="true"/>
<field name="department_id" type="pint" indexed="true" stored="true"/>
<field name="department_Name" type="text_ik" indexed="true" stored="true"/>
查询
q:title:智能汽车 //查询title有智能汽车的
fq:money:{10 TO *} //且10块钱起但不包含10块钱
fq:message:性价比高 //且message包含性价比高
sort:money asc/desc //升序/倒序
start,rows :0 - 5 //从0开始,查询5条数据
fl:id,title //只查询id和title域
df:默认域
hl(高亮:可以设置某个域有特殊形式显示)
这样就完成了solr的基本使用啦,下一章 与java配合使用 SolrJ
可能很多细节没写清楚,第一次写教程,希望大家嘴下留情,哈哈哈哈
转载:https://blog.csdn.net/weixin_43974962/article/details/105732340