`
ganqing1234
  • 浏览: 173915 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

利用slor实现索引查询

阅读更多

项目里有一个查询模块,就是从特定的ftp站点扫描,然后利用solr来生成索引文件,提供查询下载服务。关于如何搭建和配置solr,参见 http://www.jinsehupan.com/blog/?p=25 和官方的文档,写的很详细。

这里具体讲讲在利用solr开发时需要注意的方面。

项目使用的是spring。项目中有一个solrService类,它主要负责对索引的操作,像新增索引,更新索引和删除失效的索引等。项目需要引入apache-solr-solrj-1.3-dev.jar、apache-solr-common-1.3-dev.jar、apache-solr-1.3-dev.jar三个包。

首先在spring的配置文件里面配置solrService类

<bean id="solrService" class="com.search.SolrService">
        <property name="jdbcDAO" ref="genericJdbcDAO" />
        
        <!-- solrURL -->
        <property name="solrURL" value="http://localhost:8080/solr" />
        <!-- solr检索字段和数据库字段的对应关系,配置主键名,配置SQL -->        
        <property name="sqlConfigMap">
        <map>
            <!--
            key:
                需检索的主表(比如topic、article之类)对应的className
                service监听这些bean的更新事件并作更新索引处理
            value:
                pkBoName:
                    主键在BO中的属性名(如id、userId等)
                sqlPart: 
                    读取数据的SQL语句一部分,as成solr预定义名称
                    注意:WHERE条件最后要包含主键pk,且判断条件(>100之类)用“{SOLR}”代替,由service根据索引产生
                    如:where .... and id{SOLR}
                sqlCount:
                    读取数据的SQL语句对应的count(*)语句,加入这个是为了能分页(分次)取数据
                    注意项同sqlPart说明(判断条件用“{SOLR}”代替)
                pageSize:
                    分页读取时每页(每次)读取的记录条数,根据实际情况调整
                sqlGetpk:
                    读取主键sid的SQL语句,加入这个是为了能同步删除的记录(对比数据表的id和solr存储的sid)
                // solr预定义类型:
                    sid (solr内部唯一标识,sid生成方式为: {"去package的className"_"id"})
                    category (string), author (string), url (string), time (date),
                    title (text与string的区别是text类型有分词), content (text不存储), keyword (text),
                    summary (仅存储不索引 如果没有指定则根据content截断200字符生成), ip (string),
                    size (slong), indextime (date 添加索引时间 默认为NOW)
                    此外支持如下*匹配(有存储有索引)类型:
                        *_i (sint), *_s (string), *_l (slong), *_t (text)
                        *_b (boolean), *_f (float), *_d (double), *_dt (date)
                    及以下*匹配(仅索引不存储)类型:
                        *_ii (sint), *_is (string), *_il (slong), *_it (text)
                        *_ib (boolean), *_if (float), *_id (double), *_idt (date)
                    及以下*匹配(仅存储不索引)类型:
                        *_si (sint), *_ss (string), *_sl (slong)
                        *_sb (boolean), *_sf (float), *_sd (double), *_sdt (date)
            如:
            <entry key="com.wiscom.union.bo.Topic">
                <bean class="com.wiscom.generic.base.search.SqlConfig">
                    <property name="pkBoName" value="id" />
                    <property name="sqlPart">
                        <value>SELECT t.id as sid, t.topic_title as title,
                            u.username as author FROM t_topic t, t_user u
                            WHERE t.userid=u.id AND t.id {SOLR} ORDER BY t.id</value>
                    <property name="sqlCount" value="SELECT count(*) FROM t_topic WHERE id {SOLR}" />
                    <property name="pageSize" value="100" />
                    <property name="sqlGetpk" value="SELECT id as sid FROM t_topic WHERE 1=1" />
                    </property>
                </bean>
            </entry>
            则保存到solr索引时,sid: {Topic_"id"}
            -->
            <entry key="com.wiscom.union.bo.File">
                <bean class="com.wiscom.generic.base.search.SqlConfig">
                    <property name="pkBoName" value="id" />
                    <property name="sqlPart">
                        <value>SELECT f.id as sid,
						  f.file_name as title,
						  f.file_size as "size",
						  f.file_time as time,
						  f.category_id as c_i,
						  ...
						  FROM t_file f, t_site s, t_area a WHERE f.site_id=s.id AND a.id=s.area_id AND f.file_type=0 AND f.id {SOLR} ORDER BY f.id</value>
                    </property>
                    <property name="sqlCount" value="SELECT count(*) FROM t_file WHERE id {SOLR}" />
                    <property name="pageSize" value="1000" /> <!-- 一次最多操作的数目-->
                    <property name="sqlGetpk" value="SELECT id as sid FROM t_file WHERE 1=1 ORDER BY id" />
                </bean>
            </entry>
        </map>
        </property>
    </bean>

 注释已经很详细了。sqlPart部分的as 什么什么,是在solr的配置文件schema.xml做的类型定义。这里需要注意的是solr对这些类型定义别名是区分大小写的,在使用oracle数据库时需要注意这个问题,因为oracle查询得到的列名都是大写的,大小写不一致会导致查询不到结果。

在solrService里以新增index文件为例。首先是要从数据库中得到相应的数据,然后使用SolrInputDocument来生成要提交的doc文档对象。

...
// 生成doc
SolrInputDocument doc = new SolrInputDocument();
doc.addField(fieldName, fieldValue);
docsList.add(doc);
...
// solrURLURL 为URL对象
SolrServer server = new CommonsHttpSolrServer(solrURLURL);
server.add(docsList);
// 提交
server.commit();
...

  solr虽然是基于lucene,但是在处理更新操作时是不同的,lucene没有更新操作,只能先将相应的索引删除,然后再添加新的索引。solr则不需要这么做,如果提交的doc的主键已经存在则会做更新操作,不需要我们自己做什么工作,所以更新操作和新增是一样的。我们的做法是在做ftp爬虫时区分哪些数据是更新的,哪些数据是删除的,然后把它们的主键提交到索引文件里,当solr的程序启动时,根据这些主键来对索引进行相应的操作。

  删除操作方法如下:

server.deleteById(id); //根据索引的主键删除
server.deleteByQuery("sid:SoLRdelPkS@*"); // 根据查询删除
server.commit();

   最后需求注意的问题是中文的查询问题,中文分词可以采用庖丁分词,网上有很多介绍。这里有个问题是在Linux下使用tomcat做容器时,在提交中文时会出现乱码的问题。最终使用的resin才解决了问题 。

 

   在分析查询结果是采用的是SAXReader包。

// url包含有查询条件 如"...?q=hello&start=100&wt=xml"
Document document = saxReader.read(url); 

  然后就可以对document进行分析得到相应的filed。

分享到:
评论

相关推荐

    slor7.5最新版本

    查询该集合也是通过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提 供一套强大Data Schema来定义字段,类型和设置文本...

    大数据Solr架构原理.pdf

    1. **Solr Core**:Solr Core是Solr的基本工作单元,每个Core可以独立地处理索引和查询任务。它可以看作是一个独立的搜索引擎实例,有自己的索引和配置。在SolrCloud模式下,Core的配置存储在Zookeeper中,增强了...

    ES和solr搜索方案对比

    如果ES发生故障,它可以利用这个网关(或者说是“可用性系统”)从上一次的状态中恢复索引数据。这对于需要保证服务稳定性和数据不丢失的应用场景非常关键。特别是对于使用云服务的用户来说,ES支持将S3作为网关,...

    安川MP7系列工控系统源码解析:关键算法与硬件交互揭秘

    内容概要:本文深入剖析了安川MP7系列工业控制系统的关键源码,重点介绍了运动轨迹规划、通信协议处理以及故障处理机制等方面的技术细节。通过对实际代码片段的解读,揭示了该系统在硬件寄存器直接访问、特殊功能码处理等方面的独特之处。同时,文中还分享了一些基于实践经验得出的重要参数设置及其背后的故事,如特定摩擦补偿系数的选择原因等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对安川产品有一定了解并希望深入了解其内部工作机制的专业人士。 使用场景及目标:帮助读者掌握安川MP7系列控制器的工作原理,提高对类似系统的维护能力和故障排查效率。对于想要进一步研究或二次开发该系统的开发者来说,也能提供宝贵的参考资料。 其他说明:文章不仅限于理论讲解,还包括了许多来自一线的实际案例和经验教训,使读者能够更好地理解和应用所学知识。

    自动化测试与脚本开发_Python3_pynput_键盘鼠标操作录制执行代码生成工具_用于自动化测试_脚本录制_重复操作模拟_宏命令生成_提高工作效率_支持GUI界面_跨平台兼容_.zip

    自动化测试与脚本开发_Python3_pynput_键盘鼠标操作录制执行代码生成工具_用于自动化测试_脚本录制_重复操作模拟_宏命令生成_提高工作效率_支持GUI界面_跨平台兼容_

    嵌入式八股文面试题库资料知识宝典-深入分析Windows和Linux动态库应用异同.zip

    嵌入式八股文面试题库资料知识宝典-深入分析Windows和Linux动态库应用异同.zip

    嵌入式八股文面试题库资料知识宝典-C语言总结.zip

    嵌入式八股文面试题库资料知识宝典-C语言总结.zip

    风储直流微电网母线电压控制策略与双闭环MPPT技术研究

    内容概要:本文详细探讨了风储直流微电网中母线电压控制的关键技术。首先介绍了风储直流微电网的背景和发展现状,强调了母线电压控制的重要性。接着阐述了永磁风机储能并网技术,解释了永磁风机如何通过直接驱动发电机将风能转化为电能,并确保与电网的同步性和稳定性。然后深入讨论了双闭环控制MPPT技术,这是一种通过内外两个闭环控制系统来实现实时调整发电机运行参数的技术,确保风机始终处于最大功率点附近。最后,文章探讨了储能控制母线电压平衡的方法,即通过储能系统的充放电操作来维持母线电压的稳定。结论部分指出,通过这些技术的有机结合,可以实现对风储直流微电网的有效管理和优化控制。 适合人群:从事新能源技术研发的专业人士、电气工程研究人员、风电系统工程师。 使用场景及目标:适用于希望深入了解风储直流微电网母线电压控制策略的研究人员和技术人员,旨在帮助他们掌握最新的控制技术和方法,以提高系统的稳定性和效率。 其他说明:文章还对未来风储直流微电网的发展进行了展望,指出了智能化和自动化的趋势,以及储能技术的进步对系统性能的影响。

    嵌入式八股文面试题库资料知识宝典-C++object-oriented.zip

    嵌入式八股文面试题库资料知识宝典-C++object-oriented.zip

    【操作系统开发】HarmonyOS目录结构详解:构建高效开发环境与跨设备协同应用

    内容概要:文章详细介绍了HarmonyOS的目录结构及其重要性,从整体框架到核心目录的具体功能进行了全面剖析。HarmonyOS凭借其分布式架构和跨设备协同能力迅速崛起,成为全球操作系统领域的重要力量。文章首先概述了HarmonyOS的背景和发展现状,强调了目录结构对开发的重要性。接着,具体介绍了根目录文件、AppScope、entry和oh_modules等核心目录的功能和作用。例如,AppScope作为全局资源配置中心,存放应用级的配置文件和公共资源;entry目录是应用的核心入口,负责源代码和界面开发。此外,文章还对比了HarmonyOS与Android、iOS目录结构的异同,突出了HarmonyOS的独特优势。最后,通过旅游应用和电商应用的实际案例,展示了HarmonyOS目录结构在资源管理和代码组织方面的应用效果。; 适合人群:具备一定编程基础,尤其是对移动操作系统开发感兴趣的开发者,包括初学者和有一定经验的研发人员。; 使用场景及目标:①帮助开发者快速理解HarmonyOS的目录结构,提高开发效率;②为跨设备应用开发提供理论和技术支持;③通过实际案例学习资源管理和代码组织的最佳实践。; 其他说明:HarmonyOS的目录结构设计简洁明了,模块职责划分明确,有助于开发者更好地管理和组织代码和资源。随着万物互联时代的到来,HarmonyOS有望在开发便利性和生态建设方面取得更大进展,吸引更多开发者加入其生态系统。

    飞轮储能充放电控制Simulink仿真模型:基于永磁同步电机的矢量控制与dq轴解耦

    内容概要:本文详细介绍了飞轮储能充放电控制的Simulink仿真模型,重点在于采用永磁同步电机的矢量控制和dq轴解耦控制策略。充电时,外环控制转速,内环控制dq轴电流;放电时,外环控制直流母线电压,内环同样控制dq轴电流。文中还讨论了硬件与软件环境的选择,以及仿真模型的调试与运行情况,最终得出该模型具有良好的跟随性能和波形完美度。 适用人群:从事电力电子系统、储能技术和Simulink仿真的研究人员和技术人员。 使用场景及目标:适用于需要对飞轮储能系统进行深入研究和仿真的场合,旨在提高充放电效率和稳定性,满足不同应用场景的需求。 其他说明:该仿真模型已调试完成,可以直接用于进一步的研究和实际应用,为未来的飞轮储能技术研发提供了有价值的参考。

    嵌入式八股文面试题库资料知识宝典-北京瑞德方科技.zip

    嵌入式八股文面试题库资料知识宝典-北京瑞德方科技.zip

    嵌入式八股文面试题库资料知识宝典-同方万维硬件测试工程师.zip

    嵌入式八股文面试题库资料知识宝典-同方万维硬件测试工程师.zip

    1_15套python PDF格式.zip

    1_15套python PDF格式.zip

    三相三电平整流器仿真:基于电压电流双闭环控制与SPWM调制的性能分析

    内容概要:本文详细介绍了三相三电平整流器的仿真过程及其性能分析。文中首先概述了三相三电平整流器的基本概念及其在电力系统中的重要作用,接着重点探讨了电压电流双闭环控制方式的工作原理和优势,以及SPWM调制技术的具体应用。通过仿真文件展示了整流器在不同条件下的响应情况,验证了这两种技术的有效性和优越性。最后,作者表达了对未来实际应用的期望。 适合人群:从事电力电子研究的技术人员、高校相关专业师生、对电力控制系统感兴趣的工程爱好者。 使用场景及目标:适用于希望深入了解三相三电平整流器工作原理和技术细节的研究人员;目标是在理论基础上掌握电压电流双闭环控制和SPWM调制的实际应用方法。 其他说明:本文提供的仅为仿真文件,未涉及实物实验数据。

    嵌入式八股文面试题库资料知识宝典-恒光科技.zip

    嵌入式八股文面试题库资料知识宝典-恒光科技.zip

    嵌入式八股文面试题库资料知识宝典-北京天华威视科技有限公司面试题.zip

    嵌入式八股文面试题库资料知识宝典-北京天华威视科技有限公司面试题.zip

    嵌入式八股文面试题库资料知识宝典-微软研究院笔试题目的答案.zip

    嵌入式八股文面试题库资料知识宝典-微软研究院笔试题目的答案.zip

    Arduino UART实验例程【正点原子EPS32S3】

    Arduino UART实验例程,开发板:正点原子EPS32S3,本人主页有详细实验说明可供参考。

Global site tag (gtag.js) - Google Analytics