介绍

solr6.2.0单击版环境搭建   Solr6.2.0学习流程 搭建solr单击版环境 以下内容为单机版tomcat+solr操作

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,cvsfl表示索引显示那些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=truehl.fl 高亮field ,hl.fl=Name,SKUhl.snippets :默认是1,这里设置为3个片段

hl.simple.pre 高亮前面的格式

hl.simple.post 高亮后面的格式

facet 是否启动统计

facet.field  统计field

  排除查询 在要排除的词前加上 “-” (不包含”号) 号 例如: 总统府 -邮局 搜寻结果不会有包含邮局的词的结果在内 增加权重: 如要搜寻 “中华 加油站”(不包含”号) 但因为回传太多笔资料内有 “中华”(不包含”号) 或 “加油站”(不包含”号) 的结果, 所以想要把有包含 “加油站”(不包含”号)的数据往前排,可使用 “^”(不包含”号)符号在后面加上愈增加的权重数, 像是 “2″,则可以这样做:中华 加油站^2 会同时搜寻含有中华或加油站的结果,并把加油站这个词加权所以搜寻时会先判断加油站这一个词在 搜寻结果中的比重,甚至假设一笔数据内加油站出现过两次以上的就更加会有优先权. 查询时在查询词后加上 “^” (不包含”号) 再加上权重分数 例如: 总统府 AND “邮局”^2 或 总统府^2 OR 邮局 Wildcard 搜寻使用 “*” 符号; 如果输入 “中国*银” (不包含”号), 结果会有中国信托商业银行, 中国输出入银行图书阅览室, 中国商银证券 中国及银之间可夹任何长短字词.

【注:以上是比较常用的参数,当然具体的参数使用还是多看Solr官方的技术文档以及一些大神的博文日志,这里只是抛砖引玉】

 

二、 Solr运算符


  1. “:” 指定字段查指定值,如返回所有值*:*
  2. “?” 表示单个任意字符的通配
  3. “*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)
  4. “~” 表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。
  5. 邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10
  6. “^” 控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache
  7. 布尔操作符AND、||
  8. 布尔操作符OR、&&
  9. 布尔操作符NOT、!、- (排除操作符不能单独与项使用构成查询) 10. “+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在 11. ( ) 用于构成子查询 12. [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710] 13. {} 不包含范围检索,如检索某时间段记录,不包含头尾 date:{200707 TO 200710} 14. / 转义操作符,特殊字符包括+ - && || ! ( ) { } [ ] ^ ” ~ * ? : /

注:①“+”和”-“表示对单个查询单元的修饰,and 、or 、 not 是对两个查询单元是否做交集或者做差集还是取反的操作的符号

比如:AB:china +AB:america ,表示的是AB:china忽略不计可有可无,必须满足第二个条件才是对的,而不是你所认为的必须满足这两个搜索条件

如果输入:AB:china AND AB:america ,解析出来的结果是两个条件同时满足,即+AB:china AND +AB:america或+AB:china +AB:america

总而言之,查询语法:  修饰符 字段名:查询关键词 AND/OR/NOT 修饰符 字段名:查询关键词

三、 Solr查询语法1.最普通的查询,比如查询姓张的人(Name:张),如果是精准性搜索相当于SQL SERVER中的LIKE搜索这需要带引号(""),比如查询含有北京的(Address:"北京")

2.多条件查询,注:如果是针对单个字段进行搜索的可以用(Name:搜索条件加运算符(OR、AND、NOT) Name:搜索条件),比如模糊查询(Name:张 OR Name:李)单个字段多条件搜索不建议这样写,一般建议是在单个字段里进行条件筛选,如( Name:张 OR 李),多个字段查询(Name:张 + Address:北京

3.排序,比如根据姓名升序(Name asc),降序(Name desc

  

命令式数据增量 以下内容为命令式操作增量

10、命令式数据增量

至此所有DIH的配置完成,在浏览器中输入命令:

10.1全导入:

​ http://localhost:3333/solr/my_core/dataimport?command=full-import&commit=ture ​

10.2增量导入:

​ http://localhost:3333/solr/my_core/dataimport?command=delta-import&clean=false&commit=ture ​

10.3查看导入状态

​ http://localhost:3333/solr/my_core/dataimport?command=status ​

10.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

配置完成

备注:以上所有的配置都需要重新生成索引来测试。 

 

参考

本文为原创