-
介绍
1、所需软件
1.1软件版本:
jdk1.8.0_121 solr6.2.0 eclipse-jee-neon-1a-win32-x86_64 apache-tomcat-8.0.41-windows-x86-x64 备注:如果你的tomcat小于8的话,启动后访问solr admin会遇到异常: Java.lang.NoSuchMethodError: javax.servlet.ServletInputStream.isFinished() ;如果你启动时看到这个,恭喜你,该升级tomcat了,换成8就OK了。2、解压目录
2.1 apache-tomcat-8.0.41-windows-x64目录
2.2solr6.2.0目录
2.3 jdk1.8.0_121目录
3 、环境配置
3.1在我们之前配置好的tomcat的webapp目录下新建一个solr的文件夹
3.2拷贝solr6.2.0包下面server/solr-webapp/webapp中的内容到tomcat新建的solr文件夹下
3.3拷贝solr6.2.0下面server/lib/ext中的jar包到新建的solr下面的WEB-INF\lib中
3.4拷贝solr6.2.0下面server\resources中log4j.properties到新建的solr的WEB-INF中
3.5修改solr\WEB-INF中的web.xml文件
将注释的<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>F:\solr\soft\apache-tomcat-8.0.41-windows-x64\webapps\solr_home(你的solr_home)</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry> 放开,并将其中的值修改为你的solrhome目录(solrhome目录主要配置索引存储路径,路径可自行选择)。 最后复制solr-6.2.0\server\solr中的所有文件到solr_home中;如 备注:此处的solr的根目录和solr_home是两回事,solr_home文件夹是用来存放索引的,所以solr_home可以在任意文件夹下存在。4、测试运行
4.1启动tomcat
访问首页:http://localhost:8080/solr/index.html 数据增量(DIH) 以下内容为数据增量操作5、创建Core Admin
5.1创建my_core
在solr_home文件夹下新建一个文件夹名字叫做my_core(名字不固定,可以随便取,但是这个名字在后面的配置中会有所关联。)然后把官网下下来的solr项目中F:\solr\soft\solr-6.2.0\example\example-DIH\solr\solr\conf文件夹的内容全部复制到my_core中。6、配置相关包及其路径
6.1把WEB-INF\lib里面的jar包配置到项目中
把mysql所需的jar包和solr-6.2.0\dist下的solr-dataimporthandler-6.2.0.jar和solr-dataimporthandler-extras-6.2.0.jar都复制到solr\WEB-INF\lib下。然后在solr_home\my_core\conf\solrconfig.xml文件中加入:<lib dir="F:/solr/soft/apache-tomcat-8.0.41-windows-x64/webapps/solr/WEB-INF/lib/" regex=".*\.jar" />这段代码大约在solrconfig.xml的75行处,前面有一堆类似的代码。7、建立数据库表
7.1在MYSQL中新建一张表
CREATE DATABASE IF NOT EXISTS solr; USE solr; DROP TABLE IF EXISTS `goods`; CREATE TABLE `goods` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(10) NOT NULL, `number` INT(20) DEFAULT NULL, `updateTime` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; INSERT INTO `goods`(`id`,`name`,`number`,`updateTime`) VALUES (1,'商品1',100,'2016-11-28 16:48:57'), (2,'商品2',120,'2016-11-28 16:48:57'), (3,'商品3',150,'2016-11-28 16:48:57'), (4,'手机1',50,'2016-11-28 17:44:29');8、添加solr-data-config.xml
8.1在solrconfig.xml中添加data-config.xml
在solrconfig.xml的<requestHandler name="/select" class="solr.SearchHandler">之上添加: <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">solr-data-config.xml</str> </lst> </requestHandler>8.2在conf下新建data-config.xml文件
修改之前复制过来的solr-data-config.xml文件。将以下内容新增到solr-data-config.xml中:(此处注意编码写成utf8不要写成utf-8,否则在做solr的dataImport时会报编码错误异常)。 <?xml version="1.0" encoding="UTF8"?> <dataConfig> <dataSource name="source1" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/solr" user="root" password="123456" batchSize="-1" /> <document> <entity name="goods" pk="id" dataSource="source1" query="select * from goods" deltaImportQuery="select * from goods where id='${dih.delta.id}'" deltaQuery="select id from goods where updateTime > '${dataimporter.last_index_time}'"> <field column="id" name="id"/> <field column="name" name="name"/> <field column="number" name="number"/> <field column="updateTime" name="updateTime"/> </entity> </document> </dataConfig> 解释一下: dataSource是数据库数据源。Entity就是一张表对应的实体,pk是主键,query是查询语句。Field对应一个字段,column是数据库里的column名,后面的name属性对应着Solr的Filed的名字。其中solrdata是数据库名,goods是表名。 其中deltaQuery是增量索引,原理是从数据库中根据deltaQuery指定的SQL语句查询出所有需要增量导入的数据的ID号。然后根据deltaImportQuery指定的SQL语句返回所有这些ID的数据,即为这次增量导入所要处理的数据。核心思想是:通过内置变量“${dih.delta.id}”和 “${dataimporter.last_index_time}”来记录本次要索引的id和最近一次索引的时间。8.3在conf文件下的managed-schema配置field信息
<field name="id" type="int" indexed="true" stored="true" required="true" multiValued="false" /> <field name="name" type="string" indexed="true" stored="false"/> <field name="number" type="int" indexed="true" stored="false"/> <field name="updateTime" type="date" indexed="true" stored="true" /> <!--下面三个字段是系统本身不能删除的,删除会报错--> <field name="_version_" type="long" indexed="true" stored="false"/> <field name="_root_" type="string" indexed="true" stored="false" docValues="false" /> <field name="_text_" type="text_general" indexed="true" stored="false" multiValued="true"/> 注意:id,name,number,updateTime是我们上面数据库的字段。下面三个field是系统本身的不能删除,否则会运行错误。9、测试
9.1启动tomcat并访问
启动tomcat,并在URL中输入http://127.0.0.1:8080/solr/index.html 路径。9.2新增core
点击Core Admin à name àinstanceDir(my_core的路径)àdataDir(默认data)àconfig(默认)àschema(默认) 说明几点: name:新建的core的名称(与5.1的名称保持一致my_core) instanceDir:就是你的core根目录,solr就是你的SOLR_HOME,你可以在SOLR_HOME下创建多个core目录,(与5.1保持一致F:\solr\soft\apache-tomcat-8.0.41-windows-x64\webapps\solr_home\my_core)。 dataDir:表示你core的数据目录,当前core的索引数据会存放在dataDir下的data\index目录下,上述所有文件夹需要你手动创建(除了data\index这里的index目录,solr会自动创建), Config、schema保持不变。 备注:- properties不能copy过去,是在创建的时候自动生成,如果copy此文件,会报错误:as another core is already defined there
- 新建core时,name必须与在solr_home文件夹下面新建的那个my_core的文件夹名称保持一致,否则在停止tomcat后再启动时,在core_selector中无法找到之前创建的core。
9.3增量Dataimport
全增量,如下图。(选择full_import,勾选clen,否则不勾选)9.4查询query
查询参数说明(solr参数) 在做solr查询的时候,solr提供了很多参数来扩展它自身的强大功能!以下是使用频率最高的一些参数! 一、常用 q - 查询字符串,这个是必须的。如果查询所有*:* ,根据指定字段查询(Name:张三 AND Address:北京) fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=Name:张三&fq=CreateDate:[20081001 TO 20091031],找关键字张三,并且CreateDate是在20081001到20091031范围内 fl - 指定返回那些字段内容,用逗号或空格分隔多个。 name,subbranch,tel start - 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。 rows - 指定返回结果最多有多少条记录,配合start来实现分页。 sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(score desc, price asc)表示先 “score” 降序, 再 “price” 升序,默认是相关性降序。 wt - (writer type)指定输出格式,可以有 xml, json, php,python,ruby,cvs fl表示索引显示那些field( *表示所有field,如果想查询指定字段用逗号或空格隔开(如:Name,SKU,ShortDescription或Name SKU ShortDescription【注:字段是严格区分大小写的】)) q.op 表示q 中 查询语句的 各条件的逻辑操作 AND(与) OR(或) 例如:name:总统府 OR tel:23xxxxxx3 例如: text:总统府 AND text:邮局 或 +text:总统府 +text:邮局 或 name:总统府 AND tel:23xxxxxx3 或 name: ( +总统府 +邮局) df - 默认的查询字段,一般默认指定 qt - (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。 indent - 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。 version - 查询语法的版本,建议不使用它,由服务器指定默认值。 hl 是否高亮 ,如hl=true hl.fl 高亮field ,hl.fl=Name,SKU hl.snippets :默认是1,这里设置为3个片段 hl.simple.pre 高亮前面的格式 hl.simple.post 高亮后面的格式 facet 是否启动统计 facet.field 统计field 排除查询 在要排除的词前加上 “-” (不包含”号) 号 例如: 总统府 -邮局 搜寻结果不会有包含邮局的词的结果在内 增加权重: 如要搜寻 “中华 加油站”(不包含”号) 但因为回传太多笔资料内有 “中华”(不包含”号) 或 “加油站”(不包含”号) 的结果, 所以想要把有包含 “加油站”(不包含”号)的数据往前排,可使用 “^”(不包含”号)符号在后面加上愈增加的权重数, 像是 “2″,则可以这样做:中华 加油站^2 会同时搜寻含有中华或加油站的结果,并把加油站这个词加权所以搜寻时会先判断加油站这一个词在 搜寻结果中的比重,甚至假设一笔数据内加油站出现过两次以上的就更加会有优先权. 查询时在查询词后加上 “^” (不包含”号) 再加上权重分数 例如: 总统府 AND “邮局”^2 或 总统府^2 OR 邮局 Wildcard 搜寻使用 “*” 符号; 如果输入 “中国*银” (不包含”号), 结果会有中国信托商业银行, 中国输出入银行图书阅览室, 中国商银证券 中国及银之间可夹任何长短字词. 【注:以上是比较常用的参数,当然具体的参数使用还是多看Solr官方的技术文档以及一些大神的博文日志,这里只是抛砖引玉】 二、 Solr运算符- “:” 指定字段查指定值,如返回所有值*:*
- “?” 表示单个任意字符的通配
- “*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)
- “~” 表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。
- 邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10
- “^” 控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache
- 布尔操作符AND、||
- 布尔操作符OR、&&
- 布尔操作符NOT、!、- (排除操作符不能单独与项使用构成查询) 10. “+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在 11. ( ) 用于构成子查询 12. [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710] 13. {} 不包含范围检索,如检索某时间段记录,不包含头尾 date:{200707 TO 200710} 14. / 转义操作符,特殊字符包括+ - && || ! ( ) { } [ ] ^ ” ~ * ? : /
10、命令式数据增量
至此所有DIH的配置完成,在浏览器中输入命令:10.1全导入:
http://localhost:3333/solr/my_core/dataimport?command=full-import&commit=ture10.2增量导入:
http://localhost:3333/solr/my_core/dataimport?command=delta-import&clean=false&commit=ture10.3查看导入状态
http://localhost:3333/solr/my_core/dataimport?command=status10.4、处理CLOB字段
<entity name=”meta” query=”select id,filename,content,bytes from documents” transformer=”ClobTransformer” <field column=”ID” name=”id” /> <field column=”CONTENT” name=”CONTENT” clob=”true” /> </entity> ClOB 字段的 column 必须大写!!10.5、DIH内存溢出错误
在使用DIH时,容易报内存溢出错误。可以通过设置jvm大小来解决。设置方法如下: 在tomcat\bin\startup.bat 加入SET JAVA_OPTS=-Xms128m -Xmx1024m 配置 这里设置的是1024M,根据情况可以适量增大。10.6、自动全导入和自动增量导入
此功能可以自己写程序实现,也可利用apache-solr-dataimportscheduler-1.0.jar包完成此功能。配置如下: 修改solr.war中WEB-INF/web.xml, 在servlet节点前面增加: <listener> <listener-class> org.apache.solr.handler.dataimport.scheduler.ApplicationListener </listener-class> </listener> 将apache-solr-dataimportscheduler-.jar 中 dataimport.properties 取出并根据实际情况修改,然后放到 solr.home/conf (不是solr.home/core/conf) 目录下面 IK分词器 以下内容为IK分词器配置11、solr6.2.0配置中文分词器IK Analyzer
不同于solr其他版本的IK分词器配置,从solr6以上因为JDK版本的升级等原因,IKAnalyzer2012FF_u1.jar版本已经不再适用,需要升级使用ik-analyzer-solr5-5.x.jar。11.1下载solr6.0专用的IK Analyzer的jar包和相应的配置文件。
11.2配置文件
解压上一个步骤所得到的压缩包,将ik-analyzer-solr5-5.x.jar这个jar包放入solr项目下的WEB-INF\lib目录中去,将IKAnalyzer.cfg.xml, stopword.dic放在solr项目下的WEB-INF\classes目录中去(没有就创建classes文件夹)。11.3修改managed-schema文件
修改/solr_home/collection1/conf/中的schema.xml中增加如下内容: <fieldType name="text_ik" class="solr.TextField"> <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/> <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType> 具体字段引用如下:(例如姓名需要使用分词器那么,将name字段的设置修改以下,如以下修改) 修改filed 使filed引用text_ik.这样才能使用IK分词器。 <field name="name" type="text_ik" indexed="true" stored="true"/>11.4:在solr应用中测试,示例如下图:
11.5修改solrconfig.xml文件
修改E:\solr\solr_home\collection1\conf\solrconfig.xml文件配置生成的索引文件路径,示例如下: <dataDir>${solr.data.dir:E:/solr/solr_home/data}</dataDir>12、solr+IK实现同义词设置
12.1、在solr_home\core1\conf\synonyms.txt文件中添加同义词。
=>指一对一,以逗号分隔的是组群,也就是多对多。 备注:做ik同义词分词时,打开.txt文件添加同义词后; 需要用ue另存为 无BOM 的 UTF-8 编码,否则启动tomcat报错java.nio.charset.MalformedInputException: Input length = 1。12.2在solr_home\core1\conf\managed-schema文件中配置同义词。
备注:,如果需要使用以逗号分隔的组群,建立多对多的关系,需要将上面的expand="true"设置为true。13、solr+ik实现自定义分词
13.1F:\kingdom\apache-tomcat-8.0.41\webapps\solr\WEB-INF\classes目录下的IKAnalyzer.cfg.xml配置文件,添加如下配置 ext.dic;
13.2新建ext.dic文件,在里面添加如下内容(注意:ext.dic的编码必须是Encode in UTF-8 without BOM,否则自定义的词库不会被识别)
13.3重启solr,在控制台core admin里reload一下,测试验证。
14、停止词设置
停止词:lucene的停止词是无功能意义的词,比如is 、a 、are 、”的”,“得”,“我” 等,这些词会在句子中多次出现却无意义,所以在分词的时候需要把这些词过滤掉。 扩展词库:就是不想让哪些词被分开,让他们分成一个词。 同义词:假设有一个电子商务系统,销售书籍,提供了一个搜索引擎,一天,市场部的人要求客户在搜索书籍时,同义词就是比如输入“电子”,除了展示电子相关的书籍,还需要展现“机器”相关的书籍。 以IK分词器为例子说明怎么配置。14.1:配置停止词和扩展词库。
将IKAnalyzer解压文件夹下的stopword.dic和IKAnalyzer.cfg.xml复制到tomcat/webapps/solr/WEB-INF/classes下,再新建一个ext.dic,里面的格式和stopword.dic一致。 并修改IKAnalyzer.cfg.xml如下面的格式可以配置多个停止词或者扩展词库文件。 <properties> <comment>IK Analyzer 扩展配置</comment> <!--用户可以在这里配置自己的扩展字典--> <entry key="ext_dict">ext.dic;</entry> <!--用户可以在这里配置自己的扩展停止词字典--> <entry key="ext_stopwords">english_stopword.dic;stopword.dic</entry> 这样就完成了。我在扩展词库ext.dic里面加上了 呼吸式酒精测试 测试扩展词库成功14.2.同义词配置。
为了让例子简单,我们假设索引库只有两个字段。 1.在solr数据文件conf目录下schema.xml 中加入以下两个字段: <field name="id" type="string" indexed="true" stored="true" required="true" /> <field name="description" type="text_syn" indexed="true" stored="true" /> 在 schema.xml 中增加 text_syn 类型的定义: <fieldType name="text_syn" class="solr.TextField"> <analyzer type="query"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="index"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false" /> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> 3.在相同的conf目录下的 synonyms.txt 中增加 machine => electronics 配置完成 备注:以上所有的配置都需要重新生成索引来测试。-
参考
查看原文:http://surenpi.com/2017/04/28/solr6-2-0%e5%8d%95%e5%87%bb%e7%89%88%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba/