飞道的博客

solr 7+版本的部署和简单需求

354人阅读  评论(0)

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&amp;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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场