分享

solr进阶一:java代码添加索引和增加IKAnalyzer分词支持

 且看且珍惜 2014-12-05

观察solr的工作环境solr_tomcat\solr\collection1\,在这里面存在两个文件夹:confdata。其中conf里存放了对solr而言最为重要的两个配置文件schema.xmlsolrconfig.xml,前者是索引字段等的设置,后者是性能的设置。data文件夹则用于存放索引文件。

schema.xml主要包括typesfields和其他的一些缺省设置。

solrconfig.xml用来配置Solr的一些系统属性,例如与索引和查询处理有关的一些常见的配置选项,以及缓存、扩展等等。

上面的文档对这两个文件有比较详细的说明,非常容易上手。注意到schema.xml里有一个

<uniqueKey>id</uniqueKey>的配置,这里将id字段作为索引文档的唯一标识符,非常重要。

Solr提供了一个企业搜索引擎平台的核心,可以通过他的接口进行索引的创建、修改、删除。并提交关键字进行搜索。但如果要真正的投入使用,还是有不少工作需要做,如:

 

1、对向Solr提交索引进行一定的封装以方便业务系统进行操作

2、对搜索进行封装,以方便结果的展现分析等等。

 

Solrj是使用java编写的一个操作Solr的工具,方便于进行索引的更新、搜索结果的获取等等。

Solr的发布包里面有Solrj的相关jar包。Solrj需要的jar包为:

 

solr-4.10.2\dist目录下的solr-solrj-4.10.2.jar和它的依赖包solr-4.10.2\dist\solrj-lib,另外还需要commons-logging这个jar,否则运行会提示缺少这个jar包。

如果是使用maven,可以添加:

  1. <dependency>  
  2.  <groupId>org.apache.solr</groupId>  
  3.  <artifactId>solr-solrj</artifactId>  
  4.  <version>4.10.2</version>  
  5. </dependency>  

目录结构可以是这样:




使用Solrj更新索引

 

使用Solrj是首先我们实例化一个SolrServer,这里使用HttpSolrServer。我们再创建一个SolrInputDocument以方便来添加要索引的数据。这里的Field是在\solr\solr\collection1\conf\schema.xml里面定义的,如果没有在这里面定义的话就可以使用动态添加字段,以下的示例代码就是动态添加字段:

  1. import org.apache.solr.client.solrj.SolrServer;  
  2. import org.apache.solr.client.solrj.SolrServerException;  
  3. import org.apache.solr.client.solrj.impl.HttpSolrServer;  
  4. import org.apache.solr.common.SolrInputDocument;  
  5.   
  6. import java.io.IOException;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9.   
  10. /** 
  11.  * Created by Lhx on 14-12-3. 
  12.  */  
  13. public class AddField {  
  14.     public static void main(String[] args) {  
  15.         String url = "http://localhost:8080/solr";  
  16.         SolrServer server = new HttpSolrServer(url);  
  17.         SolrInputDocument doc1 = new SolrInputDocument();  
  18.   
  19.         doc1.addField("id","1");  
  20.         doc1.addField("title","广东某某科技");  
  21.         doc1.addField("cat","互联网科技公司,拥有大量高素质人才");  
  22.   
  23.         SolrInputDocument doc2 = new SolrInputDocument();  
  24.         doc2.addField("id","2");  
  25.         doc2.addField("title","广西某X工业园");  
  26.         doc2.addField("cat","工业园生成产品的喔!");  
  27.   
  28.         SolrInputDocument doc3 = new SolrInputDocument();  
  29.         doc3.addField("id","3");  
  30.         doc3.addField("title","lifeix");  
  31.         doc3.addField("cat","天气变冷了,要记得穿衣服");  
  32.   
  33.         List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();  
  34.         docs.add(doc1);  
  35.         docs.add(doc2);  
  36.         docs.add(doc3);  
  37.         try {  
  38.             server.add(docs);  
  39.             server.commit();  
  40.         } catch (SolrServerException e) {  
  41.             e.printStackTrace();  
  42.         } catch (IOException e) {  
  43.             e.printStackTrace();  
  44.         }  
  45.     }  
  46. }  

这里的ID值是string类型的,因为在solr_tomcat\solr\collection1\conf里面的schema.xml定义了:


运行后,添加了三个documentsolr的索引库里面,到solr主界面里面能看到:



数据存放在哪里都有提示了。

version : 每更新一个字段就加1

其余的看英文注释就可以大概知道什么意思了。

 

接着就是进行搜索了。

继续使用solrj搜索

搜索的第一步和上面一样,先取得一个SolrServer。然后创建一个SolrQuery进行搜索,搜索取得的数据已经封装在QueryResponse里面,通过相关API获取结果数据。示例代码如下:

  1. import org.apache.solr.client.solrj.SolrQuery;  
  2. import org.apache.solr.client.solrj.SolrServer;  
  3. import org.apache.solr.client.solrj.SolrServerException;  
  4. import org.apache.solr.client.solrj.impl.HttpSolrServer;  
  5. import org.apache.solr.client.solrj.response.QueryResponse;  
  6. import org.apache.solr.common.SolrDocument;  
  7. import org.apache.solr.common.SolrDocumentList;  
  8.   
  9. /** 
  10.  * Created by Lhx on 14-12-3. 
  11.  */  
  12. public class SolrjQuery {  
  13.     public static void main(String[] args) {  
  14.         String url = "http://localhost:8080/solr";  
  15.         SolrServer server = new HttpSolrServer(url);  
  16.         SolrQuery query = new SolrQuery("广东");  
  17.         try {  
  18.             QueryResponse response = server.query(query);  
  19.             SolrDocumentList docs = response.getResults();  
  20.             System.out.println("文档个数:" + docs.getNumFound());  
  21.             System.out.println("查询时间:" + response.getQTime());  
  22.             for (SolrDocument doc : docs) {  
  23.                 System.out.println("id" + doc.getFieldValue("id"));  
  24.                 System.out.println("name" + doc.getFieldValue("title"));  
  25.                 System.out.println("==================");  
  26.             }  
  27.         } catch (SolrServerException e) {  
  28.             e.printStackTrace();  
  29.         }  
  30.     }  
  31. }  

结果把“广西”也搜索出来了,可见结果不是很准确。




我们也可以在solr页面上进行搜索。

打开页面,选择“collection1


接着:


选择左边的“Query”,在“q”里面输入:titile:广西,点击“Execute Query”按钮就可以进行搜索了,结构显示在右边。绿色框是get请求的地址,在任意浏览器里面输入这一地址就可以返回json数据了。

到这里你想到了什么没?用solr做搜索简直太简单了!把需要的词汇存入,然后对接客户端的接口,一个搜索引擎就建成了,当然这其中还有很多优化工作做,不过至少我们有一个山寨搜索引擎了!


===============================================================================================================


为使搜索更准确些,我们现在加入中文分词器,要加入的中文分词器为ik-analyzer。

到网上随便搜一个,我下载的是2012版的。

压缩包里面的内容如下:


IK-Analyzer下载地址:

http://pan.baidu.com/s/1o6FRx0Y


IKAnalyzer2012.jar拷贝到tomcat目录下的solr项目中:

apache-tomcat-6.0.43\webapps\solr\WEB-INF\lib

IKAnalyzer.cfg.xmlstopword.dic拷贝到需要使用分词器的corecollection)的conf下面,和coreschema.xml文件一个目录:

solr_tomcat\solr\collection1\conf

修改coreschema.xml,在下面加一段如下配置:

  1. <fieldType name="text_ik" class="solr.TextField">     
  2.       <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>     
  3.  </fieldType>  

  1. <field name="name1" type="text_ik" indexed="true" stored="true" multiValued="false" />  

如下图:



网上的教程都写成了:

<field name="name" type="text_ik" indexed="true" stored="true" multiValued="false" />

当你启动tomcat的后,会报出以下错误:


根据英文提示,知道我们的name是重复定义的了,拉到配置文件的前面,能发现也有<field name="name" ……………………>所以这个name的值要改变一下,不能和前面定义的重复就可以了。

重启tomcat,刷新一下solr页面,在左侧点击下拉列表,点击“collection1”,就会展示这个core的功能列表出来,选择“Analysis”,接着在右边中间的下拉选择“name1”,也就是我们定义的字段。


——————————————————————


——————————————————————————————————


——————————————————————————————

输入一条中文语句就能分析了:

Tomcat里面的提示:



后记:

 

跟着我做,你会在刷新solr页面那里发现这样的提示:









core完全不能用,tomcat里面的提示也只是找不到某某类而已。我也找了很多资料,可是都不能解释为什么这样!最后我还是按大多数教程换成了IK Analyzer 2012FF_hf1,把里面的那三个文件一次替代了。就不会出现这样的问题了!

 

郑重提示:一定要使用: IK Analyzer 2012FF_hf1



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多