11 2011 档案
摘要:遗留问题前两篇文章中提到了检索的时候不支持的一些特性,比如孙燕姿这个名字输入syanz无法查找,为了解决这个问题,今天又对切词的部分进行了修正。解决对于名字字段进行两种全拼和简拼转换,比如孙燕姿,拼音转换后的结果是sunyanzi,syz,然后再对这个转换结果进行前向后向两个方向的N-Gram切分。原有的设计是拼音转换有四种,对于“沈世卿”这样的名字,拼音转换结果有shenshiqing,shshq, ssq, shensq,通过这个方式枚举所有组合编码上不漂亮,设计起来也不nice。所以放弃了这种方式。同时增加了了一个类似于SpellCheck的字段,这个是参考自:http://lucene
阅读全文
摘要:改进1. 上一篇文章中的联系人拼音搜索中对于不同的拼音形式创建了不同的Lucene Field来保存,这样的设计不便于检索和高亮显示,所以对这方面进行了改进。2. 还有一处细微的改进是提供了对于sunyz(孙燕姿sunyanzi)这样的检索条件的支持,也就是切词后的第一个字全拼,后续中文字简拼的支持。比如yanz也可以作为搜索词使用。实现对于改进1,拷贝了ICUTransformFilter代码进行了修改,使得可以对同一个term产生多个拼音结果,用一组ICU Transliterator来进行转换,这一组ICU Transliterator通过参数传递进来。/** * Licensed to
阅读全文
摘要:需求实现联系人信息(姓名,电话,邮件,地址等信息的快速实时检索)姓名字段:全拼的任意相邻组合,每个单字拼音首字母的任意相邻组合,举例:沈从文的全拼是shencongwen,每个单字拼音首字母scw,那么检索shen,shencong,congwen,shencongwen, sc,cw,scw都要能检索出沈从文,当然中文也要ok,比如:沈从,从文,沈从文,沈都要能包含这一条结果,遵循这个思路设计的联系人搜索甚至不自觉的也支持了混合输入比如沈congwen也能检索出沈从文电话:不少于三个字符的任意前缀后缀都要能检索出来。邮件地址等信息:使用lucene的StandardAnalyzer来分词,所
阅读全文
摘要:在之前的两个部分(part1、part2)中,我们学会了如何配置和查询solr来获取自动完成的功能。今天,我们来看一下如果为suggester添加字段,以这种方式来提供自动完成的功能。组件配置在上一期的配置组件中添加如下的参数:<str name="sourceLocation">dict.txt</str> 这样我们的配置就变成了:<searchComponent name="suggest" class="solr.SpellCheckComponent"> <lst name="
阅读全文
摘要:在Solr的自动完成/自动补充实现介绍(第一部分)中我介绍了怎么用faceting的机制来实现自动完成(autocomplete)的功能,今天我们来看一下如何用Suggester的组件来实现自动完成功能.开始这里有一点需要提醒:Suggest组件在1.4.1或以下版本不可用。要使用这个组件,你需要下载3_x或lucene/solr的主干版本。配置在索引配置之前,我们定义一个searchComponent:<searchComponent name="suggest" class="solr.SpellCheckComponent"> <
阅读全文
摘要:大部分人已经见过自动完成(autocomplete)的功能了(见下图),solr提供了构建这个功能的机制。今天,我将给你展示如何使用facet的方式来添加自动完成机制。索引设想你想在你的在线商店中,给用户一些提示,比如商品的名称。假设我们的索引构建如下:<field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/> <field
阅读全文
摘要:介绍katta 是一个运行在许多商品硬件服务器上的分布式应用,它非常类似于Hadoop MapReduce, Hadoop DFS, HBase, Bigtable 和 Hypertable.概述主节点服务器管理从节点服务器和index shards任务。从节点服务器服务index shards。客户端允许从所有连接的节点上查找数据,并把所有的结果合并成一个结果返回给客户端。数据结构katta的索引是个文件夹,它里面包含一套所谓的index shards(文件形式)。这些子文件包含了Lucene索引。index shards能够很简单的用Lucene的index writer创建。创建一个ka
阅读全文
摘要:一、总体架构Zoie是一个实时的搜索引擎系统,其需要逻辑上独立的索引和搜索子系统相对紧密的结合在一起,从而使得一篇文档一经索引,就能够立刻被搜索的到。ZoieSystem是Zoie的重要组成部分,其一方面通过实现DataConsumer接口而完成了索引功能,一方面通过实现IndexReaderFactory<ZoieIndexReader<R extends IndexReader>>而完成了搜索功能,并将二者紧密的结合在一起。下面就是ZoieSystem的总体架构图:对于索引系统来讲,ZoieSystem是一个DataConsumer,也即是一个消费者,其有函数con
阅读全文
摘要:Solr的配置网上讲的很多,但是实施总是遇到困难,现总结如下:1.从官网下载solr core的源码包,将solrwar包放到tomcat的webapps文件夹下,其它web容器亦然. 运行tomcat ,解压出来solr的文件夹.2.Single core配置:以solr自带例子做讲解 2.1.新建solrhome目录:d:/test/solrcore/singlecore ,从solr源码的example包下复制solr包 2.2.在tomcat 下的 webappss的solr包 WEB-INF目录下修改web.xml的<env-entry-name>solr/home<
阅读全文
摘要:Apache Solr项目,是一款基于Apache Lucene的开源企业搜索服务器,最近发布了1.3版。InfoQ采访了Solr的创建者Yonik Seeley,了解了新版本的更多信息和Solr提供给最终用户的功能。Seeley首先描述了目标用户:“需要搜索框、分面浏览(导航)或者两者结合的任何人”,Solr的关键特性包括:基于标准的开放接口——Solr搜索服务器支持通过XML、JSON和HTTP查询和获取结果。易管理——Solr可以通过HTML页面管理,服务器统计数据以JMX输出,Solr配置通过XML完成。分面浏览——搜索结果自动分类。突出显示命中词——匹配的字符自动在搜索结果中高亮显示
阅读全文
摘要:如果想在solr实现像百度一样相似的竟价的排名,也是可以的,在solr中实现竟价排名,主要使用QueryElevationComponent组件,solrconfig.xml配置:<searchComponent name="elevator" class="solr.QueryElevationComponent"> <!-- pick a fieldType to analyze queries --> <str name="queryFieldType">string</str>
阅读全文
摘要:HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放;LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代; TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。用例代码:package com.test; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.TreeSet; /** * @description 几个set的比较 * Hash...
阅读全文
摘要:positionIncrement:这个字段决定当前token相对于上一个token的位置(当前token的位置就是上一个token位置的值与positionIncrement的值的和),它的作用主要体现在短语查询(phrase search)中. 一般它的默认值是1.但是可以把它设置为0或者大于1的值,起作用分别如下:当设置为0的时候是一个词有多个词干的情况下(这里指英文).短语查询对短语中的两个词之间的其它词的数量是有严格要求的,如果想进行严格匹配就可能限制为0,即两个词必须紧紧相连.这样如果不认为一个词产生的若干词干是在同一位置,就相当于认为他们是不同的词了,从而导致无法正确的匹配...
阅读全文
摘要:SolrCloud是基于Solr和Zookeeper的分布式搜索方案,已经进入Solr的代码库,成为下个Release(估计是4.0)的分布式部署方案。Cloud使用Zookeeper作为配置中心,存储关于分布式的节点信息。各个节点之间依然使用HTTP连接来获取查询结果。前提:索引已经创建完毕,并且分成片,即Shard。以下是官方对SolrCloud的介绍:SolrCloud is the set of Solr features that take Solr's distributed search to the next level, enabling and simplifyin
阅读全文
摘要:Solandra,从别名上就能看出来,其实它就是结合了Solr与Cassandra的实时搜索引擎程序。其特性如下:支持Solr的大多数默认特性(search, faceting, highlights)数据复制,分片,缓存及压缩这些都由Cassandra来进行Multi-master (任意结点都可供读写)实时性高,写操作完成即可读到Easily add new SolrCores w/o restart across the cluster 轻松添加及重启结点这是来自官方的介绍:Solandra is a real-time distributed search engine built o
阅读全文
摘要:Lily是什么Lily是一个可扩展的数据仓库。用于数据的存储和搜索。Lily是一个分布式系统,她并不是白手起家的,她依赖于两个已有的OpenSource软件,一个是HBase, 另一个是SOLR. 同时Lily对于使用者提供自己的操作接口,称作Lily API.Lily的优势在于她强大的搜索能力,无论是文本匹配还是全文索引,通通都能搞定。但我觉得Lily在获取这些优势的同时付出了相当大的代价,最主要的代价就是系统的复杂性。想想看,为了能够使用Lily,你需要安装并维护以下系统:HDFS, HBase, Zookeeper, SOLR, Lily. 这些系统任何一个都可能让Operation T
阅读全文
摘要:前几次我们讲到了solr的基本用法和配置文件,接下来就开始进入我们真正的代码之旅啦。1)首先以一个简单的程序来开头:public static void main(String[] args) throws SolrServerException, IOException, ParserConfigurationException, SAXException{ //设置solr.home,注意这时通过环境变量是solr.solr.home System.setProperty("solr.solr.home","E:\\solr"); ...
阅读全文
摘要:停止词,是由英文单词:stopword翻译过来的,原来在英语里面会遇到很多a,the,or等使用频率很多的字或词,常为冠词、介词、副词或连词等。如果搜索引擎要将这些词都索引的话,那么几乎每个网站都会被索引,也就是说工作量巨大。可以毫不夸张的说句,只要是个英文网站都会用到a或者是the。那么这些英文的词跟我们中文有什么关系呢? 在中文网站里面其实也存在大量的stopword,我们称它为停止词。比如,我们前面这句话,“在”、“里面”、“也”、“的”、“它”、“为”这些词都是停止词。这些词因为使用频率过高,几乎每个网页上都存在,所以搜索引擎开发人员都将这一类词语全部忽略掉。如果我们的网站上存在大量这
阅读全文
摘要:前两天,学习了solr的基本用法,接下来我们就开始真正来学习一下solr。学习一下它的文件结构,配置文件等。以我们现在学习的阶段,最重要的文件夹就是example文件夹,这个里面包含了许多我们要学习的东西。我们再来看一下该文件夹结构 我们看到这样的文件结构,文件夹的意思大家肯定都看得懂,这里只介绍两个文件夹,multicore和solr。multicore是多个solr实例时才需要用到,现在我们暂时没用,先不管它。solr是自带的一个solr.home,这个是我们此次介绍的重点。进入此文件夹,我们可以看到如下的结构: bin文件夹为我们有额外的处理脚本时,需要放在这里,这里暂时没用到,...
阅读全文
摘要:接着上篇http://cxshun.iteye.com/blog/1039445,我们讲了怎么初始化配置solr,并运行。问题来了,当我们配置完成后,索引当中并没有任何东西,就是说我们查询得到的结果永远是0。现在这篇文章,我们要讲的就是如果添加数据和删除数据,并体验一下solr的基本请求参数的用法。1)首先,我们必须知道,solr添加数据类型可以有多种格式,最常用的是XML和JSON,这两种的可读性是最好的。在solr的example/exampledocs文件夹内有自带一些XML格式的文件,便于我们进行添加数据。首先呢,又是一些废话,当然是启动example自带的jetty啦,还是上次的..
阅读全文
摘要:由于工作原因,这段时间接触到solr,一个基于lucene的企业级搜索引擎。不怎么了解它的童鞋可以去GOOGLE一下。下面开始正题:1)要开始solr的学习,首先当然是要下载它啦(这是一句废话),可以到http://www.apache.org/dyn/closer.cgi/lucene/solr/这里去下载,最新的是1.4.1(现在已经是3.4了,但依然适用)。下完后当然要解压啦(这也是废话)。我们看到它的结构是这样的。 相信搞JAVA的同志们应该都大概了解对应的文件夹的意思啦,在dist里面是它的一些JAR包,当中包含了一个war包,这个是我们做例子时用到的项目。直接把它丢到tomcat.
阅读全文
摘要:Solr 是基于lucene的检索服务器。能够很快的搭建检索服务,并且提供的很多实用的组件。例如高亮(highlight)、拼写检查(spellCheck)和匹配相位(moreLikeThis)。下面我将在我工作中接触到的一些实践与大家分享。(我当前使用的solr 版本是 3.4,使用tomcat 7.0.21)(如果你也使用的是 tomcat 服务器,而且查询请求包含中文的话,还需要修改 TOMCAT_HOME/conf/server.xml 的 <Connector ... URIEncoding="UTF-8"/> 使用 UTF-8 编码,详见URI_Ch
阅读全文
摘要:Bobo-browse是一个基于lucene的搜索结果分组统计开源插件,可以完成对搜索结果的分组面统计,比如在淘宝上搜索“衬衣”,在搜索结果顶上显示 “长袖衬衫(10321) 短袖衬衫(32561) ”等。虽然Lucene 在3.2.0也提供了Grouping组件来提供分组统计功能,另作讨论,这里不做讨论。 据Bobo-browse项目介绍, Linkedin.com使用了该组件。 Bobo-browse仅关注搜索,对索引创建与它无关,索引的创建,继续使用标准的Lucene索引创建方法创建。 Bobo-browse项目地址为http://sna-projects.com/bobo/以下是测..
阅读全文
摘要:bobo-browse 是一用java写的lucene扩展组件,通过它可以很方便在lucene上实现分组统计功能。可以从http://sna-projects.com/bobo/上下载和查看相关文档。下面介绍如何使用:第一步:设置相关配置文件bobo-browse 使用了spring,这里主要配置bobo.spring和field.xml两个文件。可以从他的源码例子中找到这两个文件,参考它做相应的修改。bobo.spring<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="
阅读全文
摘要:在IndexSearcher类中有一个管理Lucene得分情况的方法,如下所示:1 public Explanation explain(Weight weight, int doc) throws IOException {2 return weight.explain(reader, doc);3 }返回的这个Explanation的实例解释了Lucene中Document的得分情况。我们可以测试一下,直观地感觉一下到底这个Explanation的实例都记录了一个Document的哪些信息。写一个测试类,如下所示: 1 package org.shirdrn.lucene.lea...
阅读全文
摘要:开场白:作为一个人才网站的搜索功能,不但需要考滤搜索性能与效率,与需要注意用户体验,主要体现于用户对搜索结果的满意程度.大家都知道Lucene的排序中,如果单纯使用Lucene的DefaultSimilarity作为一个相似度的排序,意思是说总体上越相关的记录需要排得越前,但事与愿违.这样使用户体现也表现得相当糟糕.关键字"程序员"标题中也不能保证全部都匹配到(搜索结果来自 www.jobui.com 职友集) [下图]起因:之很长一段时间我都注重于搜索性能与速度的提高,而对于搜索结果对用户的体验却一直没有太多的关注,现在需要关注一下用户体现这个东西了.同时技术上也作为一些
阅读全文
摘要:现象:在synonyms.txt输入中文同义词后,Tomcat启动报错,不能读取文件。原因:使用SOLR加入中文同义词需要把synonyms.txt的默认编码改成与自己系统使用的编码一致。 比如说:你整个系统的编码都是用UTF-8,那么你就要把synonyms.txt这个文件的编码格式转换成UTF-8。原因是,对某个词进行同义的时候找到的词是乱码,而乱码在对于的索引中是没有存在的。这也就导致了中文不可以使用的原因。解决:在eclipse里把synonyms.txt文件编码格式转成UTF-8(系统默认UTF-8),然后再输入中文同义词,保存,重启tomcat,问题解决。总结:SOLR中文分词无法
阅读全文
摘要:基于词典的逆向最大匹配中文分词算法,能实现中英文数字混合分词。比如能分出这样的词:bb霜、3室、乐phone、touch4、mp3、T恤。实际分词效果比正向分词效果好 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->publicclass RMM{ privatestaticfinal Log log = LogFactory.getLog(RMM.class); privatestatic HashMap<String, Intege
阅读全文
摘要:基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词。比如能分出这样的词:bb霜、3室、乐phone、touch4、mp3、T恤第一次写中文分词程序,欢迎拍砖。Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->publicclass MM2 { privatestaticfinal Log log = LogFactory.getLog(MM2.class); privatestatic HashMap<String, Integ
阅读全文
摘要:1、 StopAnalyzerStopAnalyzer能过滤词汇中的特定字符串和词汇,并且完成大写转小写的功能。2、 StandardAnalyzerStandardAnalyzer根据空格和符号来完成分词,还可以完成数字、字母、E-mail地址、IP地址以及中文字符的分析处理,还可以支持过滤词表,用来代替StopAnalyzer能够实现的过滤功能。3、 SimpleAnalyzerSimpleAnalyzer具备基本西文字符词汇分析的分词器,处理词汇单元时,以非字母字符作为分割符号。分词器不能做词汇的过滤,之进行词汇的分析和分割。输出地词汇单元完成小写字符转换,去掉标点符号等分割符。在全文检
阅读全文
摘要:介绍一下Solr的分组查询方式:public static Map<String, Integer> queryByGroup(String qStr,String groupField,String sortField,boolean asc,Integer pageSize,Integer pageNum){ Map<String, Integer> rmap = new LinkedHashMap<String, Integer>(); try { SolrServer server = getSolrServer();//getSolrServer(
阅读全文
摘要:solr 查询参数说明备忘常用q - 查询字符串,必须的。fl - 指定返回那些字段内容,用逗号或空格分隔多个。start - 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。rows - 指定返回结果最多有多少条记录,配合start来实现分页。sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降序。wt - (wr
阅读全文
摘要:今天同事问我怎么远程调试 java 程序。我不会,那马上搜索看看。在被高度的程序中加个数据就行。然后 eclipse 调试时指定端口就行,太方便了。比如,现在有一个代码:把这个java 导出为 remoting-debug.jar 上传到目标机器(当然本地也行)。然后在目标机器上运行:java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 -jar remoting-debug.jar 会出现:Listening for transport dt_socket at address: 8000程序正在等待调试。右击 ..
阅读全文
摘要:在Tomcat6增加 Solr的访问权限方法如下:编辑tomcat6/Catalina/localhost/solr.xml<Context docBase="/var/solr/solr.war" debug="0" privileged="true" allowLinking="true" crossContext="true"><Environment name="solr/home" type="java.lang.String"
阅读全文
摘要:计算原则:以单台服务器性能进行计算,即确保单台服务器工作的时候可以满足系统正常运行的需要;假设每天有1万人次来窗口办理业务,每人次办理一项业务。即以每日1万笔前台交易为例进行综合系数的推导:1.假设每月前台交易数(未来5年内的设计指标)为220,000 (有些业务在月初、月末的处理量比较高,按月统计可以平衡此项差异);2.每日前台交易数=220000/22=10,000 ,即每日 1万笔;3.忙时处理能力:每日交易的80%在4个小时内完成,即10000*80%/4=2000(笔/小时)4.峰值处理能力:2000*2=4000(笔/小时),即峰值处理能力为每小时4000笔,或 67笔/分,假设业
阅读全文
摘要:solr服务器类PersonSolrServer.java:import java.net.MalformedURLException; import java.util.ArrayList; import java.util.List; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.BinaryRequestWriter; import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer...
阅读全文
摘要:为了方便大家易记本博客,刚到http://www.dot.tk申请了免费域名:www.ibook360.tk。欢迎大家以后使用该网址访问本站。祝各位阅读愉快!
阅读全文
摘要:solrconfig.xml文件包含了大部分的参数用来配置Solr本身的。Solrconfig.xml代码dataDirparameter:<dataDir>/var/data/solr</dataDir>用来指定一个替换原先在Solr目录下默认存放所有的索引数据,可以在Solr目录以外的任意目录中。如果复制使用后应该符合该参数。如果这个目录不是绝对路径的话,那么应该以当前的容器为相对路径。mainIndex:这个参数的值用来控制合并多个索引段。<useCompoundFile>:通过将很多Lucene内部文件整合到单一一个文件来减少使用中的文件的数量。这可
阅读全文
摘要:一、字段配置(schema)schema.xml位于solr/conf/目录下,类似于数据表配置文件,定义了加入索引的数据的数据类型,主要包括type、fields和其他的一些缺省设置。1、先来看下type节点,这里面定义FieldType子节点,包括name,class,positionIncrementGap等一些参数。name:就是这个FieldType的名称。class:指向org.apache.solr.analysis包里面对应的class名称,用来定义这个类型的行为。view plaincopy to clipboardprint?Java代码<schemaname=&qu
阅读全文
摘要:Solr的扩展(Scaling)当你的索引数量越来越大,你会发现你的搜索响应时间变得更慢,索引新内容的时间也会越来越长,那么,到了做出一些改变的时候了,幸运的是,solr很好的考虑到了这些情况,你只需要改变你的配置就可以了。以下将从三个方面讲述solr的scaling:l调优某个Solr服务器(Scale High)通过缓存和内存管理优化某个单实例的Solr。将Solr部署到一个拥有快速的CPU和硬件的专用服务器,通过调优,最大化的将单个服务器的性能达到最高。l使用多Solr服务器(Scale Wide)使用多Solr服务器。如果你的avgTimePerRequest参数在你可接受的范围内(数
阅读全文
摘要:打上SOLR-236_collapsing.patch补丁,实现 solr 搜索结果折叠、除去重复的搜索结果,可以实现类似google搜索结果的“站内的其它相关信息 ”。solr collapsing patch 是用 hash 某个字段来实现折叠重复结果的。下面我演示下应用这个补丁并搜索试用下。其实 solr 上已经有了这功能的实现:solr 1.3 collapse patch, 请看:https://issues.apache.org/jira/browse/SOLR-236,我这里下载是了新的:https://issues.apache.org/jira/secure/attach..
阅读全文
摘要:首先说一下lucene对文档的评分规则:score(q,d) = coord(q,d) ·queryNorm(q) ·∑(tf(t in d) ·idf(t)2·t.getBoost() ·norm(t,d))具体可以查看相关文章:http://blog.chenlb.com/2009/08/lucene-scoring-architecture.html这里先考虑三个因素coord(q,d)与tf(t in d),当查询串中,命中的词越多,coord计算的值则越大,某个词在文档中出现的次数越多则tf的值越大。还有就是norm(t,d),这个主
阅读全文
摘要:lucene对索引的更新比solr麻烦,solr只需要调用一个函数UpdateRequest.setAction(AbstractUpdateRequest.ACTION.COMMIT, false, false)就完成了更新,而lucene需要先删除再更新,否则就变成增量索引了lucene更新索引:http://langhua9527.iteye.com/blog/582347前面已经简单介绍了solr的安装与使用,下面来看看如何用客户端solrj来建立索引及查询view plainimportjava.io.IOException;importjava.util.ArrayList;imp
阅读全文