solr6.2从环境部署到与mysql整合到中文分词器到solrJ的使用

来源:互联网 发布:最佳网络投资平台 编辑:程序博客网 时间:2024/05/20 13:18

solr就不多介绍了。是用于搜索功能的开源工具,很强大

 

一、solr环境部署

solr本身能够用jetty启动,但是还是用tomcat启动比较适合我自己。学习solr有两个星期了,到现在(2016.11.27)solr最新版已经是6.3.0了,不过没关系,基本的东西都是一样的。

1、solr官网: http://lucene.apache.org/solr/

下载后解压,是这样的目录结构:


2、solr当然可以直接按网上其他很多教程那样整合到tomcat中,但是本人更喜欢建一个新工程,这样更灵活。下面我们在eclipse中新建一个tomcat-solr的java web工程,不过这里要注意,要把这个工程的访问路径变成solr,不能是tomcat-solr,因为solr的管理页面中,solr的开发者把这个目录写死了,我们要把访问路径改成solr,也就是:http://localhost:8080/solr/index.html ,怎么改呢:

在eclipse中:



 

下面我们进行如下操作:

1)将solr-6.2.1\server\solr-webapp\webapp下的内容copy到我们web工程的webapp下

2)将solr-6.2.1\server\lib\ext下的jar包,copy到我们的tomcat-solr功能中

3)将solr-6.2.1\server\resources\log4j.properties文件copy到tomcat-solr功能的src中,

4)在tomcat-solr工程的webapp文件夹下,新建文件夹solrhome,将solr-6.2.1\server\solr下的文件夹以及文件copy到solrhome中,

5)修改web.xml文件,修改env-entry-value的值为solrhome的绝对位置,如:



 6)启动tomcat,访问http://localhost:8080/solr/index.html


到此,solr部署完毕。
我们的tomcat-solr功能应该长得如此帅:


 

对了,solr支持zookeeper搭建集群配置,在这里我们先注释掉,在solrhome文件夹下的solr.xml文件中,

 

Xml代码  收藏代码
  1. <solr>  
  2. <!-- 注解掉zookeeper搭建集群配置,采用master-slave的形式  
  3.   <solrcloud>  
  4.   
  5.     <str name="host">${host:}</str>  
  6.     <int name="hostPort">${jetty.port:8983}</int>  
  7.     <str name="hostContext">${hostContext:solr}</str>  
  8.   
  9.     <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>  
  10.   
  11.     <int name="zkClientTimeout">${zkClientTimeout:30000}</int>  
  12.     <int name="distribUpdateSoTimeout">${distribUpdateSoTimeout:600000}</int>  
  13.     <int name="distribUpdateConnTimeout">${distribUpdateConnTimeout:60000}</int>  
  14.     <str name="zkCredentialsProvider">${zkCredentialsProvider:org.apache.solr.common.cloud.DefaultZkCredentialsProvider}</str>  
  15.     <str name="zkACLProvider">${zkACLProvider:org.apache.solr.common.cloud.DefaultZkACLProvider}</str>  
  16.   
  17.   </solrcloud>  
  18.   
  19.   <shardHandlerFactory name="shardHandlerFactory"  
  20.     class="HttpShardHandlerFactory">  
  21.     <int name="socketTimeout">${socketTimeout:600000}</int>  
  22.     <int name="connTimeout">${connTimeout:60000}</int>  
  23.   </shardHandlerFactory>  
  24. -->  
  25. </solr>  

 

 

 

 二、core配置

solr的core非常重要,还有什么多core什么的,由于我也是刚刚学习,还没有搞明白,这里只是能够用最简单的,我们将在solrhome文件夹下,新建文件夹:my_solr,然后将solr-6.2.1\example\example-DIH\solr\solr下的文件以及文件夹copy到my_solr下,


 

访问刚才的地址:
 

三、整合mysql

1、首先我们在mysql中建个表作为练习,

 

Sql代码  收藏代码
  1. CREATE TABLE `solrTest` (  
  2.   `solrID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',  
  3.   `context` varchar(255) DEFAULT NULL COMMENT 'context',  
  4.   `updateTime` datetime DEFAULT NULL COMMENT 'updateTime',  
  5.   `sort` int(11) DEFAULT '1' COMMENT '排序',  
  6.   PRIMARY KEY (`solrID`)  
  7. DEFAULT CHARSET=utf8;  

 

2、将mysql的驱动jar包,copy到我们tomcat-solr功能中(lib文件夹下,这个们问题的吧),

3、修改my_solr文件夹下的conf文件夹下的solr-data-config.xml文件:

 

Xml代码  收藏代码
  1. <dataConfig>  
  2.   
  3.   <dataSource type="JdbcDataSource"   
  4.     driver="com.mysql.jdbc.Driver"   
  5.     url="jdbc:mysql://localhost:3306/test"   
  6.     user="root"   
  7.     password="123456"/>  
  8.       
  9.   <document name="solr_mysql_test">  
  10.     <entity name="solrTest"   
  11.         pk="solrID"   
  12.         query="select * from solrTest"   
  13.         deltaImportQuery="select * from solrTest where solrID = '${dih.delta.solrID}'"   
  14.         deltaQuery="select solrID from solrTest where updateTime > '${dataimporter.last_index_time}'"/>  
  15.               
  16.       <field column="solrID" name="solrID"/>    
  17.        <field column="context" name="context"/>    
  18.       <field column="updateTime" name="updateTime"/>   
  19.       <field column="sort" name="sort"/>   
  20.         
  21.   </document>  
  22. </dataConfig>  

 这里面的内容具体什么意思,网上有很多专门介绍的文章博客,这里就不多说了

 

4、修改conf文件夹下的managed-schema文件,在schema标签下添加field

 

Xml代码  收藏代码
  1. <field name="solrID" type="string" required="true" indexed="true" stored="true" multiValued="false"/>  
  2. <field name="context" type="string" indexed="true" stored="true" multiValued="false"/>  
  3. <field name="updateTime" type="date" indexed="true" stored="true" multiValued="false"/>  
  4. <field name="sort" type="int" indexed="true" stored="true" multiValued="false"/>  

 这里面name对应solr-data-config.xml中的name,要一直,否则solr就找不到字段了,

 

type是类型,indexed代表是否可用于检索,stored代表是否存储,multiValued代表是否有多个值,除此之外还有很多字段,读者可以移步度娘。

(另外说一下,我这里用的其实是schema.xml,而不是managed-schema文件,不过感觉都是一个样)

 

下面,看下我们的成就(别忘了mysql填点数据哦,否则啥也看不出来):

先刷新下solr数据:



 

然后查数据:



 

四、下面,我们看看中文分词器

solr本分提供了很多分词器(不过对中文的分词实在不能用,愤怒!!!),对了,那么什么是分词呢?比如“数据结构”这个词,没分词前,solr就按“数据结构”这个词查(有点像mysql的=),中文分词后,就按“数据”,“结构”这两个词查(有点像like),这样更符合我们的搜索习惯

有很多支持solr中文分词的jar包,比如我们用的IKAnalyzer中文分词器

我们首先导入IKAnalyzer的jar包,注意IKAnalyzer的jar包要与solr版本对应,否则会execption的,

然后在managed-schema文件的最后:

 

Xml代码  收藏代码
  1.    <!-- IKAnalyzer中文分词器.如果版本与solr对应不上,会报抽象方法错误 -->  
  2. <fieldType name="text_ik" class="solr.TextField">  
  3.     <!--索引时候的分词器-->  
  4.     <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>  
  5.     <!--查询时候的分词器-->  
  6.     <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>  
  7. </fieldType>  

 在然后,比如我们数据库表中的context字段要进行分词,那么修改field:

 

 

Java代码  收藏代码
  1. <field name="context" type="text_ik" indexed="true" stored="true" multiValued="false"/>  

 也就是修改type为分词器的name

 

 

这时我们在去solr查询一下,我们先填几条数据:



 去看看成果:



 五、solrJ是连接我们java工程和solr的工具jar包,很实用

简单的使用示例:

 

Java代码  收藏代码
  1. public class SolrQueryTest {  
  2.       
  3.     //solr 服务器地址    
  4.     public static final String solrServerUrl = "http://localhost:8080/solr";    
  5.       
  6.     //solrhome下的core    
  7.     public static final String solrCroeHome = "my_solr";    
  8.       
  9.     @SuppressWarnings({ "resource""deprecation" })  
  10.     public static void main(String[] args) {  
  11.         try {  
  12.             //SolrClient client = new HttpSolrClient(solrServerUrl + "/" + solrCroeHome);  
  13.             //QueryResponse resp = client.query(new SolrQuery("*:*"));  
  14.               
  15.             SolrClient client = new HttpSolrClient(solrServerUrl);  
  16.             QueryResponse resp = client.query(solrCroeHome, new SolrQuery("*:*"));  
  17.             List<TestBean> lists =  resp.getBeans(TestBean.class);  
  18.             System.out.println(lists);  
  19.         } catch (SolrServerException e) {  
  20.             e.printStackTrace();  
  21.         } catch (IOException e) {  
  22.             e.printStackTrace();  
  23.         }  
  24.     }  
  25. }  

 bean(注意要有solrJ的注解):

 

 

Java代码  收藏代码
  1. public class TestBean {  
  2.   
  3.     @Field("solrID")  
  4.     private String solrID;  
  5.       
  6.     @Field("context")  
  7.     private String context;  
  8.       
  9.     @Field("updateTime")  
  10.     private Date updateTime;  
  11.   
  12.     public String getSolrID() {  
  13.         return solrID;  
  14.     }  
  15.   
  16.     public void setSolrID(String solrID) {  
  17.         this.solrID = solrID;  
  18.     }  
  19.   
  20.     public String getContext() {  
  21.         return context;  
  22.     }  
  23.   
  24.     public void setContext(String context) {  
  25.         this.context = context;  
  26.     }  
  27.   
  28.     public Date getUpdateTime() {  
  29.         return updateTime;  
  30.     }  
  31.   
  32.     public void setUpdateTime(Date updateTime) {  
  33.         this.updateTime = updateTime;  
  34.     }  
  35.   
  36. }  

 solr在查询时,也有很多方法,能够设置查询的条件,比如分页、分片检索、结果的过滤条件、排序等,下面只是一个示例,我一个功能的代码片段:

 

 

Java代码  收藏代码
  1. /** 
  2.  * 设置查询信息 
  3.  */  
  4.        solrQuery.setQuery(this.getQueryFields(keyWord));    //设置基本查询  
  5.          
  6.        /** 
  7.         * 设置查询条件 
  8.         */  
  9.        solrQuery.setFilterQueries(this.getFielder(condition));  
  10.          
  11.        /** 
  12.         * 分页 
  13.         */  
  14.        solrQuery.setStart(pInteger);  
  15.        solrQuery.setRows(systemConfigureUtil.getSolrRow());  
  16.       
  17.        /** 
  18.         * 分片检索(分类检索)—— 
  19.         */  
  20.        solrQuery.setFacet(systemConfigureUtil.isFacet());  
  21.        solrQuery.add("facet.field", systemConfigureUtil.getFacetStr()); //可以按多个字段分类,用逗号分隔  
  22.   
  23.        /** 
  24.         * 设置过滤结果——能查询出那些字段 
  25.         */  
  26.        solrQuery.add("fl", systemConfigureUtil.getFilterFields());  
  27.          
  28.        /** 
  29.         * 排序,注意是有顺序的 
  30.         */  
  31.        solrQuery.setSort(this.getSort(0));  //setSort()会覆盖之前的查询条件  
  32.        solrQuery.addSort("sort", SolrQuery.ORDER.desc); //addSort()不会覆盖之前的查询条件  

 

 

到此,我学到的solr的东西也就这些了,还会继续学习的。

 

我搭建好的tomcat-solr功能在我的github中:https://github.com/hejiawang/tomcat-solr

solrJ的练习工程:https://github.com/hejiawang/search-web

文章来源:http://hejiawangjava.iteye.com/blog/2341372

0 0
原创粉丝点击