solr进阶一:java代码添加索引和增加IKAnalyzer分词支持
2014-12-03 15:27
330 查看
观察solr的工作环境solr_tomcat\solr\collection1\,在这里面存在两个文件夹:conf和data。其中conf里存放了对solr而言最为重要的两个配置文件schema.xml和solrconfig.xml,前者是索引字段等的设置,后者是性能的设置。data文件夹则用于存放索引文件。
schema.xml主要包括types、fields和其他的一些缺省设置。
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,可以添加:
目录结构可以是这样:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/59ae760da6ed296571c5f995043f73b6)
使用Solrj更新索引
使用Solrj是首先我们实例化一个SolrServer,这里使用HttpSolrServer。我们再创建一个SolrInputDocument以方便来添加要索引的数据。这里的Field是在\solr\solr\collection1\conf\schema.xml里面定义的,如果没有在这里面定义的话就可以使用动态添加字段,以下的示例代码就是动态添加字段:
这里的ID值是string类型的,因为在solr_tomcat\solr\collection1\conf里面的schema.xml定义了:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/2bbdc611a7f145eb85ba770453cba915)
运行后,添加了三个document到solr的索引库里面,到solr主界面里面能看到:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/e4ef052b86d5fdc9ca086c1ee72a9088)
数据存放在哪里都有提示了。
version : 每更新一个字段就加1;
其余的看英文注释就可以大概知道什么意思了。
接着就是进行搜索了。
继续使用solrj搜索
搜索的第一步和上面一样,先取得一个SolrServer。然后创建一个SolrQuery进行搜索,搜索取得的数据已经封装在QueryResponse里面,通过相关API获取结果数据。示例代码如下:
结果把“广西”也搜索出来了,可见结果不是很准确。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/991228f1d153b5e8a30231b1c5d87a1a)
我们也可以在solr页面上进行搜索。
打开页面,选择“collection1”
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/cbfb081316551f3adf6b329b7f578c93)
接着:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/cfd56028ea67f5f26477e7d0663ed05c)
选择左边的“Query”,在“q”里面输入:titile:广西,点击“Execute Query”按钮就可以进行搜索了,结构显示在右边。绿色框是get请求的地址,在任意浏览器里面输入这一地址就可以返回json数据了。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/f0d383e235152eab4c30dbe7bce260bd)
到这里你想到了什么没?用solr做搜索简直太简单了!把需要的词汇存入,然后对接客户端的接口,一个搜索引擎就建成了,当然这其中还有很多优化工作做,不过至少我们有一个山寨搜索引擎了!
===============================================================================================================
为使搜索更准确些,我们现在加入中文分词器,要加入的中文分词器为ik-analyzer。
到网上随便搜一个,我下载的是2012版的。
压缩包里面的内容如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/1e3598eeafcd0aa794088e1eed5dcaa3)
IK-Analyzer下载地址:
http://pan.baidu.com/s/1o6FRx0Y
把IKAnalyzer2012.jar拷贝到tomcat目录下的solr项目中:
apache-tomcat-6.0.43\webapps\solr\WEB-INF\lib
把IKAnalyzer.cfg.xml、stopword.dic拷贝到需要使用分词器的core(collection)的conf下面,和core的schema.xml文件一个目录:
solr_tomcat\solr\collection1\conf
修改core的schema.xml,在下面加一段如下配置:
和
如下图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/92192b8b41841ae7e14a0beea5260805)
网上的教程都写成了:
<field name="name" type="text_ik" indexed="true" stored="true" multiValued="false" />
当你启动tomcat的后,会报出以下错误:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/e57e2bde230cfef502ea05922ebd4463)
根据英文提示,知道我们的name是重复定义的了,拉到配置文件的前面,能发现也有<field name="name" ……………………>所以这个name的值要改变一下,不能和前面定义的重复就可以了。
重启tomcat,刷新一下solr页面,在左侧点击下拉列表,点击“collection1”,就会展示这个core的功能列表出来,选择“Analysis”,接着在右边中间的下拉选择“name1”,也就是我们定义的字段。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/c74ff39014244a7d950cf3d509f67c62)
——————————————————————
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/3e4582716d8af76295a7251e1986e995)
——————————————————————————————————
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/fe74b63ee179b0b45678172d707594ee)
——————————————————————————————
输入一条中文语句就能分析了:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/4dbda14097f0338050ec16d219fa34aa)
Tomcat里面的提示:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/42673a210682c179c506e42875b1c5ad)
现在我们回到前面的问题,当输入“广东”的时候,连“广西”的信息也查询出来了,到schema.xml文件里面,发现“title”这个字段默认的类型是:text_general。
整条语句是这样的:
在界面的Analysis分析句子功能中,输入“广东”两个字,会发现这个词被分开了,其实输入什么汉字,都是会分成一个个汉字的。此时,我们就要用到刚刚配置好的分词工具了。把配置语句改为:
重启Tomcat,在Analysis分析里面,会发现“广东”这个词不会分开了,“广西”这个词也不会分开了。这样就为我们的精确搜索打下了基础。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/165c99433f188de68ae5c06f9cd25fe5)
来到“Query”界面,输入:title:广东,发现居然没有搜索到信息!仔细一看:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/04eb8b707730a2a98c511aed2840ef76)
原来title是数组数据了,回到schema.xml文件,还是修改那段话,修改为:
multiValued为false,重启Tomcat,重新导入数据,发现数据是单值的了:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/18b9acbfe3d8f9f62472712af95477d9)
搜索,做到了精确搜索:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/4383b452613f72e4cfbb2a7521cc4eac)
在原来的代码里面,改这行代码:
运行:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/77868b5d21302ab33f774f90c4bc2804)
没有“广西”的结果出来了!
===============================
后记:
跟着我做,你会在刷新solr页面那里发现这样的提示:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201412/03/17df6a6351ef2763aecb6059c6d64951)
core完全不能用,tomcat里面的提示也只是找不到某某类而已。我也找了很多资料,可是都不能解释为什么这样!最后我还是按大多数教程换成了IK Analyzer 2012FF_hf1,把里面的那三个文件一次替代了。就不会出现这样的问题了!
郑重提示:一定要使用:
IK Analyzer 2012FF_hf1
schema.xml主要包括types、fields和其他的一些缺省设置。
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,可以添加:
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>4.10.2</version> </dependency>
目录结构可以是这样:
使用Solrj更新索引
使用Solrj是首先我们实例化一个SolrServer,这里使用HttpSolrServer。我们再创建一个SolrInputDocument以方便来添加要索引的数据。这里的Field是在\solr\solr\collection1\conf\schema.xml里面定义的,如果没有在这里面定义的话就可以使用动态添加字段,以下的示例代码就是动态添加字段:
import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.common.SolrInputDocument; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * Created by Lhx on 14-12-3. */ public class AddField { public static void main(String[] args) { String url = "http://localhost:8080/solr"; SolrServer server = new HttpSolrServer(url); SolrInputDocument doc1 = new SolrInputDocument(); doc1.addField("id","1"); doc1.addField("title","广东某某科技"); doc1.addField("cat","互联网科技公司,拥有大量高素质人才"); SolrInputDocument doc2 = new SolrInputDocument(); doc2.addField("id","2"); doc2.addField("title","广西某X工业园"); doc2.addField("cat","工业园生成产品的喔!"); SolrInputDocument doc3 = new SolrInputDocument(); doc3.addField("id","3"); doc3.addField("title","lifeix"); doc3.addField("cat","天气变冷了,要记得穿衣服"); List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>(); docs.add(doc1); docs.add(doc2); docs.add(doc3); try { server.add(docs); server.commit(); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
这里的ID值是string类型的,因为在solr_tomcat\solr\collection1\conf里面的schema.xml定义了:
运行后,添加了三个document到solr的索引库里面,到solr主界面里面能看到:
数据存放在哪里都有提示了。
version : 每更新一个字段就加1;
其余的看英文注释就可以大概知道什么意思了。
接着就是进行搜索了。
继续使用solrj搜索
搜索的第一步和上面一样,先取得一个SolrServer。然后创建一个SolrQuery进行搜索,搜索取得的数据已经封装在QueryResponse里面,通过相关API获取结果数据。示例代码如下:
import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; /** * Created by Lhx on 14-12-3. */ public class SolrjQuery { public static void main(String[] args) { String url = "http://localhost:8080/solr"; SolrServer server = new HttpSolrServer(url); SolrQuery query = new SolrQuery("广东"); try { QueryResponse response = server.query(query); SolrDocumentList docs = response.getResults(); System.out.println("文档个数:" + docs.getNumFound()); System.out.println("查询时间:" + response.getQTime()); for (SolrDocument doc : docs) { System.out.println("id" + doc.getFieldValue("id")); System.out.println("name" + doc.getFieldValue("title")); System.out.println("=================="); } } catch (SolrServerException e) { e.printStackTrace(); } } }
结果把“广西”也搜索出来了,可见结果不是很准确。
我们也可以在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.xml、stopword.dic拷贝到需要使用分词器的core(collection)的conf下面,和core的schema.xml文件一个目录:
solr_tomcat\solr\collection1\conf
修改core的schema.xml,在下面加一段如下配置:
<fieldType name="text_ik" class="solr.TextField"> <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> </fieldType>
和
<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里面的提示:
现在我们回到前面的问题,当输入“广东”的时候,连“广西”的信息也查询出来了,到schema.xml文件里面,发现“title”这个字段默认的类型是:text_general。
整条语句是这样的:
<field name="title" type="text_general" indexed="true" stored="true" multiValued="true"/>
在界面的Analysis分析句子功能中,输入“广东”两个字,会发现这个词被分开了,其实输入什么汉字,都是会分成一个个汉字的。此时,我们就要用到刚刚配置好的分词工具了。把配置语句改为:
<field name="title" type="text_ik" indexed="true" stored="true" multiValued="true"/>
重启Tomcat,在Analysis分析里面,会发现“广东”这个词不会分开了,“广西”这个词也不会分开了。这样就为我们的精确搜索打下了基础。
来到“Query”界面,输入:title:广东,发现居然没有搜索到信息!仔细一看:
原来title是数组数据了,回到schema.xml文件,还是修改那段话,修改为:
<field name="title" type="text_ik" indexed="true" stored="true" multiValued="false"/>
multiValued为false,重启Tomcat,重新导入数据,发现数据是单值的了:
搜索,做到了精确搜索:
在原来的代码里面,改这行代码:
SolrQuery query = new SolrQuery("title:广东");
运行:
没有“广西”的结果出来了!
===============================
后记:
跟着我做,你会在刷新solr页面那里发现这样的提示:
core完全不能用,tomcat里面的提示也只是找不到某某类而已。我也找了很多资料,可是都不能解释为什么这样!最后我还是按大多数教程换成了IK Analyzer 2012FF_hf1,把里面的那三个文件一次替代了。就不会出现这样的问题了!
郑重提示:一定要使用:
IK Analyzer 2012FF_hf1
相关文章推荐
- 一个自己用的代码备份工具,支持delphi,android,java,可以自己添加配置,灵活支持大部分编程语言
- 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
- IKAnalyzer 扩展词典(强制分词)【solr里添加扩展词典,扩展词典的格式必须是 utf-8 的无BOM格式编码。jav开发中 IKAnalyzer.cfg.xml必须在类路径根下】
- 百度UEditor添加视频 增加支持“通用代码”功能,支持微信
- IKAnalyzer 中文分词支持Solr 6以上 solrj 6
- solr5.3.1 添加中文分词之IKAnalyzer
- 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
- 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
- Solr搜索引擎(5)通过Java代码索引MySQL
- 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
- solr入门之lucene的索引操作之增加,删除,修改,查询及查询解析代码模板
- 百度UEditor添加视频 增加支持“通用代码”功能,支持微信
- solr关于对文档的索引java 并且给文档添加自定义的域
- JNBridge提供了跨越Java与.NET代码的分布式事务支持
- 向 Java 代码中添加元数据1
- 【原】高亮您的代码,秀出您的水平【有源码,支持大部分常用语言的高亮显示,如C#,JAVA等】
- 庖丁解牛分词器增加对日文,韩文分词的支持
- InfoPath进阶之二:给InfoPath添加VSTA托管代码并从SharePoint列表查询数据
- Java 语言是否应增加闭包以及如何添加?