热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Solr配置搜索服务

背景我用Lucene3.6,为php语言搭建的平台提供一套搜索服务,但是lucene只是个提供索引操作的库,需要一个web-service来提供给java外的语言,使之可以通过http方式发送搜索请

背景

我用Lucene3.6,为php语言搭建的平台提供一套搜索服务,但是lucene只是个提供索引操作的库,需要一个web-service来提供给java外的语言,使之可以通过http方式发送搜索请求并得到如json, xml格式的查询结果集数据。而Solr是一个二次包装了Lucene库的搜索服务容器,兼容lucene的api,可以在jetty或者Tomcat这样的容器里以web服务的方式启动并提供一套自己的索引建立,更新,删除,查询接口,以及更高级更全面的接口服务。


关于Solr

Solr版本随着lucene版本的更新而兼容更新,目前已经发布4.0,我使用的是3.6版本。在配置中文分词库以及使用Solrj来访问solr服务的时候,也因为版本比较新,遇到了一些问题,我会在下面详细说明。我初步感受,Solr和lucene有以下一些区别:

Solr的索引建立主要有通过xml文件读取需要建索引的数据、通过solrj用api来addDocument,此外还有读取CVS文件,获取post来的json数据以及直接从数据库读(DIH)。来讲讲主要的索引建立方法。其实通过Solrj用api里的类和函数来建索引是类似于Lucene的做法的,差别是两者的api长的不一样。但凡使用过lucene的人,就会觉得solrj的关键类和使用方法还是一目了然,比如下面这样:

String url = "http://localhost:8080/solr";
SolrServer server = new HttpSolrServer(url);
SolrQuery query = new SolrQuery();
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField( "id", "id1", 1.0f );
doc1.addField( "name", "doc1", 1.0f );
doc1.addField( "price", 10 );
SolrInputDocument doc2 = new SolrInputDocument();
doc2.addField( "id", "id2", 1.0f );
doc2.addField( "name", "doc2", 1.0f );
doc2.addField( "price", 20 );
Collection docs = new ArrayList();
docs.add( doc1 );
docs.add( doc2 );
server.add( docs );
server.commit();

下载solr后,在 {solr.home}/example/exampledocs 内会有一些xml,就是通过第一种建索引的方式用xml文件导入数据。比如下面这样:


3007WFP
Dell Widescreen UltraSharp 3007WFP
Dell, Inc.
electronics
monitor
30" TFT active matrix LCD, 2560 x 1600, .25mm dot pitch, 700:1 contrast
USB cable
401.6
2199
6
true

43.17614,-90.57341
这两者都有个共同的问题,关于不同Filed的分词,STORE,Analyze是怎么处理的?

solr有两个重要的配置文件:scheme.xml和solrconfig.xml

scheme.xml主要配置:

每个fieldtype来自哪个类,是solr自带的主要类型,还是你自己要加入的类,比如中文分词的类,各举一个例子:


        
上面第二个配置是我加的中文分词,使用的是IKAnalyzer,版本是2012u6,最新的版本。配置了filedtype之后,要在scheme.xml里配置 将要建立的索引字段的类型和信息


这样应该解释清楚了。至于,solrconfig.xml,主要是一些系统依赖,缓存配置,各种http的requestHandler的请求处理类等。

总结,就是solr的索引配置主要在xml里,甚至数据也可以写成xml,然后在cmd里添加数据文件,这就是封装了lucene的结果,比lucene更高层一点,而我认为这样的配置不怎么方便,我的选择是把自己用lucene建出来的索引块直接丢到solr索引目录里,并在scheme.xml里添加好字段,包括配置好中文分词工具,因为solr和lucene是兼容的,而包装到来的效果就是api不够底层。
再举几个小的方面,其实也可以说是solr比lucene进步的地方。lucene源码里,core包之外的随后整合的附加功能包highlighting在solr里是已经配置完整,并且solr的搜索url里可以整合排序和高亮等要求,给几个例子(hl是highlighting缩写):

q=video&sort=score desc
q=video&sort=inStock asc, score desc
q=video card&fl=name,id&hl=true&hl.fl=name,features

solr其实就是把lucene包装之后,变成了一个web的服务,放在容器里run起来后,可以通过http访问,作为一个中间件的服务存在。如果你自己做,也就是把lucene开发好之后写一些servlet的东西,也放在tomcat,jetty里面跑,然后接受url,做相应的response。solr的搜索请求和数据导入方式比较多样,适合不同开发者选用方便的特性适应需求,在Solr Tutorial里可以看到。


Solr的安装和配置

网上有很多资料,Solr3.6版本的配置也没有什么特别的。下载解压之后,可以选择直接进入 {solr.home}/example 目录,用 java -jar start.jar在8983端口启动服务,是在jetty容器里启动的,在 {solr.home}/example 子目录下已经为你部署好了jetty,jsp的jar包以及环境配置。你也可以启动自己的tomcat,把solr.war放到tomcat的webapp目录下,注意的是需要在 {tomcat.home}/conf/Catalina/localhost 下手动加一个solr.xml文件,作用是指向你的{solr.home}路径,让tomcat找到你要启动的web服务。比如我的:



启动solr后,通过浏览器就可以访问到你的solr服务,具体别的自己慢慢研究吧。


由于版本而导致的问题并解决方案
首先是 中文分词器。我使用的是IKAnalyzer2012_u6版本,IK,庖丁和mmseg是主流的三个支持lucene的分词库。但是中文分词库注定悲剧的地方在于总要跟着国外开源软件的更新走,一旦lucene,solr更新了,某些基础类改变或者接口变动,分词器可能就不再支持了。IKTokenizerFactory继承自solr的BaseTokenizerFactory,但是BaseTokenizerFactory在solr3.6之后版本已经不存在了,如果你按照以前的配置方式在scheme里配置:

 





启动solr后报错提示BaseTokenizerFactory类是找不到了的。所以只能这样配置:

 

再者是 solrj版本。我的solr是3.6版本,我在IDE里使用的solrj是3.6.0版本的。通过maven的pom.xml里的Dependencis查找solrj,并自动获取相关包之后,还是会出现问题。原因是HttpSolrServer类还依赖别的包。那就是httpcomponents的httpclient和httpmime包,应该4.1后的版本是可以的,我依赖的是4.1.3。总之最后的pom.xml里的配置是这样的:



junit
junit
3.8.1
test


mysql
mysql-connector-java
5.1.18


IKAnalyzer
IKAnalyzer
2012u6
system
${project.basedir}/lib/IKAnalyzer2012_u6.jar


org.apache.lucene
lucene-analyzers
3.6.0


org.apache.solr
solr-solrj
3.6.0


org.apache.httpcomponents
httpclient
4.1.3


org.apache.httpcomponents
httpmime
4.1.3

最后会依赖到下面这些jar包:



有了solr服务,有了中文分词,有了solrj,搭建自己的solr搜索服务平台就没什么问题了。最后给出一些相关基础资料,方便使用solr:

Solrj: http://wiki.apache.org/solr/Solrj

Solr Tutorial: http://lucene.apache.org/solr/api-3_6_1/doc-files/tutorial.html

Solr中文网:http://www.solrcn.com




推荐阅读
  • 部署solr建立nutch索引
    2019独角兽企业重金招聘Python工程师标准接着上篇nutch1.4的部署应用,我们来部署一下solr,solr是对lucene进行了封装的企 ... [详细]
  • 一:什么是solrSolr是apache下的一个开源项目,使用Java基于lucene开发的全文搜索服务器;Lucene是一个开放源代 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 本文对SQL Server系统进行了基本概述,并深入解析了其核心功能。SQL Server不仅提供了强大的数据存储和管理能力,还支持复杂的查询操作和事务处理。通过MyEclipse、SQL Server和Tomcat的集成开发环境,可以高效地构建银行转账系统。在实现过程中,需要确保表单参数与后台代码中的属性值一致,同时在Servlet中处理用户登录验证,以确保系统的安全性和可靠性。 ... [详细]
  • camel_使用Camel在来自不同来源的Solr中索引数据
    camelApacheSolr是建立在Lucene之上的“流行的,快速的开源企业搜索平台”。为了进行搜索(并查找结果),通常需要从不同的源(例如内容管理 ... [详细]
  • solr导入mysql_Solr导入MySQL中的数据
    一、目标将MySQL数据库中的数据导入至Solr中,并且由Solr生成中文索引,使用Solr查询信息。二、数据导入1、将solr-8.2.0dist下的 ... [详细]
  • Nexus3.0.0+Maven的使用(一)
    1、Nexus介绍Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。利用Nexus你可以只在一个地方就能够完全控制访问和部署在你所维护仓 ... [详细]
  • Lucene 全文检索技术入门
    一、搜索引擎的历史萌芽:Archie、Gopher起步:Robot(网络机器人)的出现与spider(网络爬虫)发展:excite、galax ... [详细]
  • 深入解析HTML5字符集属性:charset与defaultCharset
    本文将详细介绍HTML5中新增的字符集属性charset和defaultCharset,帮助开发者更好地理解和应用这些属性,以确保网页在不同环境下的正确显示。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • 基于JSP和SSM框架的超市收银系统毕业设计论文及源代码分析
    本研究基于JSP和SSM框架开发了一套超市收银系统,旨在提升超市收银效率和管理便捷性。系统运行环境包括JDK 1.8、Tomcat 7.0、MySQL数据库以及HBuilderX(也可使用WebStorm)作为前端开发工具,后端开发则采用Eclipse(IntelliJ IDEA亦可)。该系统实现了商品管理、订单处理、库存管理和报表生成等核心功能,具有良好的稳定性和扩展性。通过详细的设计与实现过程,本文为相关领域的研究提供了有价值的参考。 ... [详细]
  • 本指南详细介绍了如何在CentOS 6.6 64位系统上以root用户身份部署Tomcat 8服务器。系统环境为CentOS 6.6 64位,采用源码安装方式。所需软件为apache-tomcat-8.0.23.tar.gz,建议将软件下载至/root/opt目录。具体下载地址请参见官方资源。本指南涵盖了从环境准备到服务启动的完整步骤,适用于需要在该系统环境下搭建高性能Web应用服务器的技术人员。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • CSS3 @font-face 字体应用技术解析与实践
    在Web前端开发中,HTML教程和CSS3的结合使得网页设计更加多样化。长期以来,Web设计师受限于“web-safe”字体的选择。然而,CSS3中的`@font-face`规则允许从服务器端加载自定义字体,极大地丰富了网页的视觉效果。通过这一技术,设计师可以自由选择和使用各种字体,提升用户体验和页面美观度。本文将深入解析`@font-face`的实现原理,并提供实际应用案例,帮助开发者更好地掌握这一强大工具。 ... [详细]
author-avatar
BeckyWang25_966
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有