修改Solr源码自定义远程核创建和删除操作

【版本】:Solr 4.6(服务端),Solr 4.4(客户端) 注:唉,由于当初项目的原因,导致服务端和客户端 版本不一致,不过还好 接口是兼容的,而且主要功能由服务端完成,因而 各个版本的Solr下载地址:http://archive.apache.org/dist/lucene/solr/ 【需求】: 1. 注册核:可以通过HTTP请求动态着创建对应文件夹,并注册一个Solr新Core; 2. 删除核:可以通过HTTP请求动态删除指定Core,不止要删除索引数据,还要把整个实例文件夹全部删除,要删除干净! 修改:solr-4.6.0-src\solr\core\src\java\org\apache\solr\core\CoreContainer.java 文件

Solr/Lucene的排序机制

以下内容转自:http://hi.baidu.com/shirdrn/item/c5611d1556921a0cb98a1aa4 关于Lucene得分的计算。 在IndexSearcher类中有一个管理Lucene得分情况的方法,如下所示: public Explanation explain(Weight weight, int doc) throws IOException { return weight.explain(reader, doc); } 返回的这个Explanation的实例解释了Lucene中Document的得分情况。我们可以测试一下,直观地感觉一下到底这个Explanation的实例都记录了一个Document的哪些信息。 写一个测试类,如下所示: package org.shirdrn.lucene.learn; import java.io.IOException; import java.util.Date; import net.teamhot.lucene.ThesaurusAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermDocs; import org.apache.lucene.search.Explanation; … 继续阅读

Deep paging problem of solr, start设置越大查询越慢

进行solr查询时,如果查询结果很多而且业务需求需要全部返回时,传统的搜索引擎都会遇到一个棘手的问题:deep paging problem,即当翻页查询越多时,查询响应时间越长。传统的搜索服务如Baidu,Google 一般只提供1000以内的查询结果共用户查阅,如果需要更多的查询结果,用户可以输入更多的查询语句进行筛选。 下面利用Apache Solr进行deep page查询的性能测试: 【测试数据】:规模: 499W,内容一样(饲荆泞琴哇尘自缕勇恩本灾却咀功害鳃踪羽甲沏馏铆级奉耻陷下龄周),时间不同。 【机器性能】:64G内存 Linux-Suse 【测试一,翻页查询499W所有结果】 查询条件为rows为10000,timeAllowed为86400000 (即为一天), content为 饲荆泞琴哇尘自缕,进行rows=1W的翻页查询,查询的相应时间如下: 原始结果数据 单次查询结果数 单次查询耗时/ms 查询后结果总数 10000 1585 10000 10000 1585 20000 10000 1682 30000 10000 1818 40000 10000 1934 50000 … 10000 100138 4950000 10000 … 继续阅读

关于Solr的性能调优

如何能在有限的服务器资源上较好的使用Solr服务,性能调优是必不可少的。鉴于个人经验,给出几条可调优方法: 1. 配置SolrConfig中的Directory, 不当的Directory会消耗大量的内存或IO资源,当索引规模变大时也很容易导致内存溢出,或索引维护的Map Failed现象!如何选择合适的Directory可参看《Lucene in Action》(第二版) Section2.10 中文本P52; 2. 配置Schema中的字段的 omitNorm= true, Norm中保存了大量的字段信息用于评分排序. 如果不是很必要的话可把omitNorm设置为true能够减少磁盘和内存的使用并加快索引速度,同时只用来索引而不需要显示的字段也可设置indexed=”true” stored=”false”, 具体Norm的作用可参见《Lucene in Action》(第二版) Section2.53 中文本P47; 3. 调整SolrConfig中的合并因子mergeFactor和内存触发机制setRAMBBufferSizeMB。mergeFactor越小,索引合并越频繁,索引段越少,同时,setRAMBBufferSizeMB越小,Writer更新的越频繁,索引段越多;《Lucene in Action》(第二版) Section11 4. 在索引阶段,不进行索引优化能够接受的话,就不进行索引优化optimize(),很耗时的一件事!但是在查询阶段,优化往往能够大幅度提高查询效率,因而如果可以,考虑周期性optimize()或optimize(maxNumSegments);《Lucene in Action》(第二版) Section11 注意:1. 在优化过程中,索引文件很容易占用超过自身文本大小10倍的硬盘空间,因而一定要考虑服务器的资源限制问题!《Lucene in Action》(第二版) Section11 中文本P355 2.字段中必留的三个: uniqueKey:id ,version, … 继续阅读

关于Solr的各种DirectoryFactory

看到一个关于Solr的中文Book网站,介绍的有些简易,不过专注于Solr值得关注:http://www.solrcn.com/books/ 最近快被Solr的Map Failed快弄崩溃了==b,继续调研。。。,还没好。下面从中摘一段关于SolrDirectoryFactory的配置, Apache Lucene 以及 Solr 一个重要的属性是 Lucene 目录实现。目录接口为 Lucene 提供抽象的 IO 操作层。尽管选一个目录实现看起来很简单,但是在极端情况下,它会影响性能。以下将为你讲解如何选择正确的目录实现。 为了使用期望的目录,要做的就是选择正确的目录实现的工厂类,然后告知 solr。假设你打算使用 NRTCachingDirectory 作为你的目录实现,为了实现这个,需要在 solrconfig.xml 中设置以下内容: 这就是所有要做的,很简单,但是有哪些工厂可用呢,在Solr4.2版本中,有以下工厂可用: solr.StandardDirectoryFactory solr.SimpleFSDirectoryFactory solr.NIOFSDirectoryFactory solr.MMapDirectoryFactory solr.NRTCachingDirectoryFactory solr.RAMDirectoryFactory 现在,让我们分别看看每个工厂。 在深入了解每个工厂的细节前,我们先了解一些工厂的配置参数。directoryFactory 的参数一共两个,一个是 name,name 要设置成 “DirectoryFactory”,另外一个是 class,class 设置成我们所选的工厂实现类。 打算让 solr 自行决定使用哪个工厂时,可以使用 solr. StandardDirectoryFactory。该实现是基于文件系统形式的,依赖当前操作系统和 … 继续阅读

利用solrj API进行微博内容检索

【实验目的】:在172.18.29.185直接调用solrj的API接口完成检索功能,不要使用现成的UI用户界面,不使用web服务。 【参考】:solrj wiki: http://wiki.apache.org/solr/Solrj 【尚有遗留问题】: 测试了本地部署的嵌入服务模式,但一直报错,查了一些网站,还没有找出哪需要配置。 1:关于solr和lucene Lucene是一个使用Java语言写的全文检索开发包(API),利用它可以实现强大的检索功能。 Solr可以说是Lucene下的一个子项目,是一个完完整整地应用。换句话说,它是一个全文检索服务器。Solr目前的客户端面向的有Java、PHP、Python、C#、Json和Ruby等,有了这些客户端,使用者能很方便地将Solr集成到具体运用中。目前最完善的当属Java客户端Solrj。 a)、Solr服务器的配置在solrconfig.xml中完成,包括对缓存,servlet的个性化配置等等,即系统全局的配置; b)、索引方法、索引域(字段)等等在schema.xml中完成,这个配置是针对Solr实例的; [Solr分词顺序]Solr建立索引和对关键词进行查询都得对字串进行分词,在向索引库中添加全文检索类型的索引的时候,Solr会首先用空格进行分词,然后把分词结果依次使用指定的过滤器进行过滤,最后剩下的结果才会加入到索引库中以备查询。分词的顺序如下: 索引 1:空格whitespaceTokenize 2:过滤词StopFilter 3:拆字WordDelimiterFilter 4:小写过滤LowerCaseFilter 5:英文相近词EnglishPorterFilter 6:去除重复词RemoveDuplicatesTokenFilter 查询 1:查询相近词 2:过滤词 3:拆字 4:小写过滤 5:英文相近词 6:去除重复词 以上是针对英文,中文的除了空格,其他都类似 关于schema.xml的配置方法可以借鉴 http://hi.baidu.com/lewutian/item/3d72e939309473bd124b14bd 配置solrconfig.xml,用来配置Solr的一些系统属性,比较重要的一个就是可以通过更改其中的dataDir属性来指定索引文件的存放位置。 [Solr的检索运算符] ? “:” 指定字段查指定值,如返回所有值*:* ? “?” 表示单个任意字符的通配 ? “*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号) … 继续阅读

按tutorial搭建solr4.1.0环境

【实验目的】:在linux服务器上安装配置solr4.1.0版本环境. 完成效果:自带demo可以运行。(需要安装web环境,tomcat/jetty都行) 【参考】:http://lucene.apache.org/solr/4_1_0/tutorial.html 1:环境需要 1.1 java 1.6.0以上版本,查看版本,已安装 1.2 Solr release 4.1.0版本,到solr的官方网站进行下载 $ unzip –q solr-4.1.0.zip 进行解压contrib有一些功能模块是需要的jar包 dist是打包发布好的工程war包 docs是帮助文档 example是示例,里面有打包部署好的solr工程示例和servlet容器jetty。如果你没有tomcat可以直接使用Jetty服务器部署你的solr示例。 PS. 对于servlet容器容器,solr自带了jetty,而且官方网站的tutorial为简单起见也采用的是jetty,不过用tomcat的用户比较多,我们采用tomcat。 1.3 tomcat包安装 到tomcat的官网上http://tomcat.apache.org 下载当前最新版本(目前为7.0.37 Core:->tar.gz文件) $ tar –zxvf apache-tomcat-7.0.37.tar.gz 进行解包 2:利用tomcat发布solr示例 2.1修改一些配置 a). 修改 /home/xujiaming/jacoxu20130222/apache-tomcat-7.0.37/conf/server.xml,修改第70行,加个 URIEncoding=”UTF-8″,把 8080 的那一块改为: b). … 继续阅读