【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词

[java]  view plain copy print ?
  1. package com.jadyer.solrj;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.apache.solr.client.solrj.SolrQuery;  
  7. import org.apache.solr.client.solrj.SolrServer;  
  8. import org.apache.solr.client.solrj.SolrServerException;  
  9. import org.apache.solr.client.solrj.impl.HttpSolrServer;  
  10. import org.apache.solr.client.solrj.response.QueryResponse;  
  11. import org.apache.solr.common.SolrDocument;  
  12. import org.apache.solr.common.SolrDocumentList;  
  13. import org.apache.solr.common.SolrInputDocument;  
  14.   
  15. import com.jadyer.model.MyMessage;  
  16.   
  17. /** 
  18.  * 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词 
  19.  * @see ------------------------------------------------------------------------------------------------------------------------- 
  20.  * @see 通过schema.xml使得Solr与中文分词进行整合 
  21.  * @see 0)默认solr定义的大量域都不支持中文分词,如果我们要加中文分词的支持,那么首先要加的就是<types><fieldType/></types> 
  22.  * @see   下面以MMSeg4j-1.8.5为例,描述Solr与中文分词器的整合方式(其核心就是在schema.xml中配置fieldType) 
  23.  * @see   关于MMSeg4j的介绍,详见http://blog.csdn.net/jadyer/article/details/10049525 
  24.  * @see 1)将mmseg4j-all-1.8.5.jar拷到D:\Develop\apache-solr-3.6.2\server\solr\WEB-INF\lib\文件夹中 
  25.  * @see 2)新建D:\Develop\apache-solr-3.6.2\home\dic\文件夹 
  26.  * @see 3)将mmseg4j-1.8.5.zip\data\文件夹中的词典文件拷贝到D:\Develop\apache-solr-3.6.2\home\dic\ 
  27.  * @see 4)在schame.xml中添加中文分词的fieldType定义 
  28.  * @see   通常中文分词的工具包中都会提供README.txt文件,里面会描述扩展solr时需要配置的fieldType 
  29.  * @see   同理将mmseg4j-1.8.5.zip中的README.txt打开,拷贝里面描述的三个fieldType到schema.xml中第68行 
  30.  * @see 5)确认并修改这三个fileType中的dicPath属性值为"dic"(这里的dic其实指的就是第二步新建的dic文件夹) 
  31.  * @see 6)最后测试一下中文分词效果 
  32.  * @see   在solr控制台上(http://127.0.0.1:8088/solr/admin/)点击蓝色粗体的[ANALYSIS] 
  33.  * @see   然后在Field Analysis下面将Field下拉框修改为type,并在右面文本框输入text_general(即schema.xml中定义的fieldType) 
  34.  * @see   接着在Field Value(Index)右面的文本框中输入测试文本'我来自中国黑龙江省哈尔滨市巴彦县兴隆镇长春乡民权村4队' 
  35.  * @see   再点击下方的Analyze按钮,我们就会发现text_general的分词情况了,然后我们再修改text_general为刚才自定义的textComplex,就看到效果啦 
  36.  * @see   另外也可以勾选Field Value(Index)下面的verbose output选框,这样也会将分词的各个属性(position,Offset,type等等)一并显示出来 
  37.  * @see ------------------------------------------------------------------------------------------------------------------------- 
  38.  * @see 本例中合计用到9个jar,如下所示 
  39.  * @see apache-solr-core-3.6.2.jar 
  40.  * @see apache-solr-solrj-3.6.2.jar 
  41.  * @see commons-codec-1.6.jar 
  42.  * @see commons-io-2.1.jar 
  43.  * @see httpclient-4.1.3.jar 
  44.  * @see httpcore-4.1.4.jar 
  45.  * @see httpmime-4.1.3.jar 
  46.  * @see jcl-over-slf4j-1.6.1.jar 
  47.  * @see slf4j-api-1.6.1.jar 
  48.  * @see ------------------------------------------------------------------------------------------------------------------------- 
  49.  * @create Aug 7, 2013 11:06:20 PM 
  50.  * @author 玄玉<http://blog.csdn.net/jadyer> 
  51.  */  
  52. public enum HelloSolrJ {  
  53.     INSTANCE;  
  54.       
  55.     private SolrServer server;  
  56.       
  57.     private HelloSolrJ(){  
  58.         //创建SolrServer对象,它有两个线程安全的子类EmbeddedSolrServer和CommonsHttpSolrServer  
  59.         //EmbeddedSolrServer-----内嵌式的,不需要启动Web服务器  
  60.         //CommonsHttpSolrServer--需要启动Web服务器,它是通过HTTP请求来获取数据的  
  61.         //CommonsHttpSolrServer已不推荐直接使用了,而是推荐使用HttpSolrServer类  
  62.         //同样的StreamingUpdateSolrServer也不推荐使用了,推荐使用ConcurrentUpdateSolrServer  
  63.         server = new HttpSolrServer("http://127.0.0.1:8088/solr");  
  64.     }  
  65.       
  66.     /** 
  67.      * 删除全部索引 
  68.      */  
  69.     public void deleteAllIndex(){  
  70.         try {  
  71.             //删除所有的索引,删除完记得commit才能生效  
  72.             server.deleteByQuery("*:*");  
  73.             server.commit();  
  74.         } catch (Exception e) {  
  75.             e.printStackTrace();  
  76.         }  
  77.     }  
  78.       
  79.       
  80.     /** 
  81.      * 添加索引 
  82.      * @see 这里之所以没有硬编码指定my_title和my_content的中文分词器 
  83.      * @see 是由于schema.xml中在定义这俩<field>时已通过type属性指定了中文分词器 
  84.      */  
  85.     public void addIndex(){  
  86.         List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();  
  87.         for(int i=1; i<4; i++){  
  88.             SolrInputDocument doc = new SolrInputDocument();  
  89.             //对于Solr而言,默认的id是唯一的主键(如果我们没有自定义主键的话),当多次添加的时候,最后添加的相同id的域会覆盖已有的  
  90.             doc.addField("id", Integer.toString(i));  
  91.             //这里使用的是自定义的Field,所以就需要在schema.xml中为其添加<field>描述,并通过type属性指定其使用的分词器  
  92.             doc.addField("my_title""这是我的第" + i + "个SolrJ程序");  
  93.             doc.addField("my_content""my第" + i + "个SolrJ程序的运行情况");  
  94.             docs.add(doc);  
  95.         }  
  96.         try {  
  97.             //可以只添加一个Document,也可以一次添加多个Document,这里添加多个  
  98.             server.add(docs);  
  99.             //commit后方能生效,否则搜索到的还是add前的索引信息  
  100.             server.commit();  
  101.         } catch (Exception e) {  
  102.             e.printStackTrace();  
  103.         }  
  104.     }  
  105.       
  106.       
  107.     /** 
  108.      * 使用JavaBean来添加索引 
  109.      */  
  110.     public void addIndexByBean(){  
  111.         List<MyMessage> msgs = new ArrayList<MyMessage>();  
  112.         //由于MyMessage()的第三个参数允许传入多个值,此时就要在Solr的schema.xml中配置<field my_content multiValued="true"/>支持多值域  
  113.         //并且在MyMessage.java中要使用@Field注解标注,可以标注在属性或setter方法上,并通过注解的默认值来指定所要存储的Field的名字  
  114.         msgs.add(new MyMessage("4""这是我的第4个SolrJ程序"new String[]{"第4个SolrJ程序诞生于中国""它是通过SolrJ OF JavaBean4诞生添加的"}));  
  115.         msgs.add(new MyMessage("5""这是我的第5个SolrJ程序"new String[]{"第5个SolrJ程序诞生于哈尔滨""它是通过SolrJ OF JavaBean5诞生添加的"}));  
  116.         try {  
  117.             server.addBeans(msgs);  
  118.             server.commit();  
  119.         } catch (Exception e) {  
  120.             e.printStackTrace();  
  121.         }  
  122.     }  
  123.       
  124.       
  125.     /** 
  126.      * 搜索文档 
  127.      */  
  128.     public void searchFile(){  
  129.         //设置查询字符串  
  130.         SolrQuery query = new SolrQuery("my_content:诞生");  
  131.         //设置了setStart和setRows就可以实现分页效果了  
  132.         query.setStart(0);  
  133.         query.setRows(3);  
  134.         QueryResponse resp = null;  
  135.         try {  
  136.             resp = server.query(query);  
  137.         } catch (SolrServerException e) {  
  138.             e.printStackTrace();  
  139.         }  
  140.         //搜索出来的结果都保存在SolrDocumentList中  
  141.         SolrDocumentList sdl = resp.getResults();  
  142.         //这里获取到的是搜索到的总数量,与query.setRows(3)无关  
  143.         System.out.println("本次搜索到[" + sdl.getNumFound() + "]条数据");  
  144.         for(SolrDocument sd : sdl){  
  145.             //System.out.println(sd)会输出SolrDocument[{id=4, my_title=这是我的第4个SolrJ程序, my_content=[第4个....于中国, 它是....进来的]}]  
  146.             System.out.println("my_title=" + sd.getFieldValue("my_title") + "        my_content=" + sd.getFieldValue("my_content"));  
  147.         }  
  148.     }  
  149.   
  150.       
  151.     /** 
  152.      * 使用JavaBean接收文档搜索结果 
  153.      */  
  154.     public void searchFileByBean(){  
  155.         SolrQuery query = new SolrQuery("id:*");  
  156.         query.setStart(0);  
  157.         query.setRows(3);  
  158.         QueryResponse resp = null;  
  159.         try {  
  160.             resp = server.query(query);  
  161.         } catch (SolrServerException e) {  
  162.             e.printStackTrace();  
  163.         }  
  164.         List<MyMessage> list = resp.getBeans(MyMessage.class);  
  165.         //这里获取到的不是搜索到的总数量,而是与query.setRows(3)有关的值  
  166.         //若实际的SolrQuery("id:*")能搜索到5条,则这里得到的就是3,若实际能搜索到的是2条,则这里得到的就是2条  
  167.         System.out.println("本次搜索到[" + list.size() + "]条数据");  
  168.         for(MyMessage msg : list) {  
  169.             System.out.println(msg.getTitle() + "         " + msg.getContent()[0]);  
  170.         }  
  171.     }  
  172. }  


下面是用到的JavaBean类

[java]  view plain copy print ?
  1. package com.jadyer.model;  
  2.   
  3. import org.apache.solr.client.solrj.beans.Field;  
  4.   
  5. public class MyMessage {  
  6.     @Field  
  7.     private String id;  
  8.     @Field("my_title")  
  9.     private String title;  
  10.     @Field("my_content")  
  11.     private String[] content;  
  12.       
  13.     /*-- 三个属性的setter和getter略 --*/  
  14.       
  15.     public MyMessage() {}  
  16.   
  17.     public MyMessage(String id, String title, String[] content) {  
  18.         this.id = id;  
  19.         this.title = title;  
  20.         this.content = content;  
  21.     }  
  22. }  

最后是JUnit4.x写的一个小测试

[java]  view plain copy print ?
  1. package com.jadyer.test;  
  2.   
  3. import org.junit.Test;  
  4.   
  5. import com.jadyer.solrj.HelloSolrJ;  
  6.   
  7. public class HelloSolrJTest {  
  8.     @Test  
  9.     public void deleteAllIndex(){  
  10.         HelloSolrJ.INSTANCE.deleteAllIndex();  
  11.     }  
  12.       
  13.     @Test  
  14.     public void addIndexAndSearchFile(){  
  15.         HelloSolrJ.INSTANCE.addIndex();  
  16.         HelloSolrJ.INSTANCE.searchFile();  
  17.     }  
  18.       
  19.     @Test  
  20.     public void addIndexAndSearchFileByBean(){  
  21.         HelloSolrJ.INSTANCE.addIndexByBean();  
  22.         HelloSolrJ.INSTANCE.searchFileByBean();  
  23.     }  
  24. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在现有省、市港口信息化系统进行有效整合基础上,借鉴新 一代的感知-传输-应用技术体系,实现对码头、船舶、货物、重 大危险源、危险货物装卸过程、航管航运等管理要素的全面感知、 有效传输和按需定制服务,为行政管理人员和相关单位及人员提 供高效的管理辅助,并为公众提供便捷、实时的水运信息服务。 建立信息整合、交换和共享机制,建立健全信息化管理支撑 体系,以及相关标准规范和安全保障体系;按照“绿色循环低碳” 交通的要求,搭建高效、弹性、高可扩展性的基于虚拟技术的信 息基础设施,支撑信息平台低成本运行,实现电子政务建设和服务模式的转变。 实现以感知港口、感知船舶、感知货物为手段,以港航智能 分析、科学决策、高效服务为目的和核心理念,构建“智慧港口”的发展体系。 结合“智慧港口”相关业务工作特点及信息化现状的实际情况,本项目具体建设目标为: 一张图(即GIS 地理信息服务平台) 在建设岸线、港口、港区、码头、泊位等港口主要基础资源图层上,建设GIS 地理信息服务平台,在此基础上依次接入和叠加规划建设、经营、安全、航管等相关业务应用专题数据,并叠 加动态数据,如 AIS/GPS/移动平台数据,逐步建成航运管理处 "一张图"。系统支持扩展框架,方便未来更多应用资源的逐步整合。 现场执法监管系统 基于港口(航管)执法基地建设规划,依托统一的执法区域 管理和数字化监控平台,通过加强对辖区内的监控,结合移动平 台,形成完整的多维路径和信息追踪,真正做到问题能发现、事态能控制、突发问题能解决。 运行监测和辅助决策系统 对区域港口与航运业务日常所需填报及监测的数据经过科 学归纳及分析,采用统一平台,消除重复的填报数据,进行企业 输入和自动录入,并进行系统智能判断,避免填入错误的数据, 输入的数据经过智能组合,自动生成各业务部门所需的数据报 表,包括字段、格式,都可以根据需要进行定制,同时满足扩展 性需要,当有新的业务监测数据表需要产生时,系统将分析新的 需求,将所需字段融合进入日常监测和决策辅助平台的统一平台中,并生成新的所需业务数据监测及决策表。 综合指挥调度系统 建设以港航应急指挥中心为枢纽,以各级管理部门和经营港 口企业为点,快速调度、信息共享的通信网络,满足应急处置中所需要的信息采集、指挥调度和过程监控等通信保障任务。 设计思路 根据项目的建设目标和“智慧港口”信息化平台的总体框架、 设计思路、建设内容及保障措施,围绕业务协同、信息共享,充 分考虑各航运(港政)管理处内部管理的需求,平台采用“全面 整合、重点补充、突出共享、逐步完善”策略,加强重点区域或 运输通道交通基础设施、运载装备、运行环境的监测监控,完善 运行协调、应急处置通信手段,促进跨区域、跨部门信息共享和业务协同。 以“统筹协调、综合监管”为目标,以提供综合、动态、实 时、准确、实用的安全畅通和应急数据共享为核心,围绕“保畅通、抓安全、促应急"等实际需求来建设智慧港口信息化平台。 系统充分整合和利用航运管理处现有相关信息资源,以地理 信息技术、网络视频技术、互联网技术、移动通信技术、云计算 技术为支撑,结合航运管理处专网与行业数据交换平台,构建航 运管理处与各部门之间智慧、畅通、安全、高效、绿色低碳的智 慧港口信息化平台。 系统充分考虑航运管理处安全法规及安全职责今后的变化 与发展趋势,应用目前主流的、成熟的应用技术,内联外引,优势互补,使系统建设具备良好的开放性、扩展性、可维护性。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值