solr的安装(windows)和使用

…衆ロ難τιáo~ 提交于 2020-10-30 07:47:32

介绍

  • Solr是一个基于Lucene的Java搜索引擎服务器。Solr 提供了层面搜索、命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。它易于安装和配置,而且附带了一个基于 HTTP 的管理界面。Solr已经在众多大型的网站中使用,较为成熟和稳定。Solr 包装并扩展了 Lucene,所以Solr的基本上沿用了Lucene的相关术语。更重要的是,Solr 创建的索引与

  • Lucene 搜索引擎库完全兼容。通过对 Solr 进行适当的配置,某些情况下可能需要进行编码,

  • Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此外,很多 Lucene 工具(如 Nutch、 Luke)也可以使用Solr 创建的索引。 总结一下:solr是一个java搜索引擎服务器(是一套war程序),内部集成了Lucene(apache提供的一些对搜索引擎做支持的jar包)。

Solr服务搭建

  • 官网下载solr4.9.1的程序安装包。 下载地址:http://archive.apache.org/dist/lucene/solr/
  • 解压solr的zip包
  • 将dist\solr-4.9.1.war文件复制到tomcat的webapps目录下,并将文件命名为solr.war
  • 复制solr解压包下example\lib\ext 下所有的jar 到tomcat 的lib目录下
  • 在计算机本地新建一个文件夹solr_home(当然你可以随便起名字), 然后复制solr-4.9.1\example\solr 下的所有文件到 solr_home下
  • 启动tomcat,待tomcat启动成功后,关闭tomcat。打开tomcat的webapps目录。注意,此时solr的war包以及被解压成solr文件夹。删除tomcat 的webapps目录下的solr的war包,保留solr文件夹。
  • 修改配置文件apache-tomcat-7.0.67\webapps\solr\WEB-INF\web.xml
env-entry>
	<env-entry-name>solr/home</env-entry-name> 
	<env-entry-value> D:/solr_home</env-entry-value>
	<env-entry-type>java.lang.String</env-entry-type>
</env-entry>

新建数据配置 core

  • 新建core(solr中把配置的每一个模块都叫core),在solr_home目录下,拷贝collection1文件夹,并起名为test。打开test文件夹,修改core.properties文件,将name修改为test
  • 重新启动tomcat,并访问solr,如出现以下界面,则表示新建testcore成功。
  • 重新启动tomcat,并访问solr,如出现以下界面,则表示新建testcore成功。

新增数据库配置

  • 拷贝数据库连接jar包(mysql-connector-java-5.1.18.jar)到tomcat的lib目录
  • 以创建testcore的方式新建hotel core
  • 打开hotel的conf文件夹中的solrconfig.xml文件,在requestHandlername="/select" class="solr.SearchHandler">前面上加上一个dataimport的处理的Handler
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
      <str name="config">data-config.xml</str>
</lst>
</requestHandler>
  • 在hotel的的conf文件夹下并新建data-config.xml文件,配置如下
?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
	<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/itripdb" user="root" password="root" /> 			<document name="hotel_doc">
	<entity name="hotel" pk="id"  query=" select id,hotelName,address from itrip_hotel">
	<field column="id" name="id"/>
	<field column="hotelName" name="hotelName"/>
	<field column="address" name="address"/>
	</entity>
	</document>
</dataConfig>
dataSource是数据库数据源。
Entity就是一张表对应的实体,pk是主键,query是查询语句。
Field对应一个字段,column是数据库里的column名,后面的name属性对应着Solr的Filed 的名字。
  • 打开hotel的conf目录下的schema.xml文件
    • 保留_version_ 这个field,添加索引字段:这里每个field的name要和data-config.xml里的entity的field的name一样,一一对应。

<?xml version="1.0" encoding="UTF-8"?>

<dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/itripdb" user="root" password="root" /> <document name="hotel_doc"> <entity name="hotel" pk="id" query=" select id,hotelName,address from itrip_hotel"> <field column="id" name="id"/> <field column="hotelName" name=" hotelName"/> <field column="address" name=" address"/> </entity> </document> </dataConfig> ```

  • 修改同目录下的schema.xml(schema.xml 是solr对数据库里的数据进行索引管理和数据字段展示管理的配置文件)
删除多余的field,保留_version_ 和test这两个field(注意不要删除fieldType)
添加索引字段:这里每个field的name要和data-config.xml里的entity的field的name一样,一 一 对应。红色加粗部分为新增内容。
<fieldname="_version_" type="long" indexed="true"stored="true"/>
<field name="id"type="string" indexed="true" stored="true"/>
<fieldname="hotelName" type="string" indexed="true"stored="true"/>
<fieldname="address" type="string" indexed="true"stored="true"/>
<uniqueKey>id</uniqueKey>
<field name="text" type="text_general"indexed="true" stored="false"multiValued="true"/>
  • 将导入数据的JAR包拷贝到webapps/solr的lib目录下
  • 启动Tomcat,执行数据导入。
  • 查询数据

配置增量更新

  • 将资料中提供的apache-solr-dataimports-cheduler.jar包添加至solr的lib目录下 注:apachesolrdataimportscheduler.jar的jar包是apache提供的用于增量更新的jar包,但 apache提供的原jar包中,代码有BUG。该bug在教学资料提供的jar包中已经被修复,具体可参 考提供的apachesolrdataimportscheduler的源码,在此不再赘述。
  • 将资料中提供的apache-solr-dataimports-cheduler.jar包添加至solr的lib目录下。
  • 增加增量更新配置文件,在solr_home文件夹下新建conf文件夹,并新建名为 dataimport.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 syncCores=test,hotel
#  solr server name or IP address #  [defaults to localhost if empty] server=localhost
#  solr server port
#  [defaults to 80 if empty] port=8080
#  application name/context
#  [defaults to current ServletContextListener's context (app) name] webapp=solr
#  增量索引的参数
#  URL params [mandatory] #  remainder of URL params=/dataimport?command=delta-import&clean=false&commit=true
#  重做增量索引的时间间隔
#  schedule interval
#  number of minutes between two runs
#  [defaults to 30 if empty] interval=1
#  重做全量索引的时间间隔,单位分钟,默认7200,即5天;
#  为空,为0,或者注释掉:表示永不重做索引
#reBuildIndexInterval=7200
#  重做索引的参数
reBuildIndexParams=/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的web.xml中加入以下监听器
<listener>
<listener-class> org.apache.solr.handler.dataimport.scheduler.ApplicationListener </listener-class>  
</listener>
  • 修改导入数据查询SQL
<?xml version="1.0"encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource"driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/itripdb"user="root" password="root" />
<document name="hotel_doc">
         <entity name="hotel" pk="id"  query="select id,hotelName,address fromitrip_hotel"           deltaImportQuery="selectid,hotelName,address from itrip_hotel where id
='${dih.delta.id}'"
             deltaQuery="SELECT id as id FROM itrip_hotel  where modifyDate>
'${dih.last_index_time}'"> 
                 <field column="id"name="id"/>
                 <field column="hotelName"name="hotelName"/>
                 <field column="address"name="address"/>
         </entity>
</document>
</dataConfig>
deltaQuery是根据dataimport.properties配置文件中的更新时间,从数据库中查询出,修
改日期在最后一次更新日期之后的酒店数据,并记录其id,而deltaImportQuery的目的是将 deltaQuery查询出的数据导入到solr中。 6. 启动Tomcat进行测试
启动Tomcat,访问hotel模块
修改数据库中的酒店数据并同时修改该数据的modifyDate时间,
1分钟后查询酒店数据,确定数据是否更新

配置分词器

分词器: 是从用户输入的一段文本中提取关键词,用于其它业务操作。
常见的 JAVA分词器: word 分词器、Ansj 分词器、Stanford 分词器、IKAnalyzer 分词器
课程选用分词器:IKAnalyzer分词器
solr如果是 3.x 版本的用 IKAnalyzer2012_u6.zip 如果是 4.x 版本的用 IK Analyzer
2012FF_hf1.zip,一定要对应上,要不然会配置失败。
IK 分词器下载地址:http://download.csdn.net/download/tjcyjd/8420639
  • 首先,下载IKAnalyzer。
  • 将ik的所有jar文件 拷贝到 webapps\solr\WEB-INF\lib 目录下
  • 在webapps\solr\WEB-INF\下新建classes文件夹,将IKAnalyzer.cfg.xml和stopword.dic 文件拷贝到改文件夹下。
  • 在solr_home\hotel\conf\schema.xml 增加如下配置
<fieldType name="text_ik" class="solr.TextField">
<analyzer       type="index"
class="org.wltea.analyzer.lucene.IKAnalyzer"/>
isMaxWordLength="false"
    <analyzer       type="query"
class="org.wltea.analyzer.lucene.IKAnalyzer"/>   
</fieldType>
isMaxWordLength="true"
  • 修改solr_home\hotel\conf\schema.xml将hotelName和address指定成为text_ik类型
<field name="hotelName" type="text_ik"indexed="true" stored="true"/>
<field name="address" type="text_ik"indexed="true" stored="true"/>
  • 重启Tomcat,访问solr测试分词器
  • 如果分词器出现上边的显示结果,则表示分词器配置成功。

solr基本语法

  • q – 查询字符串。
  • fl – 指定返回那些字段内容,用逗号或空格分隔多个。
  • start – 返回第一条记录在完整找到结果中的偏移位置,0 开始,一般分页用。
  • rows – 指定返回结果最多有多少条记录,配合 start 来实现分页。
  • sort – 排序,格式:sort=<field name>+<desc|asc>[,<fieldname>+<desc|asc>]„ 。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降序。
  • wt – (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3 增加的,要用通知我们,因为默认没有打开。
  • fq – (filterquery)过虑查询,作用:在 q 查询符合结果中同时是 fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字 mm,并且 date_time 是 1.5.3 solr 多字段匹配针对关键词多字段的搜索,solr中提供了相应的检索机制。
多字段匹配针对关键词多字段的搜索,solr中提供了相应的检索机制。
  • 在hotel/conf/schema.xml文件中新增filed字段存储多字段的值(红色内容为新增部分)
field name="_version_" type="long"indexed="true" stored="true"/>
<field name="id" type="long"indexed="true" stored="true"/>
<field name="hotelName" type="text_ik"indexed="true" stored="true"/>
<field name="address" type="text_ik"indexed="true" stored="true"/>
<field name="keyword" type="text_ik"indexed="true" stored="true"multiValued="true"/>
<copyField source="hotelName"dest="keyword"/>
<copyField source="address"  dest="keyword"/>  
  • 重新执行数据导入,并查询,出现以下结果则多字段配置正确。
  • 关键词搜索,查看查询结果是否正确

SpringData Solr 使用

  • 按主键查询
 	@Test	 
 	public void testFindOne(){ 
 	 	TbItem item = solrTemplate.getById(1, TbItem.class); 
 	 	System.out.println(item.getTitle()); 
 	} 
  • 按主键删除
@Test 
 	public void testDelete(){ 
 	 	solrTemplate.deleteById("1"); 
}
  • 分页
 	@Test 
 	public void testAddList(){ 
 	 	List<TbItem> list=new ArrayList(); 
 	 	 
 	 	for(int i=0;i<100;i++){  	 	 	TbItem item=new TbItem(); 
 	 	 	item.setId(i+1L); 
 	 	 	item.setBrand("华为"); 
 	 	 	item.setCategory("手机"); 
 	 	 	item.setGoodsId(1L); 
 	item.setSeller("华为2号专卖店"); 
item.setTitle("华为Mate"+i); 
item.setPrice(new BigDecimal(2000+i));  
list.add(item); 
 	 
 	 
 	 	}  
solr	Template.saveBeans(list); 
 	 
 	} 	solrTemplate.commit(); 
  • 条件查询
@Test 
 	public void testPageQueryMutil(){  
 	 	Query query=new SimpleQuery("*:*"); 
 	 	Criteria criteria=new Criteria("item_title").contains("2"); 
 	 	criteria=criteria.and("item_title").contains("5");  	 
 	 	query.addCriteria(criteria); 
 	 	//query.setOffset(20);//开始索引(默认0) 
 	 	//query.setRows(20);//每页记录数(默认10) 
 	 	ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class); 
list
 	 	System.out.println("总记录数:"+page.getTotalElements());  	 	List<TbItem> 	 = page.getContent(); 
list
 	 	showList(	); 
 	} 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!