solr完整快速搭建版(学习笔记)
Solr安装使用教程

Solr安装使⽤教程⼀、安装1.1 安装jdksolr是基于lucene⽽lucene是java写的,所以solr需要jdk----当前安装的solr-7.5需要jdk-1.8及以上版本,下载安装jdk并设置JAVA_HOME即可。
jdk下载地址:1.2 安装solr下载solr,然后解压即可,windows和linux都可以下.tgz(.tgz本质是.tar.gz)和.zip解压出来都⼀样的。
solr下载地址:要注意图中的链接是下载页⾯的链接并不是solr⽂件的链接,直接wget链接就报gzip: solr-7.5.0.tgz: not in gzip format或End-of-central-directory signature not found.了。
1.3 设置系统资源限制设置最⼤进程数t和打开⽂件数为65000(可能其他⼀些资源也要修改但我安装时没见有其他问题,⽂档也没看到专门说明)ulimit -u 65000ulimit -n 65000⼆、solr基本⽤法对于没⽤过的新⼿⽽⾔,⾸先最关⼼的是怎么运⾏起来看这东西长什么样其他什么⾼级⽤法后⽽再说,这⾥我们就来做这件事。
2.1 启停进⼊解压后⽂件的bin⽬录,执⾏:# 启动./solr start# 停⽌./solr stopsolr默认拒绝以root⾝份启动,root加-force选项可以启动,但后续进⾏操作(如创建核⼼等)还是会有问题,推荐使⽤普通⽤户动。
启动完成后默认监听8983端⼝,访问可见界⾯如下2.2 solr核⼼(core)创建与删除在上⾯启动起来的页⾯可以看到solr就是就是这么⼀个界⾯简陋的东西----页⾯简单(没⼏个页⾯)加布局丑陋。
solr中⼀个核⼼(core)相当于⼀个搜索引擎,然后上传⽂件时也是上传到指定核⼼;solr可以建⽴多个solr。
solr默认没有core,我们先来创建⼀个core。
通过命令创建和删除core:# 创建core,-c指定创建的core名./solr create -c test_core1# 删除core,-c指定删除的core名./solr delete -c test_core1完成后回刷新solr界⾯,点击下拉“Core Selector”即可看到刚才建⽴的core,选择core即可进⼊core的管理界⾯,如下图。
solr+facet学习笔记

SOLR FACET学习笔记修改记录目录一.FACET简介 (3)二.FACET字段 (3)1.适宜被F ACET的字段 (3)2.F ACET字段的要求 (3)3.特殊情况 (3)三.FACET组件 (4)四.FACET查询 (4)1.F IELD F ACET (4)1.1facet.prefix (7)1.2facet.sort (7)1.3facet.limit (7)1.4facet.offset (8)1.5facet.mincount (8)1.6facet.missing (8)1.7facet.method (8)1.8facet.enum.cache.minDf (8)2.D ATE F ACET (8)2.1facet.date (8)2.2facet.date.start (8)2.3facet.date.end (8)2.4facet.date.gap (8)2.5facet.date.hardend (8)2.6facet.date.other (9)3.F ACET Q UERY (10)4.KEY操作符 (12)5.TAG操作符和EX操作符 (14)五.SOLRJ对FACET的支持 (17)一.Facet简介Facet是solr的高级搜索功能之一,可以给用户提供更友好的搜索体验.在搜索关键字的同时,能够按照Facet的字段进行分组并统计.二.Facet字段1.适宜被Facet的字段一般代表了实体的某种公共属性,如商品的分类,商品的制造厂家,书籍的出版商等等.2.Facet字段的要求Facet的字段必须被索引.一般来说该字段无需分词,无需存储.无需分词是因为该字段的值代表了一个整体概念,如电脑的品牌”联想”代表了一个整体概念,如果拆成”联”,”想”两个字都不具有实际意义.另外该字段的值无需进行大小写转换等处理,保持其原貌即可.无需存储是因为一般而言用户所关心的并不是该字段的具体值,而是作为对查询结果进行分组的一种手段,用户一般会沿着这个分组进一步深入搜索.3.特殊情况对于一般查询而言,分词和存储都是必要的.比如CPU类型”Intel 酷睿2双核P7570”,拆分成”Intel”,”酷睿”,”P7570”这样一些关键字并分别索引,可能提供更好的搜索体验.但是如果将CPU作为Facet字段,最好不进行分词.这样就造成了矛盾,解决方法为,将CPU字段设置为不分词不存储,然后建立另外一个字段为它的COPY,对这个COPY的字段进行分词和存储.schema.xml三.Facet组件Solr的默认requestHandler(ponent.SearchHandler)已经包含了Facet组件(ponent.FacetComponent).如果自定义requestHandler或者对默认的requestHandler自定义组件列表,那么需要将Facet加入到组件列表中去.solrconfig.xml四.Facet查询进行Facet查询需要在请求参数中加入”facet=on”或者”facet=true”只有这样Facet组件才起作用.1.Field FacetFacet字段通过在请求中加入”facet.field”参数加以声明,如果需要对多个字段进行Facet查询,那么将该参数声明多次.比如返回结果:各个Facet字段互不影响,且可以针对每个Facet字段设置查询参数.以下介绍的参数既可以应用于所有的Facet字段,也可以应用于每个单独的Facet字段.应用于单独的字段时通过这种方式调用.比如facet.prefix参数应用于cpu字段,可以采用如下形式1.1facet.prefix表示Facet字段值的前缀.比如”facet.field=cpu&facet.prefix=Intel”,那么对cpu字段进行Facet查询,返回的cpu都是以”Intel”开头的,”AMD”开头的cpu型号将不会被统计在内.1.2facet.sort表示Facet字段值以哪种顺序返回.可接受的值为true(count)|false(index,lex).true(count)表示按照count值从大到小排列. false(index,lex)表示按照字段值的自然顺序(字母,数字的顺序)排列.默认情况下为true(count).当facet.limit值为负数时,默认facet.sort= false(index,lex).1.3facet.limit限制Facet字段返回的结果条数.默认值为100.如果此值为负数,表示不限制.1.4facet.offset返回结果集的偏移量,默认为0.它与facet.limit配合使用可以达到分页的效果.1.5facet.mincount限制了Facet字段值的最小count,默认为0.合理设置该参数可以将用户的关注点集中在少数比较热门的领域.1.6facet.missing默认为””,如果设置为true或者on,那么将统计那些该Facet字段值为null的记录.1.7facet.method取值为enum或fc,默认为fc.该字段表示了两种Facet的算法,与执行效率相关.enum适用于字段值比较少的情况,比如字段类型为布尔型,或者字段表示中国的所有省份.Solr会遍历该字段的所有取值,并从filterCache里为每个值分配一个filter(这里要求solrconfig.xml里对filterCache的设置足够大).然后计算每个filter 与主查询的交集.fc(表示Field Cache)适用于字段取值比较多,但在每个文档里出现次数比较少的情况.Solr会遍历所有的文档,在每个文档内搜索Cache内的值,如果找到就将Cache 内该值的count加1.1.8facet.enum.cache.minDf当facet.method=enum时,此参数其作用,minDf表示minimum document frequency.也就是文档内出现某个关键字的最少次数.该参数默认值为0.设置该参数可以减少filterCache的内存消耗,但会增加总的查询时间(计算交集的时间增加了).如果设置该值的话,官方文档建议优先尝试25-50内的值.2.Date Facet日期类型的字段在文档中很常见,如商品上市时间,货物出仓时间,书籍上架时间等等.某些情况下需要针对这些字段进行Facet.不过时间字段的取值有无限性,用户往往关心的不是某个时间点而是某个时间段内的查询统计结果. Solr为日期字段提供了更为方便的查询统计方式.当然,字段的类型必须是DateField(或其子类型).需要注意的是,使用Date Facet时,字段名,起始时间,结束时间,时间间隔这4个参数都必须提供.与Field Facet类似,Date Facet也可以对多个字段进行Facet.并且针对每个字段都可以单独设置参数.2.1facet.date该参数表示需要进行Date Facet的字段名,与facet.field一样,该参数可以被设置多次,表示对多个字段进行Date Facet.2.2facet.date.start起始时间,时间的一般格式为”1995-12-31T23:59:59Z”,另外可以使用”NOW”,”YEAR”,”MONTH”等等,具体格式可以参考org.apache.solr.schema.DateField的java doc.2.3facet.date.end结束时间.2.4facet.date.gap时间间隔.如果start为2009-1-1,end为2010-1-1.gap设置为”+1MONTH”表示间隔1个月,那么将会把这段时间划分为12个间隔段.注意”+”因为是特殊字符所以应该用”%2B”代替.2.5facet.date.hardend取值可以为true|false,默认为false.它表示gap迭代到end处采用何种处理.举例说明start为2009-1-1,end为2009-12-25,gap为”+1MONTH”,hardend为false的话最后一个时间段为2009-12-1至2010-1-1;hardend为true的话最后一个时间段为2009-12-1至2009-12-25.2.6facet.date.other取值范围为before|after|between|none|all,默认为none.before会对start之前的值做统计.after会对end之后的值做统计.between会对start至end之间所有值做统计.如果hardend为true的话,那么该值就是各个时间段统计值的和.none表示该项禁用.all表示before,after,all都会统计.举例:返回结果:3.Facet QueryFacet Query利用类似于filter query的语法提供了更为灵活的Facet.通过facet.query 参数,可以对任意字段进行筛选.例1:返回结果:例2:返回结果:例3:返回结果:4.key操作符可以用key操作符为Facet字段取一个别名.例:返回结果:5.tag操作符和ex操作符当查询使用filter query的时候,如果filter query的字段正好是Facet字段,那么查询结果往往被限制在某一个值内.例:返回结果:可以看到,屏幕尺寸(screenSize)为14寸的产品共有107件,其它尺寸的产品的数目都是0,这是因为在filter里已经限制了screenSize:14.这样,查询结果中,除了screenSize=14的这一项之外,其它项目没有实际的意义.有些时候,用户希望把结果限制在某一范围内,又希望查看该范围外的概况.比如上述情况,既要把查询结果限制在14寸屏的笔记本,又想查看一下其它屏幕尺寸的笔记本有多少产品.这个时候需要用到tag和ex操作符.tag就是把一个filter标记起来,ex(exclude)是在Facet的时候把标记过的filter排除在外.例:返回结果:这样其它屏幕尺寸的统计信息就有意义了.五.SolrJ对Facet的支持。
Solr总结-吐血总结

FAILED SocketConnector@0.0.0.0:8983: .BindException: Address already in use: JVM_Bind就说明当前端口占用中.改一下就可以了.如果没有报错启动成功后就可以在浏览器中输入地址:http://localhost:8983/solr/就可以看到如下界面
例如,Field可以包含字符串、数字、布尔值或者日期,也可以包含你想添加的任何类型,只需用在solr的配置文件中进行相应的配置即可。Field可以使用大量的选项来描述,这些选项告诉Solr在索引和搜索期间如何处理内容。
现在,查看一下表1中列出的重要属性的子集:
属性名称
描述
Indexed
Indexed Field可以进行搜索和排序。你还可以在indexed Field上运行Solr分析过程,此过程可修改内容以改进或更改结果。
安装步骤请参考相应的帮助文档。
4.2
本文针对Solr4.2版本进行调研的,下文介绍内容均针对Solr4.2版本,如与Solr最新版本有出入请以官方网站内容为准。Solr官方网站下载地址:/solr/
4.3
Solr是使用Ant进行管理的源码,Ant是一种基于Java的build工具。理论上来说,它有些类似于Maven或者是C中的make。下载后解压出来后,进行环境变量设置。
Stored
stored Field内容保存在索引中。这对于检索和醒目显示内容很有用,但对于实际搜索则不是必需的。例如,很多应用程序存储指向内容位置的指针而不是存储实际的文件内容。
solr搭建(linux)

solr搭建(linux)
Solr版本:7.4.0
Tomcat版本:8.5
Jdk版本:1.8
最好在root用户下进行操作,为了更方便初学者理解,选用ubuntu操作,当然用命令操作过程是一样的,会命令操作的话看懂图形化操作自然会用命令进行搭建
1.上传并解压solr,把solr放到自己要安装的路径,下图是我的路径
2.把tomcat压缩包解压放到自己选定的路径中,下图是我的Tomcat目录
3.把solr部署到tomcat目录下
把solr目录里的server/solr-webapp/webapp文件夹复制到到所装tomcat目录下webapps目录中,并重命名为solr
4.server/lib/ext/下的所有jar复制到上图的solr/WEB-INF/lib/下
5.上图 server/lib/metrics* 开头的5个jar包也复制到 solr/WEB-INF/lib/下
6.将下边第一张图中的文件复制到第二张图的文件夹中(第二张图classes文件夹自建)
7.创建一个solrhome文件夹(路径自己选择),下图是我的位置
把解压的solr目录中的如下图路径中所有文件复制到solrhome 中
8.使solr项目和solrhome关联起来
需要修改tomcat里solr工程的web.xml文件
找到下图位置,修改自己的solrhome路径为自己的路径(初始时这段是被注释的,去掉注释):
再找到该文件最下方,把红框内的内容注释掉
9.大功告成,进入tomcat目录,启动tomcat
进行访问:浏览器中输入IP地址:端口号/solr/index.html,便能访问到solr页面。
ApacheSolr入门教程(初学者之旅)

ApacheSolr⼊门教程(初学者之旅)Apache Solr⼊门教程(初学者之旅)写在前⾯:本⽂涉及solr⼊门的各⽅⾯,建议边思考边实践,相信能帮助你对solr有个清晰全⾯的了解并能简单实⽤。
在Apache Solr初学者教程的这个例⼦中,我们将讨论有关如何安装最新版本的Apache Solr,并告诉你如何配置它。
此外,我们将告诉你如何进⾏使⽤solr的样本数据⽂件索引。
Apache Solr⽀持不同格式,包括各种数据库,PDF⽂件,XML⽂件,CSV⽂件等等。
在这个例⼦中,我们将研究如何从⼀个CSV⽂件索引数据。
⾸选这个例⼦的环境是Windows。
开始Solr安装之前,确保你已经安装了JDK和正确配置JAVA_HOME。
1.为什么选择Apache SolrApache Solr是⼀个功能强⼤的搜索服务器,它⽀持REST风格API。
Solr是基于Lucene的,Lucene ⽀持强⼤的匹配能⼒,如短语,通配符,连接,分组和更多不同的数据类型。
它使⽤ Apache Zookeeper特别针对⾼流量进⾏优化。
Apache Solr提供各式各样的功能,我们列出了部分最主要的功能。
1. 先进的全⽂搜索功能。
2. XML,JSON和HTTP - 基于开放接⼝标准。
3. ⾼度可扩展和容错。
4. 同时⽀持模式和⽆模式配置。
5. 分页搜索和过滤。
6. ⽀持像英语,德语,中国,⽇本,法国和许多主要语⾔7. 丰富的⽂档分析。
2.安装Apache Solr要⾸先让从以下位置下载最新版本的Apache Solr:在撰写本⽂时,可⽤的稳定版本是5.0.0。
Apache Solr经历了从4.XX到5.0.0各种变化了,所以如果你有不同版本的Solr,你需要下载5.xx版本并以此为模板。
⼀旦Solr的zip⽂件下载将它解压缩到⼀个⽂件夹。
提取的⽂件夹看起来像下⾯。
Solr的⽂件夹bin⽂件夹中包含⽤来启动和停⽌服务器的脚本。
solr环境搭建基本使用

stored=”true” 是否存储索引 type=”textCpmplex” 设置该字段
修改
三、Solr使用 1、添加索引 1.1、solrServer初始化
1.2、添加单条索引
1.3 添加集合中数据到solr索引
1.4、将javabean中的数据添加到solr索引
8.3、将中文分词添加到FieldType中
二、Solr使用配置步骤 1、配置solr schema.xml文件 1、1配置应用中用到的自定义field域(因场景而定) 例子如下:
属性说明: multiValued="true" 设置多值域 indexed=”true” 是否设置索引 支持中文分词 name=”你设置的 字段名称”
5、在tomcat server.xml 设置相应的context
6、为context设置相应的环境变量,说明solr的主目录的地址
7、在solrconfig.xml文件中取消VelocityResponseWriter这种输出格式
8、加入中文分词 8.1、下载中文分词器 8.2、将中文分词的包拷贝到server的lib中
找到solr data 索引目录 即可看到分词结果
工程诗博主写的确实没有问题只是他先lr服务与tomcat整合 2. solr使用配置步骤 3. solr使用 4. 推荐分词工具
相关的文章
solr环 境 搭 建 基 本 使 用
一.Solr服务与tomcat整合 2、将solr中的example中的solr拷贝到要作为服务器的位置 3、将相应的solr的web程序也拷贝出来 4、修改solr-->home文件夹中的solrconfig.xml设置data的路径
solr搭建总结

一、环境准备1、Jdk1.8(配置好环境变量)2、tomact8.03、solr-6.6.0二、整合tomcat+solr1、拷贝solr-6.6.0文件路径(solr-6.6.0\server\solr-webapp)下的webapps到tomcat的webapps下作为web项目并修改名称为solr2、jar包拷贝:solr-6.6.0文件路径(solr-6.6.0\server\lib\ext,server/lib/metrics* 开头的jar,solr-6.6.0/dist/ 的jar)下的jar全部放到tomcat下的webapps/solr/WEB-INF/lib下3、拷贝solr-6.6.0文件路径(\solr-6.6.0\server\resources)下的log4j.properties放到tomcat下的webapps/solr/WEB-INF/classes(classes没有的话,要自己创建)4、创建solrhome,用于存放索引的文件夹(可以自定义命名,此处命名solrhome):拷贝文件路径solr-6.6.0\server\solr下的所有文件到已创建的solrhome中5、solrhome路径配置,此处提供两种配置方式:(1)找到tomcat下的webapps/solr/WEB-INF下的web.xml,在此处配置solrhome的绝对路径(2)通过JNDI的方式配置到Tomcat服务器中:将solrhome放置到tomcat的webapps/solr/下,tomcat路径(\conf\Catalina\localhost)下创建solr.xml文件,文件内容如下此种方式,通过启动tomcat自动获得solrhome的路径二、整合solr+oracle1、数据库驱动包(ojdbc8.jar)放到tomcat/webapps/solr/web-inf/lib中2、Solrhome中创建索引的core,新建文件夹命名my_core(根据具体需求命名)拷贝文件路径(solr-6.6.0\example\example-DIH\solr\solr)的全部文件到my_core文件下,然后通过solr自带的创建core的页面添加name和i nstanceDir都为my_core的core3、进入my_core/conf,打开solrconfig.xml,引入数据源的xml文件,找到下面配置修改4、创建data-config.xml文件,配置数据源链接,以及数据源执行sql,字段,表关联关系5、配置managed-schema文件,其中配置要建立索引的字段,分词器,以及字段合并查询。
SOLR搭建方案For Linux

SOLR部署手册一、安装JDK从/javase/downloads/index.jsp下载JDK的RPM安装包jdk-6u16-linux-i586-rpm.bin,放在/home/apps(临时目录)下,在SSH Client中执行:# sh /home/apps/jdk-6u16-linux-i586-rpm.bin根据提示信息进行安装,默认会安装在/usr/java目录下。
安装完成后,执行:# java -version显示当前JRE版本,如果不是1.6.0_16(默认会安装较低版本1.4),则需要进行配置修改。
执行:# vi /etc/profile加入以下内容:JAVA_HOME=/usr/java/jdk1.6.0_16CLASSPATH=.:$JAVA_HOME/lib/tools.jarPATH=$JAVA_HOME/bin:$PATHexport JAVA_HOME CLASSPATH PATH重新启动系统,就可以了。
二、安装TOMCAT(1)从/download-60.cgi下载Tomcat 6的安装包:apache-tomcat-6.0.20.tar.gz放在/home/apps下,在SSH Client中执行:# tar zxvf apache-tomcat-6.0.20.tar.gz# cp -a apache-tomcat-6.0.20.tar.gz /usr/local/LinuxSolr/apache-tomcat-6.0.20# cd /usr/local/LinuxSolr/apache-tomcat-6.0.20/bin# ./startup.sh(2)启动Tomcat,此时仍不能访问,需进行SolrHome的设置(Solr_Home目录用于存放配置文件和索引数据)。
拷贝源代码目录中的example/solr到/usr/local/LinuxSolr/,命名为Solr_Home,在tomcat的webapps/solr/WEB_INF/web.xml 取消下面的注释并进行目录的修改<env-entry><env-entry-name>solr/home</env-entry-name><env-entry-value>此处修改为你刚才的Solr_Home的绝对路径或相对路径</env-entry-value><env-entry-type>ng.String</env-entry-type></env-entry>如下图所示:(3)此时重启tomcat仍然报错,缺少相应的jar包拷贝solr4.7源文件包中example/lib/ext/中的jar包到Tomcat下webapps/solr/WEB-INF/lib 下再拷贝solr4.7源文件包中example/resources/log4j.properties 到Tomcat/webapps/solr/classes(此目录需自建)。
Solr学习笔记

q 关键字模糊查询q.op=OR连接连接符,AND OR NOThl=true开启高亮hl.fl=name,features设置高亮字段,默认用<em></em>包裹facet true/false 开启分组facet.field指定排序字段fqmanu:Belkin指定字段精确查找sort price asc按指定字段排序start 0 当前页开始记录索引编号,从0开始计算rows 10 每页显示几条flname,price, 查询返回结果集包含哪些字段,score字段是内置字段df text 查询字段类型wt xml 返回数据类型get方式请求:http://localhost:8983/solr/collection1/select?q=iPod&fq=manu%3ABelkin&sort=price+asc&fl=na me%2Cprice%2Cfeatures%2Cscore&df=text&wt=xml&start=0&rows=10返回的XML数据格式如下:<response><lst name="responseHeader"><int name="status">0</int><int name="QTime">47</int><lst name="params"><str name="df">text</str><str name="fl">name,price,features,score</str><str name="sort">price asc</str><str name="start">0</str><str name="q">iPod</str><str name="wt">xml</str><str name="fq">manu:Belkin</str><str name="rows">10</str></lst></lst><result name="response" numFound="0" start="0" maxScore="0.0"/></response>返回的JSON数据格式如下:{"responseHeader":{"status":0,"QTime":0,"params":{"df":"text","fl":"n ame,price,features,score","sort":"priceasc","start":"0","q":"iPod","wt":"json","fq":"manu:Belkin","rows":"10 "}},"response":{"numFound":0,"start":0,"maxScore":0.0,"docs":[]}}Query: title:(solr in action)^2.5 description:(solr in action)Solr在Tomcat下部署:Solr.war解压开,把E:\solr-4.7.2\example\lib\ext下的所有jar包copy到E:\apache-tomcat-7.0.47\webapps\solr\WEB-INF\lib下在E:\apache-tomcat-7.0.47\webapps\solr\WEB-INF\下新建classes目录,把E:\solr-4.7.2\example\resources目录下的log4j.properties配置文件copy到E:\apache-tomcat-7.0.47\webapps\solr\WEB-INF\classes下,修改E:\apache-tomcat-7.0.47\webapps\solr\WEB-INF下的web.xml配置文件,添加如下配置:<env-entry><env-entry-name>solr/home</env-entry-name><env-entry-value>C:\solrHome</env-entry-value><env-entry-type>ng.String</env-entry-type></env-entry>C:\solrHome是我配置的Solr主目录,把E:\solr-4.7.2\example下的示例copy到solrHome目录下,如上图:conf用来存放solr配置文件,data是solr用来存放索引文件和日志文件的lib是依赖的第三方jar包Schema.xml配置示例:下面这是ansj分词器和MMSeg分词器的配置:solrconfig.xml配置示例:可以从solr的example下的示例工程里copy一份,然后如图添加数据导入配置,数据导入是在data-config.xml中配置的data-config.xml配置示例:配置数据库的JDBC链接url驱动类数据库帐号密码什么的,一看就懂的,就不解释了,我的测试表结构截图如下:别忘记添加mysql 驱动包,如图:把solr的war包copy到tomcat的webapps目录下,如果需要使用IK分词器的自定义词典和停用词词典,还需要把IK的配置文件以及相关词典文件copy到web-inf/classes文件夹下,如图:IK分词器配置文件IKAnalyzer.cfg.xml配置如下:启动Tomcat,访问如下url进入solr后台: http://localhost:8080/solr/admin选择运行哪个solr实例,查询测试:deletedpkquery:增量删除,数据库标记isdeleted=1后,更新solr删除文档批量导入(full-import):http://localhost:8080/solr/dataimport?command=full-import&commit=true增量导入(delta-import):http://localhost:8080/solr/dataimport?command=delta-import&commit=true导入状态查询(status):http://localhost:8080/solr/dataimport重新装载配置文件(reload-config):http://localhost:8080/solr/dataimport?command=reload-config终止导入(abort):http://localhost:8080/solr/dataimport?command=abortclean=true 表示创建索引之前先删除原有索引。
Solr学习

发往多个搜索引擎,在接收到各个搜索引擎返回的结果后, 根据一定得排序算法重新排序后返回给用户。
串行式元搜索引擎仅提供一个搜索引擎的列表,由用户选
择使用哪个搜索引擎来进行查询,因此它可以说是“搜索 引擎的搜索引擎” ,帮助用户进行搜索引擎的选择。
开源搜索引擎Lucene家族
Nutch是以Lucene为基础的Web搜索引擎,利用它可以快
Lucene与Solr的关系
Solr是Lucene的一个子项目,
它在Lucene的基础上进行包 装,成为一个企业级搜索 服务器开发框架。
Solr与Lucene的主要区别
Solr
主控
体现在:
Solr更加贴近实际应用,
是Lucene在面向企业搜索 服务领域的扩展; Solr的缓存等机制使全文 检索获得性能上的提升; 通过配置文件的开发使 得Solr具有良好的扩展性; Solr提供了用户友好的管 理界面与查询结果界面。
相关排序
相关排序(relevance ranking)是指信息检索系统返回结果的
排序,排序结果反应了文档与查询的相关程度。在搜索引 擎领域,相关排序不仅仅考虑查询与文档的相关程度,还 应该考虑链接间的相互关系(主要指Web搜索引擎)与网站 的重要程度等等。
电子科技大学的汪文勇提出:研究搜索引擎的页面优先度
space model ,VSM)由Gerald Salton提出,该模型用于 计算文档与查询的相关程度,仅仅实用于普通文本。 Web搜索引擎的结果排序: 对于web搜索引擎,搜索 结果排序不仅仅考虑查询词与文档之间的关系,还 需要考虑查询词在网页文件中的显示位置、显示状 态以及链接和被连接关系。
索引式搜索引擎依靠一个被称作蜘蛛(Spider)或
solr学习笔记

2.关于solr多核的问题可以参照solr。
Xml例子如下:<solr persistent="true" sharedLib="lib"><cores adminPath="/admin/cores"><core name="core0" instanceDir="core0" /><core name="core1" instanceDir="core1" /></cores></solr>这就是多核的配置。
这里的core0是solr/example/solr下的内容,即copy example/solr下的内容到core0中Any subclass of FieldType may be used as a field type class, using either its full package name, or the "solr" alias if it is in the default Solr package.fieldType中的类是全路径名或者用solr替代路径如果在默认的Solr包中的话Field types that store text (TextField, StrField) support compression of stored contents:域类型存储文本时支持存储内容压缩compression support was removed in 1.4.1 压缩支持在1.4.1中被删除了。
Recommended fields推荐域While these fields aren't strictly mandatory (Solr will run if you remove them fully), Bad Things happen in some situations if they aren't defined. We recommend that you leave these fields alone. If you don't use them, there's no appreciable penalty这些域不是严格强制要求的,如果你把他们全部删除,solr也会运行。
Solr单机版搭建

1.搜索工程搭建表现层服务层持久层要实现搜索功能,需要搭建solr服务、搜索服务工程、搜索系统1.1.S olr服务搭建1.1.1.Solr的环境Solr是java开发。
需要安装jdk。
安装环境Linux。
需要安装Tomcat。
1.1.2.搭建步骤第一步:把solr 的压缩包上传到Linux系统第二步:解压solr。
第三步:安装Tomcat,解压缩即可。
第四步:把solr部署到Tomcat下。
第五步:解压缩war包。
启动Tomcat解压。
第六步:把/root/solr-4.10.3/example/lib/ext目录下的所有的jar包,添加到solr工程中。
[root@localhost ext]# pwd/root/solr-4.10.3/example/lib/ext[root@localhost ext]# cp * /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/第七步:创建一个solrhome。
/example/solr目录就是一个solrhome。
复制此目录到/usr/local/solr/solrhome[root@localhost example]# pwd/root/solr-4.10.3/example[root@localhost example]# cp -r solr /usr/local/solr/solrhome[root@localhost example]#第八步:关联solr及solrhome。
需要修改solr工程的web.xml文件。
第九步:启动Tomcathttp://192.168.25.154:8080/solr/和windows下的配置完全一样。
1.1.3.Solr的使用添加文档必须有id域,其他域必须在solr的schema.xml中定义。
1.2.配置业务域schema.xml中定义1、商品Id2、商品标题3、商品卖点4、商品价格5、商品图片6、分类名称7、商品描述创建对应的业务域。
solr笔记

Solr全文搜索服务1课程计划1、solr介绍2、solr安装配置(重点)3、solr的基本使用(重点)4、solrj的使用(重点)5、京东案例(重点)2Solr介绍2.1什么是solrSolr也是Apache下一个项目,它是使用java开发的,它是基于Lucene的全文搜索服务器。
Solr如何进行索引和搜索索引:客户端(可以是浏览器可以是java程序)发送post请求到solr服务器,发给solr服务器一个文档(xml、json),就可以进行一个添加索引删除索引、修改索引的操作。
搜索:客户端(可以是浏览器可以是java程序)发送get请求到solr服务器,请求solr服务器给它响应一个结果文档(xml、json),程序员拿到这些文档就可以对其进行解析。
进行视图渲染。
Solr本身没有UI界面的功能。
2.2Solr和lucene的区别Lucene是一个全文检索的工具包,它是一堆jar包,不能单独运行,即不能独立对外提供服务。
Solr是一个全文搜索服务器,它可以独立运行,它能独立对外提供搜索和索引服务。
使用lucene开发站内搜索的话,程序员编写的代码量会比较大,而且在搜索和索引流程得考虑他的性能。
使用solr开发站内搜索的话,程序员只需编写少量的代码,快速的搭建出来站内搜索功能。
而且性能方面不需要程序员去考虑,solr对它已经进行了处理。
3Solr安装配置3.1Solr下载Solr和lucene的版本是同步更新的,最新的版本是5.2.1本课程使用的版本:4.10.3下载地址:/dist/lucene/solr/下载版本:4.10.3Linux下需要下载lucene-4.10.3.tgz,windows下需要下载lucene-4.10.3.zip。
Bin:solr的脚本Contrib:solr为了增强自身的功能,所添加的扩展依赖包Dist:solr build过程时产生的war包和jar包,还有它的一些依赖包Docs:文档Example:例子目录Solr:配置了solr运行时的信息,它是一个标准的solrhome目录Multicore:可以配置多个SolrCore实例Webapps:solr.war的目录Licenes:版本信息3.2SolrCore的安装配置3.2.1Solrhome和SolrCoreSolrhome是一个目录,它是solr运行的主目录,它包括多个SolrCore目录,SolrCore目录中就solr实例的运行配置文件和数据文件。
solrcloud搭建全面总结

solrcloud集群搭建1什么是SolrCloud1.1什么是SolrCloudSolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用SolrCloud。
当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。
1.2SolrCloud结构SolrCloud为了降低单机的处理压力,需要由多台服务器共同来完成索引和搜索任务。
实现的思路是将索引数据进行Shard(分片)拆分,每个分片由多台的服务器共同完成,当一个索引或搜索请求过来时会分别从不同的Shard的服务器中操作索引。
SolrCloud需要Solr基于Zookeeper部署,Zookeeper是一个集群管理软件,由于SolrCloud 需要由多台服务器组成,由zookeeper来进行协调管理。
下图是一个SolrCloud应用的例子:对上图进行图解,如下:注:1、一个分片有且只有一个主服务节点。
2、collection 是完整体,内容分别存放在各个shard中3、一个shard中的每个core的数据是一致的。
4、从上图可以看出,core才是存放数据的物理结构1.2.1物理结构三个Solr实例(每个实例包括两个Core),组成一个SolrCloud。
1.2.2逻辑结构索引集合包括两个Shard(shard1和shard2),shard1和shard2分别由三个Core组成,其中一个Leader两个Replication,Leader是由zookeeper选举产生,zookeeper控制每个shard 上三个Core的索引数据一致,解决高可用问题。
用户发起索引请求分别从shard1和shard2上获取,解决高并发问题。
注:zk会自动把一个shard上的core创建在不同solr服务上,如下,两个服务器各起了一个solr服务。
Solr学习笔记(一)

Solr学习笔记(⼀)最近准备为⼀个产品做⼀个站内的搜索引擎,是⼀个java产品。
由于原来做过,所以⾃然⽽然的就想到了使⽤Lucene。
在复习Lucene的过程中发现了这个和Lucene绑定在⼀起的Apache的⼦项⽬,发现这个搜索服务器正是我们想要的。
原来我们做Lucene,会把索引和搜索都放在同⼀个⽹站下,也就是在⽹站启动的时候,或定时在⽹站应⽤程序中进⾏Lucene的初始化和索引,并使⽤Lucene搜索API提供搜索服务。
这个过程,应⽤⽹站既提供了搜索内容的提供者(从数据库或⽂件提取数据给Lucene索引),也是搜索内容的索引者,⼜是⽤户搜索服务的结果提供者。
这很明显是不够理想的,特别是在分布式集群部署环境下。
Solr的出现,正好帮助我们解决了这个问题。
单⼀的搜索服务被独⽴出来,提供数据的索引和搜索,并且这个搜索服务可以⽅便的为多个应⽤进⾏服务。
余下的就是把搜索内容提供者也分离出来,形成⼀个或多个独⽴的服务。
这样服务于服务之间的耦合就降低了,业务和功能的变化,都可以在某⼀个⾓⾊服务中处理,⽽不需要影响其他的服务。
最重要的,Solr可以提供基于Http和XML的Web API,使它可以跨平台和语⾔进⾏服务。
集群和分布式部署也变的更容易、风险更低,并且会更有针对性。
新的搜索架构就会变成下图这样:solr的安装⾸先我们先来安装solr。
安装solr⽐较简单。
我的安装是在windows环境下进⾏,tomcat7 + solr 10.1。
1. 在⽹上下载solr的安装包,解压缩⽂件。
2. 找到solr.war⽂件,把⽂件复制到tomcat的webapps⽂件夹下,在这之前如果你的tomcat是运⾏着的,则先要停⽌运⾏。
3. 把example\resources\log4j.properties 复制到 $CATALINA_HOME/lib/ ⽬录下。
4. 然后把下载包中的solr-4.x.0/example/solr⽂件夹复制到你希望存储的本地⽂件夹D:\solr下,这个⽂件夹会作为solr索引⽂件的存放⽬录:$SOLR_HOME。
自学slor服务搭建过程

Solr服务搭建1、往虚拟机上添加solr-4.10.3文件以及tomcat安装包用于部署solr服务2、在此路径下建一个文件夹:mkdir/usr/local/solr3、然后将tomcat文件复制到该路径下:cp –rtomcat安装包/usr/local/solr/tomcat;使用tomcat名字4、然后将solr安装包下的dist文件夹下的solr-4.10.3.war包复制到tomcat下的webapps:cp solr-4.10.3.war/usr/local/solr/tomcat/webapps/solr.war5、将war包解压缩,启动tomcat用于解压缩:cd /usr/local/solr/tomcatbin/startup.sh查看日志:tail –f logs/catalina.out6、关掉tomcat后删除solr.war:bin/shutdown.shrm –f webapps/solr.war;具体路径看自己的安装路径7、将solr安装文件夹下的example下的lib的ext文件夹下的jar全部复制到该路径下:cp */usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/8、再将example文件下的solr文件复制到该路径下:cp –r solr /usr/local/solr/solrhome9、进入该路径:cd /usr/local/solr10、配置solrhome的路径:vitomcat/webapps/solr/WEB-INF/web.xml 11、将env-entry标签的注释删掉,然后将env-entry-value路径改为:/usr/local/solr/solrhome/12、保存之后启动tomcat就ok了!13、然后在浏览器上输入虚拟机ip:8080,看到如下页面就启动成功了!。
Solr入门实战(4)--Java操作Solr

Solr⼊门实战(4)--Java操作Solr本⽂主要介绍使⽤ Java 来操作 Solr,⽂中所使⽤到的软件版本:Java 1.8.0_191、Solr 8.9.0。
1、定义 Schema 信息假设⼀个描述诗⼈信息的⽂档包含如下字段:字段描述id唯⼀主键age年龄name姓名poems诗歌about简介success成就定义的 schema 信息如下:<field name="about" type="text_ik" uninvertible="true" indexed="true" stored="true"/><field name="age" type="pint" uninvertible="true" indexed="true" stored="true"/><field name="content" type="text_ik" uninvertible="true" indexed="true" stored="true" multiValued="true"/><field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/><field name="name" type="text_ik" uninvertible="true" indexed="true" stored="true"/><field name="poems" type="text_ik" uninvertible="true" indexed="true" stored="true"/><field name="success" type="text_ik" uninvertible="true" indexed="true" stored="true"/>2、Java 操作 Solr2.1、引⼊依赖<dependency><groupId>org.apache.solr</groupId><artifactId>solr-solrj</artifactId><version>8.9.0</version></dependency><dependency><groupId>org.apache.solr</groupId><artifactId>solr-core</artifactId><version>8.9.0</version></dependency>2.2、编写 demo2.2.1、增加/更新⽂档@Testpublic void update() throws IOException, SolrServerException {SolrInputDocument document = new SolrInputDocument();document.addField("id", "123456");document.addField("age", 30);document.addField("name", "李⽩2");document.addField("poems", "望庐⼭瀑布");document.addField("about", "字太⽩");document.addField("success", "创造了古代浪漫主义⽂学⾼峰、歌⾏体和七绝达到后⼈难及的⾼度");SolrInputDocument document2 = new SolrInputDocument();document2.addField("id", "123457");document2.addField("age", 31);document2.addField("name", "杜甫");document2.addField("poems", "望岳");document2.addField("about", "字⼦美");document2.addField("success", "唐代伟⼤的现实主义⽂学作家,唐诗思想艺术的集⼤成者");solrClient.add(coreName, document);solrClient.add(coreName, document2);mit(coreName, true,true);}还可以通过实体类来增加/更新⽂档:@Testpublic void update2() throws IOException, SolrServerException {PoetInfo info = new PoetInfo("123456", 40, "李⽩", "望庐⼭瀑布", "字太⽩", "创造了古代浪漫主义⽂学⾼峰、歌⾏体和七绝达到后⼈难及的⾼度"); solrClient.addBean(coreName, info);mit(coreName, true,true);}2.2.2、查询⽂档/*** 通过 MapSolrParams 查询*/@Testpublic void query() throws IOException, SolrServerException {Map<String, String> map = new HashMap<>();//查询条件map.put("q", "*:*");//要显⽰的内容map.put("fl", "id,age,name,poems");//排序⽅式map.put("sort", "id asc");MapSolrParams solrParams = new MapSolrParams(map);QueryResponse queryResponse = solrClient.query(coreName, solrParams); SolrDocumentList documents = queryResponse.getResults();("查询到{}个⽂档!", documents.getNumFound());for (SolrDocument document : documents) {String id = (String)document.getFieldValue("id");Integer age = (Integer)document.getFieldValue("age");String name = (String)document.getFieldValue("name");String poems = (String)document.getFieldValue("poems");("id={},age={},name={},poems={}", id, age, name, poems);}}/*** 通过 solrQuery 查询*/@Testpublic void query2() throws IOException, SolrServerException {SolrQuery solrQuery = new SolrQuery("*:*");solrQuery.addField("id");solrQuery.addField("age");solrQuery.addField("name");solrQuery.addField("poems");solrQuery.addSort("id", SolrQuery.ORDER.asc);//设置返回的⾏数solrQuery.setRows(10);QueryResponse queryResponse = solrClient.query(coreName, solrQuery); SolrDocumentList documents = queryResponse.getResults();("查询到{}个⽂档!", documents.getNumFound());for (SolrDocument document : documents) {String id = (String)document.getFieldValue("id");Integer age = (Integer)document.getFieldValue("age");String name = (String)document.getFieldValue("name");String poems = (String)document.getFieldValue("poems");("id={},age={},name={},poems={}", id, age, name, poems);}}/*** 查询返回实例类对象*/@Testpublic void query3() throws IOException, SolrServerException {SolrQuery solrQuery = new SolrQuery("*:*");solrQuery.addField("id");solrQuery.addField("age");solrQuery.addField("name");solrQuery.addField("poems");solrQuery.addField("about");solrQuery.addField("success");solrQuery.addSort("id", SolrQuery.ORDER.asc);//设置返回的⾏数solrQuery.setRows(10);QueryResponse queryResponse = solrClient.query(coreName, solrQuery); List<PoetInfo> list = queryResponse.getBeans(PoetInfo.class);("查询到{}个⽂档!", list.size());for (PoetInfo info : list) {(info.toString());}}2.2.3、删除⽂档/*** 根据id删除⽂档*/@Testpublic void delete() throws IOException, SolrServerException {solrClient.deleteById(coreName, "123456");mit(coreName, true,true);}/*** 根据查询删除⽂档*/@Testpublic void delete2() throws IOException, SolrServerException {solrClient.deleteByQuery(coreName, "name:杜甫");mit(coreName, true,true);}2.2.4、完整代码package com.abc.demo.general.solr;import org.apache.solr.client.solrj.beans.Field;public class PoetInfo {@Fieldprivate String id;@Fieldprivate Integer age;@Fieldprivate String name;@Fieldprivate String poems;@Fieldprivate String about;@Fieldprivate String success;public PoetInfo() {}public PoetInfo(String id, Integer age, String name, String poems, String about, String success) { this.id = id;this.age = age; = name;this.poems = poems;this.about = about;this.success = success;}@Overridepublic String toString() {return "Info{" +"id='" + id + '\'' +", age=" + age +", name='" + name + '\'' +", poems='" + poems + '\'' +", about='" + about + '\'' +", success='" + success + '\'' +'}';}public String getId() {return id;}public void setId(String id) {this.id = id;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getName() {return name;}public void setName(String name) { = name;}public String getAbout() {return about;}public void setAbout(String about) {this.about = about;}public String getSuccess() {return success;}public void setSuccess(String success) {this.success = success;}}PoetInfopackage com.abc.demo.general.solr;import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.SolrServerException;import org.apache.solr.client.solrj.impl.HttpSolrClient;import org.apache.solr.client.solrj.response.QueryResponse;import mon.SolrDocument;import mon.SolrDocumentList;import mon.SolrInputDocument;import mon.params.MapSolrParams;import org.junit.After;import org.junit.Before;import org.junit.Test;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;import java.util.HashMap;import java.util.List;import java.util.Map;public class SolrCase {private static Logger logger = LoggerFactory.getLogger(SolrCase.class);private HttpSolrClient solrClient;private String coreName = "new_core";@Beforepublic void before() {solrClient = new HttpSolrClient.Builder("http://10.40.100.69:8983/solr").withConnectionTimeout(10000).withSocketTimeout(60000).build();}@Afterpublic void after() throws IOException {solrClient.close();}@Testpublic void update() throws IOException, SolrServerException {SolrInputDocument document = new SolrInputDocument();document.addField("id", "123456");document.addField("age", 30);document.addField("name", "李⽩2");document.addField("poems", "望庐⼭瀑布");document.addField("about", "字太⽩");document.addField("success", "创造了古代浪漫主义⽂学⾼峰、歌⾏体和七绝达到后⼈难及的⾼度"); SolrInputDocument document2 = new SolrInputDocument();document2.addField("id", "123457");document2.addField("age", 31);document2.addField("name", "杜甫");document2.addField("poems", "望岳");document2.addField("about", "字⼦美");document2.addField("success", "唐代伟⼤的现实主义⽂学作家,唐诗思想艺术的集⼤成者");solrClient.add(coreName, document);solrClient.add(coreName, document2);mit(coreName, true,true);}@Testpublic void update2() throws IOException, SolrServerException {PoetInfo info = new PoetInfo("123456", 40, "李⽩", "望庐⼭瀑布", "字太⽩", "创造了古代浪漫主义⽂学⾼峰、歌⾏体和七绝达到后⼈难及的⾼度"); solrClient.addBean(coreName, info);mit(coreName, true,true);}/*** 通过 MapSolrParams 查询*/@Testpublic void query() throws IOException, SolrServerException {Map<String, String> map = new HashMap<>();//查询条件map.put("q", "*:*");//要显⽰的内容map.put("fl", "id,age,name,poems");//排序⽅式map.put("sort", "id asc");MapSolrParams solrParams = new MapSolrParams(map);QueryResponse queryResponse = solrClient.query(coreName, solrParams);SolrDocumentList documents = queryResponse.getResults();("查询到{}个⽂档!", documents.getNumFound());for (SolrDocument document : documents) {String id = (String)document.getFieldValue("id");Integer age = (Integer)document.getFieldValue("age");String name = (String)document.getFieldValue("name");String poems = (String)document.getFieldValue("poems");("id={},age={},name={},poems={}", id, age, name, poems);}}/*** 通过 solrQuery 查询*/@Testpublic void query2() throws IOException, SolrServerException {SolrQuery solrQuery = new SolrQuery("*:*");solrQuery.addField("id");solrQuery.addField("age");solrQuery.addField("name");solrQuery.addField("poems");solrQuery.addSort("id", SolrQuery.ORDER.asc);//设置返回的⾏数solrQuery.setRows(10);QueryResponse queryResponse = solrClient.query(coreName, solrQuery);SolrDocumentList documents = queryResponse.getResults();("查询到{}个⽂档!", documents.getNumFound());for (SolrDocument document : documents) {String id = (String)document.getFieldValue("id");Integer age = (Integer)document.getFieldValue("age");String name = (String)document.getFieldValue("name");String poems = (String)document.getFieldValue("poems");("id={},age={},name={},poems={}", id, age, name, poems);}}/*** 查询返回实例类对象*/@Testpublic void query3() throws IOException, SolrServerException {SolrQuery solrQuery = new SolrQuery("*:*");solrQuery.addField("id");solrQuery.addField("age");solrQuery.addField("name");solrQuery.addField("poems");solrQuery.addField("about");solrQuery.addField("success");solrQuery.addSort("id", SolrQuery.ORDER.asc);//设置返回的⾏数solrQuery.setRows(10);QueryResponse queryResponse = solrClient.query(coreName, solrQuery);List<PoetInfo> list = queryResponse.getBeans(PoetInfo.class);("查询到{}个⽂档!", list.size());for (PoetInfo info : list) {(info.toString());}}/*** 根据id删除⽂档*/@Testpublic void delete() throws IOException, SolrServerException {solrClient.deleteById(coreName, "123456");mit(coreName, true,true);}/*** 根据查询删除⽂档*/@Testpublic void delete2() throws IOException, SolrServerException {solrClient.deleteByQuery(coreName, "name:杜甫");mit(coreName, true,true);}}SolrCase3、Java 操作 SolrCloudJava 操作 SolrCloud 与 Java 操作 Solr 很类似,主要区别有:1、连接使⽤的类不同,连接 Solr 使⽤的是 HttpSolrClient,连接 SolrColud 使⽤的是 CloudHttp2SolrClient。
Solr 学习笔记

Solr笔记Solr 是一种可供企业使用的、基于Lucene 的搜索服务器,它支持层面搜索、命中醒目显示和多种输出格式。
在这篇分两部分的文章中,Lucene Java™ 的提交人Grant Ingersoll 将介绍Solr 并向您展示如何轻松地将其表现优异的全文本搜索功能加入到Web 应用程序中。
一旦用户需要某种信息,就可以立即搜索到这些信息,这种要求再也不是可有可无的了。
随着Go ogle 和类似的复杂搜索引擎的出现,用户希望得到高质量的搜索结果,帮助他们快速、轻易地找到所需的信息。
经理对您的在线购物站点同样抱有很高的期望,要求它能够提供一个可伸缩、高度可用且易于维护的搜索解决方案,并且安装这个解决方案不应太昂贵。
对于您而言,只是希望事业进步,让老板和客户满意,以及保持头脑清醒。
使用Apache Solr 可以满足所有的这些要求,它是一种开放源码的、基于Lucene Java 的搜索服务器,易于加入到Web 应用程序中。
Solr 提供了层面搜索、命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON 格式)。
它易于安装和配置,而且附带了一个基于HTTP 的管理界面。
您可以坚持使用Solr 的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。
Solr 还拥有一个活跃的开发者群体,如有需要,您可以随时向他们寻求帮助。
Solr 的历史Solr 最初由CNET Networks 开发,2006 年初,Apache Software Foundation 在Lucene 顶级项目的支持下得到了Solr。
Solr 于2007 年 1 月酝酿成熟,在整个项目孵化期间,Solr 稳步地积累各种特性并吸引了一个稳定的用户群体、贡献者和提交人。
Solr 现在是Lucene(Apache 的基于J ava 的全文本搜索引擎库)的一个子项目。
安装和配置要开始使用Solr,需安装以下软件:Java 1.5 或更高版本。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Solr学习笔记由于公司一个网站需要实现搜索功能的更新换代,在和编辑和领导沟通了一段时间之后,我们决定不再使用之前的通过JDBC发送sql语句进行搜索的方法。
一番比较,我们决定选用Lucene来搭建我们全文搜索的框架。
后来由于开发时间有限,Solr对lucene的集成非常好,我们决定使用Struts+Spring+Solr+IKAnalyzer的一个开发模式来快速搭建一个企业级搜索平台。
自己之前没有接触过这方面的东西,从不断看网上的帮助文档,逛论坛,逛wiki,终于一点一点的开发出一个有自己风格并又适合公司搜索要求的这么一个全文搜索功能。
网上对于lucene,solr的资料并不是那么多,而且大多是拷贝再拷贝,开发起来难度是有的,项目缺陷也是有的,但是毕竟自己积累了这么一个搭建小型搜索引擎的经验,很有收获,所以准备写个笔记记录下来,方便自己以后回忆,而且可以帮助一下其他学者快速搭建一个企业级搜索。
主要思想:此企业级搜索分2块,一块是Solr项目:仅关于Solr一系列配置,索引,建立/更新索引配置。
另一块是网站项目:Action中通过httpclient通信,类似webService一个交互实现,访问配置完善并运行中的Solr,发送查询请求,得到返回的结果hits(solrJ查询,下面详解),传递给jsp页面。
1.下载包Lucene3.5Solr3.5IKAnalyzer3.2.8中文分词器(本文也仅在此分词器配置的基础上)开发时段:2011.12中旬至1月中旬(请自己下载…)都是最新版,个人偏好新东西,稳定不稳定暂不做评论。
2.搭建Solr项目:1.apache-solr-3.5.0\dist下得apache-solr-3.5.0.war复制到tomcat下webapps目录,并更改名字为solr.war,运行生成目录.2.将IKAnalyzer的jar包导入刚生成的项目中lib目录下。
3.Solr项目配置中文分词:在solr/conf/schema.xml中<types>节点下添加个<fieldType>类型(可直接拷贝下段代码)<!--hu add IKAnalyzer configuration--><fieldType name="textik" class="solr.TextField" ><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/><analyzer type="index"><tokenizer class="org.wltea.analyzer.solr.IKT okenizerFactory"isMaxWordLength="false"/><filter class="solr.StopFilterFactory"ignoreCase="true" words="stopwords.txt"/><filter class="solr.WordDelimiterFilterFactory"generateWordParts="1"generateNumberParts="1"catenateWords="1"catenateNumbers="1"catenateAll="0"splitOnCaseChange="1"/><filter class="solr.LowerCaseFilterFactory"/><filter class="solr.EnglishPorterFilterFactory"protected="protwords.txt"/><filter class="solr.RemoveDuplicatesT okenFilterFactory"/></analyzer><analyzer type="query"><tokenizer class="org.wltea.analyzer.solr.IKT okenizerFactory" isMaxWordLength="false"/><filter class="solr.StopFilterFactory"ignoreCase="true" words="stopwords.txt"/><filter class="solr.WordDelimiterFilterFactory"generateWordParts="1"generateNumberParts="1"catenateWords="1"catenateNumbers="1"catenateAll="0"splitOnCaseChange="1"/><filter class="solr.LowerCaseFilterFactory"/><filter class="solr.EnglishPorterFilterFactory"protected="protwords.txt"/><filter class="solr.RemoveDuplicatesT okenFilterFactory"/></analyzer></fieldType>此配置不过多解释:<analyzer type="query">此处配置type并分成index和query 代表着在索引和查询时候的分词实现,isMaxWordLength表示是以何种分词实现,true,false各代表一种,具体请看IKAnalyzer说明文档。
然后则是配置过滤器,看名字进行理解。
(此处textik是域名,之后配置索引相关的字段域的时候如果需要分词则将type设置成=”textik”)4.配置结束后启动tomcat,访问http://localhost:8080/solr/(多核情况下会有各自独立的链接)进入,在头按钮中点击Analyzer(分析器)框1选择type中输入:textik 其他2框输入中文进行测试。
表示固定类型为Testik,它会自动根据textik的配置进行分词,分词效果出来了则表示配置成功了。
5.接下来的工作就是在fields结点内定义具体的字段(类似数据库中的字段),就是filed,filed定义包括name,type(为之前定义过的各种FieldType),indexed(是否被索引),stored(是否被储存),multiValued(是否有多个值)等等。
<fields><field name="id" type="integer" indexed="true" stored="true" required="true" /> <field name="name" type="textik" indexed="true" stored="true" /><field name="summary" type="textik" indexed="true" stored="true" /><field name="author" type="string" indexed="true" stored="true" /><field name="date" type="date" indexed="false" stored="true" /><field name="content" type="text" indexed="true" stored="false" /><field name="keywords" type="textik" indexed="true" stored="false" multiValued="true" /><field name="all"type="textik" indexed="true" stored="false"multiValued="true"/></fields>(multiValued=true,设置此属性的值一般会通过拷贝字段拷贝值至此属性中<copyField source="name" dest="all"/><copyField source="summary" dest="all"/>)6.补充一个操作:tomcat下conf/server.xml, 8080端口设置区域加入URIEncoding="UTF-8" 解决中文乱码问题。