windows服务器solr搭建 自动更新 搜索建议

1 篇文章 0 订阅

windows安装solr

solr下载

下载地址

下载完成后解压至目录

修改solr时区,增量更新时间问题

参考资料

bin目录下修改solr.in.cmd或solr.in.sh文件

SOLR_TIMEZONE="UTC+8"

在bin目录下启动solr

solr start

停止
solr stop -all

重启
solr reload -all

创建核心

solr create_core -c core_name

修改配置文件

配置文件在server/solr/核心名/conf目录下

  1. 修改solrconfig.xml,引入jar,配置data-config.xml

    <!--这两个包在dist目录下 -->
    <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-8.3.0\.jar" />
    <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-extras-8.3.0\.jar" />
    <!--ik分词器 下载地址:https://search.maven.org/search?q=com.github.magese -->
    <lib dir="${solr.install.dir:../../../..}/dist/" regex="ik-analyzer-8.2.0\.jar" />
    <!-- mysql -->
    <lib dir="${solr.install.dir:../../../..}/dist/" regex="mysql-connector-java-5.1.47\.jar" />
    
    <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
        <str name="config">data-config.xml</str>
    </lst>
    </requestHandler>
    
  2. solrconfig.xml同级目录下新增data-config.xml文件

    <dataConfig>
        <dataSource type="JdbcDataSource"
                driver="com.mysql.jdbc.Driver"
                url="jdbc:mysql://localhost:33088/hh-jgj?characterEncoding=utf-8&amp;batchSize=-1"
                user="root"
                password="password" />
        <document>
            <!-- 
                name必须,类似表名,唯一
                pk增量更新必须,主键名
                query全量更新时执行的sql
                deltaQuery增量更新时查询那些需要更新,这里取大于最后一次更新时间的id,查出的id作为deltaImportQuery的条件
                deltaImportQuery增量更新时更新内容的sql,${dih.delta.id}就是deltaQuery取到的id
                field字段,可有可无,需要别名时添加
            -->
            <entity 
                name="artiles"
                pk="id"
                query="SELECT id,title,create_date,update_date from js_cms_article where status = 0"
                deltaImportQuery="select id,title,create_date,update_date from js_cms_article where id ='${dih.delta.id}'"
                deltaQuery="select id from js_cms_article where update_date > '${dataimporter.last_index_time}'">
    
                <field column='id' name="id"/>
                <field column="title" name="title" />
                <field column="create_date" name="createDate" dateTimeFormat='yyyy-MM-dd HH:mm:ss'/>
                <field column='update_date' name="updateDate" dateTimeFormat='yyyy-MM-dd HH:mm:ss' />
                <!-- 关联表查询,一对一 -->
                <entity name="article_data" query="select content_str from js_cms_article_data where id='${artiles.id}'">
                    <field column="content_str" name="content" />
                </entity>
            </entity>
        </document>
    </dataConfig>
    
  3. 修改managed-schema文件,域字段

    <!-- Ik分词器配置 -->
    <fieldType name="text_ik" class="solr.TextField">
        <analyzer type="index">
        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" conf="ik.conf" useSmart="false"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" conf="ik.conf" useSmart="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>
    
    <!-- 唯一主键,如果主键不是id需要修改,或者修改别名 -->
    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
    <!-- 
        multiValued 多结果,一个商品多种分类时开启
        indexed 是否索引,需要查询的字段开启
        required 是否必须,过滤空字段
        stored 存储,不开启不会返回结果
    -->
    <field name="title" type="text_ik" multiValued="false" indexed="true" required="true" stored="true"/>
    <field name="content" type="text_ik" multiValued="false" indexed="true" required="true" stored="true"/>
    <field name="createDate" type="string" multiValued="false" indexed="false" required="true" stored="true"/>
    

自动更新数据方案

原博地址

  1. 准备工作:下载jar包:solr-dataimportscheduler-1.1.jar 网上也有1.0版本,但是具体对应solr版本请自行查找

当solr7+以上版本时,该jar包会有问题,配置后服务器启动会报错,页面404,具体详情后面会有解决方案。

  1. 新建文件:dataimport.properties,文件复制下面的就好,具体配置含义已给出注释:
 
#################################################
#                                               #
#       dataimport scheduler properties         #
#                                               #
#################################################
 
#  to sync or not to sync
#  1 - active; anything else - inactive
# 这里的配置不用修改
syncEnabled=1
 
#  which cores to schedule
#  in a multi-core environment you can decide which cores you want syncronized
#  leave empty or comment it out if using single-core deployment
#  修改成你所使用的core,我这里是我自定义的core:simple
syncCores=doc
 
#  solr server name or IP address
#  [defaults to localhost if empty]
# 这个一般都是localhost不会变
server=localhost
 
#  solr server port
#  [defaults to 80 if empty]
#  安装solr的tomcat端口,如果你使用的是默认的端口,就不用改了,否则改成自己的端口就好了
port=8983
 
#  application name/context
#  [defaults to current ServletContextListener's context (app) name]
#  这里默认不改
webapp=solr
 
#  URL params [mandatory]
#  remainder of URL
#  这里改成下面的形式,solr同步数据时请求的链接  (我这里使用的 full-import )
params=/dataimport?command=delta-import&commit=true
 
#  schedule interval
#  number of minutes between two runs
#  [defaults to 30 if empty]
#这里是设置定时任务的,单位是分钟,也就是多长时间你检测一次数据同步,根据项目需求修改
#  开始测试的时候为了方便看到效果,时间可以设置短一点
interval=1
 
#  重做索引的时间间隔,单位分钟,默认7200,即5天; 
#  为空,为0,或者注释掉:表示永不重做索引
reBuildIndexInterval=7200
 
#  重做索引的参数
reBuildIndexParams=/select?qt=/dataimport&command=full-import&clean=true&commit=true
 
#  重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
#  两种格式:2012-04-11 03:10:00 或者  03:10:00,后一种会自动补全日期部分为服务启动时的日期
reBuildIndexBeginTime=03:10:00
  1. 步骤一:将solr-dataimportscheduler.jar包复制到E:\solr-8.1.1\server\solr-webapp\webapp\WEB-INF\lib中。
    步骤二:在E:\solr-8.1.1\server\solr-webapp\webapp\WEB-INF目录下的web.xml文件中添加监听配置(标签前面):
 <listener>
   <listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class>
 </listener>

搜索建议(sugger模块)

  1. solrconfig.xml文件配置suggest
  <searchComponent name="suggest" class="solr.SpellCheckComponent" >
    <!-- schema.xml中的fieldType类型,如果加了这个选项,拼写检查时会调用这个fieldType的分词器,如果没有加,solr会取field属性上面filetype的分词器,这个时候还找不到,solr会创建一个按空格进行分词(SpellCheckComponent需要一个分词器才能运行),在这们项目中,我们现希望Analyzer不对查询做任何的改变,因此选择string。(网上也建议不要对他定义复杂的分词,如果指定的Analyzer很复杂的话,会导致suggest返回的结果不符合预期) -->
      <str name="queryAnalyzerFieldType">string</str>  
      <lst name="spellchecker">
          <!-- 就是取个名字,江湖中的人士都是让他等于suggest -->
          <str name="name">suggestion</str>
          <!-- org.apache.solr.spelling.suggest.Suggester(不要改动) -->
          <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
          <!-- org.apache.solr.spelling.suggest.tst.TSTLookup(不要改动) -->
          <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
          <!-- 说明只在这个字段上面做拼写检查 -->
          <str name="field">suggestion</str>
          <!-- 限制一些不常用的词出现,值越大过滤词就越多,取值范围【0~1】官网默认是0.005 -->
          <float name="threshold">0.0000001</float>  
          <str name="comparatorClass">freq</str>  
          <!-- 当commit的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果) -->
          <str name="buildOnOptimize">true</str>  
          <!-- 当optimize的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果) -->
          <str name="buildOnCommit">true</str>
      </lst>
      <!-- 这里配置第二个字典是为了实现相关搜索,suggest不进行分词,推荐全名的标题 -->
      <lst name="spellchecker">
          <str name="name">suggest</str>
          <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
          <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
          <str name="field">suggest</str>  
          <str name="buildOnOptimize">true</str>  
          <str name="buildOnCommit">true</str>
      </lst>
  </searchComponent>
  <requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest">
      <lst name="defaults">
          <str name="spellcheck">true</str>
          <str name="spellcheck.dictionary">suggestion</str>
          <str name="spellcheck.onlyMorePopular">true</str>
          <str name="spellcheck.count">5</str>
          <str name="spellcheck.collate">true</str>
      </lst>
      <arr name="components">
          <str>suggest</str>
      </arr>
  </requestHandler>
  1. 配置managed-schema.xml
  • 增加一种字段类型
  • suggestion字段分词后能提供字数较少的建议
  • suggest字段提供全标题的相关搜索
    <!-- 搜索建议 -->
    <fieldType name="textSpell" class="solr.TextField" >
        <analyzer>
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>

    <field name="suggestion" type="text_ik" indexed="true" stored="true" termVectors="true" multiValued="true"/>
    <copyField source="title" dest="suggestion" />
    <copyField source="content" dest="suggestion" />
    <field name="suggest" type="textSpell" indexed="true" stored="true" />
    <copyField source="title" dest="suggest" />
  1. 重新启动后重建索引自动生成建议,访问/solr/core/suggest即可开始检索,修改参数spellcheck.dictionary=seggest切换字典

  2. 拼音分词字段(没用到)

  • 需要下载pinyin4j复制到webapp下lib文件夹内
    <!-- 拼音分词 -->
    <fieldType name="text_pinyin" class="solr.TextField" positionIncrementGap="0">
      <analyzer type="index">
          <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/>
          <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />
          <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />
      </analyzer>
      <analyzer type="query">
          <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/>
          <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />
          <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />
      </analyzer>
    </fieldType>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值