`
ganqing1234
  • 浏览: 169115 次
  • 性别: 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。

分享到:
评论

相关推荐

    slor定时增量更新索引dataimport.properties

    slor定时增量更新索引dataimport.properties

    ES与slor区别

    主要介绍ES 与slor 的基本概念及区别

    slor7.5最新版本

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

    slor动态刷新分词库

    采用servlet的方式对分词库进行动态更新,请求servlet对分词库进行修改

    lucene-slor

    Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的...用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

    自学slor服务搭建过程.docx

    自学搭建solr服务过程,在linux系统下进行安装。每一步都细致到位,欢迎下载学习!

    solr5.2.1.jar

    solr-analysis-5.2.1.jar需要的朋友请下载

    solr使用和原理

    Solr安装,配置及使用说明 已级对主要文件data-config.xml说明

    Solr451全文搜索

    Solr4.5.1安装手册 SolrJ简单应用附代码 IKAnalyzer分词器 学习手册 理解不是太深 如有错误欢迎指正 mail heying876@163.com

    solr4.4帮助文档.pdfsolr4.4帮助文档

    solr4.4帮助文档.pdf详细的帮助文档,手把手教你入门到精通。

    solr7.2总结

    solr7总结版本以上总结,包含了我自己搭建的一些心得和体验,虽然也是模仿大神做的,但是我这个文档更详细,更适合新手,且都配有截图

    ik-analyzer.rar

    slor中文分词

    集成Solr​搜索SpringDataSolr.zip

    Spring Data Solr project 集成了 Apache Solr 搜索引擎。它提供了自身的 MappingSolrConverter 以替代 DocumentObjectBinder ,Spring Data Solr 可以处理继承以及使用自定义类,例如 Point 或 DateTime。...

    lia-webdev-elte:该网站是在EötvösLoránd大学的Web开发课程框架中创建的

    lia-webdev-elte 该网站是在EötvösLoránd大学的Web开发课程框架中创建的

    大数据Solr架构原理.pdf

    大数据Solr架构原理.pdf

    solr中文解析器以及使用文档

    solr中文解析器以及使用文档,配合blog使用

    solr ssm java

    自己弄的一个maven项目 框架ssm 改改配置就能用 搭建文档我已经加到了压缩包 有不懂的可以问 windows下搭建的solr 跟linux步骤差不多

    IK中文分词器

    IKAnalyaer中文分词器,配合slor使用,让你的搜索效果更佳

    solr-4.10.3

    solr-4.10.3安装包

    java基础面试题合集.rar

    内容比较老,包含java面试基础题,包含java基础,语法redis,异常处理,IO,集合,多线程,java高级,http协议,cookie-session,jsonp,Linux常用命令,常用前端框架,mysql,oracle数据库,主流框架,...nginx,slor等

Global site tag (gtag.js) - Google Analytics