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目录下
-
修改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>
-
solrconfig.xml同级目录下新增data-config.xml文件
<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:33088/hh-jgj?characterEncoding=utf-8&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>
-
修改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"/>
自动更新数据方案
- 准备工作:下载jar包:solr-dataimportscheduler-1.1.jar 网上也有1.0版本,但是具体对应solr版本请自行查找
当solr7+以上版本时,该jar包会有问题,配置后服务器启动会报错,页面404,具体详情后面会有解决方案。
- 新建文件: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
- 步骤一:将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模块)
- 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>
- 配置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" />
-
重新启动后重建索引自动生成建议,访问/solr/core/suggest即可开始检索,修改参数spellcheck.dictionary=seggest切换字典
-
拼音分词字段(没用到)
- 需要下载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>