Solr5.5 从搭建到使用

背景介绍

项目为一个物流地图系统,地图模块使用的是百度地图的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以及solrcore(mysolrhomemycore 名字可以任意指定)

    • 在指定的目录下新建文件夹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\
  • 部署到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管理功能介绍

  • 如图
    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/>
  • Query

    • 如图
      这里写图片描述

    • /select 指定了访问solr的哪个requestHandler(处理器配置见solr使用部分)

    • q 指定了查询语句 例 id:1id: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>
    • 使用中文分词域类型创建中文分词域

      <!--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,执行导入,和查看结果。

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值