Categories: 分布式
Solr是一个基于Lucene的Java搜索引擎服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
下载
官方地址:http://mirror.bit.edu.cn/apache/lucene/solr/
安装
每个solr服务都有一个自己的solrhome,在/usr/local/software下创建solrhome文件夹,里面存放solr节点相关信息
解压solr-5.5.5.tgz,将solr-5.5.5/server/solr下所有文件复制到solrhome
cp -rf /usr/local/software/solr-5.5.5/server/solr/* /usr/local/software/solrhome
可以使用以下方法中的一个进行部署
使用已有项目部署
solr工程需要部署到Tomcat中,可以使用solr.war,上传至Tomcat的webapp下,重启Tomcat完成部署。
注:如使用solr.war在Tomcat中解压后需要删除solr.war避免Tomcat重启时重新解压,覆盖已修改的配置
使用模板部署
可以使用/solr-5.5.5/server/solr-webapp/webapp里的模板,做如下修改
复制jar包
cp /user/local/software/solr-5.5.5/server/lib/ext/* /usr/local/software/solr-5.5.5/server/solr-webapp/webapp/WEB-INF/lib
cp /usr/local/software/solr-5.5.5/dist/solr-dataimporthandler-5.5.5.jar /usr/local/software/solr-5.5.5/server/solr-webapp/webapp/WEB-INF/lib
cp /usr/local/software/solr-5.5.5/dist/solr-dataimporthandler-extras-5.5.5.jar /usr/local/software/solr-5.5.5/server/solr-webapp/webapp/WEB-INF/lib
在solr-5.5.5/server/solr-webapp/webapp/WEB-INF下新建一个classes文件夹,复制log4j.properties
cp /usr/local/software/solr-5.5.5/server/resources/log4j.properties /usr/local/software/solr-5.5.5/server/solr-webapp/webapp/WEB-INF/classes
编辑solr-5.5.5/server/solr-webapp/webapp/WEB-INF下的web.xml,修改如下
在Tomcat的webapps下创建solr文件夹,复制solr-5.5.5/server/solr-webapp/webapp下所有内容到solr文件夹
创建solr core
在solrhome文件夹下创建new_core文件夹
将solrhome下的configsets/sample_techproducts_configs中的conf文件夹复制到new_core中
cp -r /usr/local/software/solrhome/configsets/sample_techproducts_configs/* /usr/local/software/solrhome/new_core
访问http://ip/solr/admin.html — Core Admin — Add Core — AddCore按钮
配置中文分词
将new_core/conf下的manage-schema重命名schema.xml,在末尾追加如下内容
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="long" indexed="true" stored="true"/>
<field name="item_city_id" type="long" indexed="true" stored="true"/>
<field name="item_city_name" type="string" indexed="true" stored="true" />
<field name="item_image" type="string" indexed="true" stored="true" />
<field name="item_content" type="text_ik" indexed="true" stored="false" />
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_city_name" dest="item_keywords"/>
<copyField source="item_content" dest="item_keywords"/>
将中文分词jar包(ik-analyzer-solr5-5.x.jar)上传至tomcat/webapps/solr/WEB-INF/lib下
编辑solrhome/new_core/conf/solrconfig.xml
注释如下代码
<schemaFactory class="ClassicIndexSchemaFactory"/>
修改
配置数据库
在solrhome/new_core/conf/solrconfig.xml中添加
<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
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/travel?characterEncoding=utf-8" user="root" password="root" batchSize="-1"/>
<document>
<entity name="hotel" query="select ID,TITLE,PRICE,IMAGE,CITY_NAME, CITY_ID from HOTEL" dataSource="JdbcDataSource">
<field column="ID" name="id" />
<field column="TITLE" name="item_title" />
<field column="PRICE" name="item_price" />
<field column="CONTENT" name="item_content" />
<field column="IMAGE" name="item_image" />
<field column="CITY_NAME" name="item_city_name" />
<field column="CITY_ID" name="item_city_id" />
</entity>
</document>
</dataConfig>
将mysql的jar包(mysql-connector-java-5.1.32.jar)上传到tomcat/webapps/solr/WEB-INF/lib下,重启tomcat
java使用role
jar
<!--solr-->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>5.5.5</version>
</dependency>
添加索引
@Test
public void testCreate() throws Exception {
//链接到solr的new_core核心文件
String url = "http://ip:8080/solr/new_core";
HttpSolrClient server = new HttpSolrClient(url);
//创建文档
SolrInputDocument doc = new SolrInputDocument();
//这个field是在solr core中配置过的
doc.addField("id", "1");
doc.addField("item_title", "程序猿的恋爱史");
doc.addField("item_content", "程序猿怎么会有女朋友");
doc.addField("item_price", 666);
server.add(doc);
server.commit();
server.close();
System.out.println("创建成功!");
}
查询索引
@Test
public void testQuery() throws Exception {
String url = "http://ip:8080/solr/new_core";
HttpSolrClient server = new HttpSolrClient(url);
//定义查询内容
SolrQuery query = new SolrQuery("item_title:程序猿"); //定义查询内容
query.setStart(0);//起始页
query.setRows(3);//每页显示数量
query.setSort("id", SolrQuery.ORDER.asc);//排序
query.setHighlight(true);//设置高亮
query.addHighlightField("item_title");//设置高亮字段
// 设置高亮的样式
query.setHighlightSimplePre("<font color='red'>");
query.setHighlightSimplePost("</font>");
QueryResponse rsp = server.query(query);
SolrDocumentList results = rsp.getResults();
System.out.println(results.getNumFound());//查询总条数
//取高亮,id是key
Map<String, Map<String, List<String>>> highLightings = rsp.getHighlighting();
for (SolrDocument doc : results) {
System.out.println(doc);
//获取当前对象的高亮
List<String> list = highLightings.get(doc.get("id")).get("item_title");
String itemTitle = null;
if (list != null && list.size() > 0) {
itemTitle = list.get(0);
} else {
itemTitle = (String) doc.get("item_title");
}
System.out.println(itemTitle);
System.out.println("------------------------------");
}
server.close();
}
删除索引
Test
public void testDelete() throws Exception {
String url = "http://ip:8080/solr/new_core";
HttpSolrClient server = new HttpSolrClient(url);
//删除所有分词,基于查询删除
//server.deleteByQuery("*:*");
//根据id删除所有分词
server.deleteById("1");
server.commit();
server.close();
System.out.println("删除成功");
}