背景介绍
项目为一个物流地图系统,地图模块使用的是百度地图的API,检索模块使用solr5来实现。以前接触过solr4,网上查了一下solr4 与 solr5差别还是比较大的,主要体现在搭建运行上。solr4与solr5的区别
环境介绍
- window10 64位
- JDK1.8 64位
- Tomcat 8 64位
- solr5.5.4
Tomcat下的solr安装部署
solr下载
官方地址Solrcore配置
- solrhome与solrcore说明
solrhome类似于Mysql服务,solrcore则相当于MySQL的一个数据库,一个MySQL可以管理多个数据库,类似的一个solrhome下可以拥有多个solrcore,且它们之间互不影响。 - solrhome与solrcore的目录结构
- solrhome
- 多个solrcore
- solr.xml(solr 默认配置文件,无特殊需要不用改动。)
- solrcore
- conf (索引库的关键配置,也是我们需要关注的)
- data (生成的索引文件)
- solrcore的说明配置(solrcore默认配置文件,无特殊需要不用改动。)
- solrhome
- solrhome与solrcore说明
创建solrhome以及solrcore(
mysolrhome
、mycore
名字可以任意指定)- 在指定的目录下新建文件夹solrhome:
D:\mysolrhome
- 将
solr-5.5.4\server\solr\solr.xml
拷贝至D:\mysolrhome
- 在solrhome下新建文件夹solrcore:
D:\mysolrhome\mycore
- 将
solr-5.5.4\server\solr\configsets\basic_configs\conf
完整目录拷贝至D:\mysolrhome\mycore\
下
- 在指定的目录下新建文件夹solrhome:
部署到Tomcat
- 将
solr-5.5.4\server\solr-webapp\webapp
完整目录复制到Apache Tomcat 8.0.27-solr\webapps
下并重命名为solr
Apache Tomcat 8.0.27-solr\webapps\solr\WEB-INF
下新建classes
文件夹- 将
solr-5.5.4/server/resource/log4j.properties
拷贝至上一步创建的classes
solr-5.5.4/server/lib/ext/
目录下的所有jar文件复制到Apache Tomcat 8.0.27-solr/webapp/solr/WEB-INF/lib/
中
- 将
- 配置solrcore
修改Apache Tomcat 8.0.27-solr\webapps\solr\WEB-INF\web.xml
新增<env-entry>
标签,将你的solrhome配置进去。
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>F:\mysolrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
- 启动tomcat
- 运行
Apache Tomcat 8.0.27-solr\bin\startup.bat
- 如果启动失败请检查上述步骤,并确保jdk版本位1.8。
- 如果一切正常的话你将会看到如下配置信息
- 运行
INFO (localhost-startStop-1) [ ] o.a.s.s.SolrDispatchFilter SolrDispatchFilter.init(): WebappClassLoader
context: solr
delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@13221655
38 INFO (localhost-startStop-1) [ ] o.a.s.c.SolrResourceLoader Using JNDI solr.home: E:\mysolrhome
40 INFO (localhost-startStop-1) [ ] o.a.s.c.SolrResourceLoader new SolrResourceLoader for directory: 'E:\mysolrhome'
42 INFO (localhost-startStop-1) [ ] o.a.s.c.SolrResourceLoader Using JNDI solr.home: E:\mysolrhome
101 INFO (localhost-startStop-1) [ ] o.a.s.c.SolrXmlConfig Loading container configuration from E:\mysolrhome\solr.xml
243 INFO (localhost-startStop-1) [ ] o.a.s.c.CorePropertiesLocator Config-defined core root directory: E:\mysolrhome
328 INFO (localhost-startStop-1) [ ] o.a.s.c.CoreContainer New CoreContainer 597908114
329 INFO (localhost-startStop-1) [ ] o.a.s.c.CoreContainer Loading cores into CoreContainer [instanceDir=E:\mysolrhome]
332 WARN (localhost-startStop-1) [ ] o.a.s.c.CoreContainer Couldn't add files from E:\mysolrhome\lib to classpath: E:\mysolrhome\lib
401 INFO (localhost-startStop-1) [ ] o.a.s.h.c.HttpShardHandlerFactory created with socketTimeout : 600000,connTimeout : 60000,maxConnectionsPerHost : 20,maxConnections : 10000,corePoolSize : 0,maximumPoolSize : 2147483647,maxThreadIdleTime : 5,sizeOfQueue : -1,fairnessPolicy : false,useRetries : false,connectionsEvictorSleepDelay : 5000,maxConnectionIdleTime : 40000,
960 INFO (localhost-startStop-1) [ ] o.a.s.u.UpdateShardHandler Creating UpdateShardHandler HTTP client with params: socketTimeout=600000&connTimeout=60000&retry=true
966 INFO (localhost-startStop-1) [ ] o.a.s.l.LogWatcher SLF4J impl is org.slf4j.impl.Log4jLoggerFactory
967 INFO (localhost-startStop-1) [ ] o.a.s.l.LogWatcher Registering Log Listener [Log4j (org.slf4j.impl.Log4jLoggerFactory)]
972 INFO (localhost-startStop-1) [ ] o.a.s.c.CoreContainer Security conf doesn't exist. Skipping setup for authorization module.
973 INFO (localhost-startStop-1) [ ] o.a.s.c.CoreContainer No authentication plugin used.
1063 INFO (localhost-startStop-1) [ ] o.a.s.c.CorePropertiesLocator Looking for core definitions underneath E:\mysolrhome
1086 INFO (localhost-startStop-1) [ ] o.a.s.c.CorePropertiesLocator Found 0 core definitions
1093 INFO (localhost-startStop-1) [ ] o.a.s.s.SolrDispatchFilter user.dir=E:\Apache Tomcat 8.0.27\bin
1093 INFO (localhost-startStop-1) [ ] o.a.s.s.SolrDispatchFilter SolrDispatchFilter.init() done
01-Mar-2017 20:13:04.712 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory E:\Apache Tomcat 8.0.27\webapps\solr has finished in 4,897 ms
01-Mar-2017 20:13:04.716 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
01-Mar-2017 20:13:04.725 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
01-Mar-2017 20:13:04.727 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 5858 ms
13589 INFO (http-nio-8080-exec-2) [ ] o.a.s.s.HttpSolrCall [admin] webapp=null path=/admin/cores params={indexInfo=false&wt=json&_=1488370397100} status=0 QTime=93
13939 INFO (http-nio-8080-exec-3) [ ] o.a.s.s.HttpSolrCall [admin] webapp=null path=/admin/info/system params={wt=json&_=1488370397245} status=0 QTime=294
17375 INFO (http-nio-8080-exec-5) [ ] o.a.s.s.HttpSolrCall [admin] webapp=null path=/admin/cores params={wt=json&_=1488370400968} status=0 QTime=2
访问solr管理界面
http://localhost:8080/solr/admin.html至此solr配置成功,但是此时solr中并没有关联到我们已经创建的solrcore:
mysolrhome\mysolrcore
,需要使用solr的管理页面建立关联。这将会在solr管理功能 部分进行介绍。
solr管理功能介绍
如图
Dashboard
- 仪表盘,显示了该Solr实例开始启动运行的时间、版本、系统资源、jvm等信息。
- Logging
- Solr运行日志信息
- Cloud
- Cloud即SolrCloud,即Solr云(集群),当使用Solr Cloud模式运行时会显示此菜单
Core Admin
- Solr Core的管理界面。在这里可以添加SolrCore实例。
- 如图
点击Addcore
添加成功后如下图
java properties
- Solr在JVM 运行环境中的属性信息,包括类路径、文件编码、jvm内存设置等信息。
- Tread Dump
- 显示Solr Server中当前活跃线程信息,同时也可以跟踪线程运行栈信息。
Core selector
- Analysis
通过此界面可以测试索引分析器和搜索分析器的执行情况。
注:solr中,分析器是绑定在域的类型中的。
dataimport
可以定义数据导入处理器,从关系数据库将数据导入到Solr索引库中。默认没有配置,需要手工配置。配置教程见solr使用部分的介绍。Document
通过/update表示更新索引,solr默认根据id(唯一约束)域来更新Document的内容,如果根据id值搜索不到id域则会执行添加操作,如果找到则更新。
通过此菜单可以创建索引、更新索引、删除索引等操作,界面如下:
- overwrite=”true” : solr在做索引的时候,如果文档已经存在,就用xml中的文档进行替换
- commitWithin=”1000” : solr 在做索引的时候,每个1000(1秒)毫秒,做一次文档提交。为了方便测试也可以在Document中立即提交,
</doc>
后添加<commit/>
- Analysis
Query
如图
/select
指定了访问solr的哪个requestHandler
(处理器配置见solr使用部分)q
指定了查询语句 例id:1
、id:1 AND name:myname AND price>5
等等类似语法的查询条件。详见Solr查询语法总结- 其他的在此不做赘述,Solr查询语法总结中总结的很好。
solr的基本使用
schema文件
它是Solr数据表配置文件,在此配置文件中定义了域以及域的类型还有其他一些配置,在solr中域必须先定义后使用。
solr4版本中该文件的名称为schema.xml,在solr5中改为了managed-schema
文件field域
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
- name 域的名称
- type 类型
- indexed 是否参与检索,设置为true时,就可以根据这个关键字来进行搜索。
- stored 是否存储,检索的结果可以理解为一组JSON对象,被存储的域对应为一个json中的一个属性。他可以不参与索引。
- required 是否必填
- multiValued 是否多值,比如存储一个用户的好友id(多个),商品的图片(多个,大图和小图)
fieldType
以中文分词器为例<fieldType name="text_ik" class="solr.TextField"> <analyzer type="index"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" /> </analyzer> <analyzer type="query"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" /> </analyzer> </fieldType>
- name:域类型的名称
- class:指定域类型的solr类型。
- analyzer:指定分词器。在FieldType定义的时候最重要的就是定义这个类型的数据在建立索引和进行查询的时候要使用的分析器analyzer,包括分词和过滤。
- type:index和query。Index是创建索引,query是查询索引。
- tokenizer:指定分词器
- filter:指定过滤器
uniqueKey
相当于主键,每个文档中必须有一个id域。<uniqueKey>id</uniqueKey>
copyField
可以将多个Field复制到一个Field中,以便进行统一的检索。当创建索引时,solr服务器会自动的将源域的内容复制到目标域中。
<copyField source="cat" dest="text"/>
- source:源域
- dest:目标域,搜索时,指定目标域为默认搜索域,可以提供查询效率。
- 注 定义复制域时,目标域必须要使用:multiValued=”true”
dynamicField
动态域
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
- Name:动态域的名称,是一个表达式,*匹配任意字符,只要域的名称和表达式的规则能够匹配就可以使用。
配置中文分词器
下载中文分词器 地址
- Configuration 配置在 schema 中
<fieldType name="text_ik" class="solr.TextField"> <analyzer type="index"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" /> </analyzer> <analyzer type="query"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" /> </analyzer> </fieldType>
- Configuration 配置在 schema 中
使用中文分词域类型创建中文分词域
<!--IKAnalyzer Field--> <field name="title_ik" type="text_ik" indexed="true" stored="true" /> <field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>
重启solr服务
配置业务域
- 根据自己项目需要进行配置,可参考数据库表结构,以及搜索需求。
配置dataimportHandler
- 添加导入的jar包 ,拷贝
solr-5.5.4\dist\solr-dataimporthandler-5.5.4.jar
到 Tomcat的webapps\solr\WEB-INF\lib
下 - 添加数据库jar包
配置
mysolrhome\mysolrcore\conf\solrconfig.xml
,添加一个requestHandler<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>
创建一个
data-config.xml
,放置在mysolrhome\mysolrcore\conf\
下<?xml version="1.0" encoding="UTF-8" ?> <dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://数据库IP:端口/数据库名" user="数据库用户名" password="密码"/> <document> <entity name="product" query="你的sql查询语句"> <field column="查询结果集中的列名" name="你的业务域名"/> </entity> </document> </dataConfig>
重启solr
点击
execute
,和refresh
,执行导入,和查看结果。
- 添加导入的jar包 ,拷贝