Solr单服务

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,修改如下

images在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

注释如下代码

images并且添加

<schemaFactory class="ClassicIndexSchemaFactory"/>

修改

images

images重启tomcat使中文分词生效

配置数据库

在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下,重启tomcatimages

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("删除成功");
}