ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>97色伦亚洲国产,国产精品区二区三区日本,欧美日韩久久久http://www.aygfsteel.com/chenlb/category/30379.html好记性不如烂½W”头!zh-cnWed, 26 Mar 2008 13:46:13 GMTWed, 26 Mar 2008 13:46:13 GMT60Lucene/Solr开发经验[转蝲]http://www.aygfsteel.com/chenlb/articles/188677.html‹¹æµªæ±?/dc:creator>‹¹æµªæ±?/author>Wed, 26 Mar 2008 03:22:00 GMThttp://www.aygfsteel.com/chenlb/articles/188677.htmlhttp://www.aygfsteel.com/chenlb/comments/188677.htmlhttp://www.aygfsteel.com/chenlb/articles/188677.html#Feedback1http://www.aygfsteel.com/chenlb/comments/commentRss/188677.htmlhttp://www.aygfsteel.com/chenlb/services/trackbacks/188677.html张驰有道 http://www.jinsehupan.com/blog/?p=25 
多谢他的介绍�br />


1
ã€?strong>å¼€½‹‡è¯­
2�strong>概述
3�strong>渊源
4�strong>初识Solr
5�strong>Solr的安�/strong>
6ã€?strong>Solr分词™åºåº
7�strong>Solr中文应用的一个实�/strong>
8ã€?strong>Solr的检索运½Ž—符

[å¼€½‹‡è¯­]按照惯例应该写一½‹‡æŠ€æœ¯æ–‡ç« äº†åQŒè¿™‹Æ¡ç»“合Lucene/Solr来分享一下开发经验ã€?/span>

Lucene是一个ä‹É用Java语言写的全文‹‚€ç´¢å¼€å‘包åQˆAPIåQ‰ï¼Œåˆ©ç”¨å®ƒå¯ä»¥å®žçŽ°å¼ºå¤§çš„‹‚€ç´¢åŠŸèƒ½ï¼Œå®ƒçš„è¯¦ç»†ä»‹ç»å¤§å®¶å¯ä»¥åŽ»Google上搜索一下,本文重点攑֜¨Solr相关的讨è®ÞZ¸Šã€?/span>

[概述]目前国内研究Solrçš„äh不多åQŒè€Œä¸”大多是因为项目开发需要。Solr师承LuceneåQŒäØ“Apache基金会下的一个项目,具体的说它还是Lucene下的一个子™å¹ç›®ã€‚Solr凸™ín豪门åQŒè€Œä¸”å…ähœ‰è‡ªå·±çš„æŠ€æœ¯ç‰¹ç‚¹ï¼Œå¡«è¡¥äº†ä»¥å¾€Luceneä»…ä»…ä½œäØ“å¼€å‘å·¥å…·åŒ…çš„é—æ†¾ï¼Œå®ƒæ˜¯ä¸€ä¸ªå®Œå®Œæ•´æ•´åœ°åº”ç”¨ã€‚æ¢å¥è¯è¯ß_¼Œå®ƒæ˜¯ä¸€ä¸ªå…¨æ–‡æ£€ç´¢æœåС噍åQŒå®ƒå¼€½Ž±å³ç”¨ï¼Œè®©æˆ‘们能立马体会到Lucene的强大功能,为Lucene产品化走å‡ÞZº†ä¸€å¤§æ­¥ã€?br />
Solr分词原理演示界面

[渊源]最初,CNET Networks使用Lucene API来开发了一些应用,òq¶åœ¨˜q™ä¸ªåŸºç¡€ä¸Šäñ”生了Solr的雏形,后来Apache Software Foundation在Lucene™å¶çñ”™å¹ç›®çš„æ”¯æŒä¸‹å¾—到了SolråQŒè¿™å·²ç»æ˜?006òq?月䆾的事了ã€?006òq?æœ?7日,Solr正是加入Apache基金会的孵化™å¹ç›®åQŒåœ¨æ•´ä¸ª™å¹ç›®å­µåŒ–期间åQŒSolr ½EÏx­¥åœ°ç§¯ç´¯å„¿Uç‰¹æ€§åƈ吸引了一个稳定的user¾Ÿ¤ä½“、developer¾Ÿ¤ä½“å’ŒCommitter¾Ÿ¤ä½“åQŒåƈäº?òq´ä¹‹åŽçš„17日正式酝酿成熟,在这之前已经成功发布äº?.1.0版。目前的½E›_®šç‰ˆæœ¬æ˜?.2åQŒSolråœ?月䆾çš?007Apacheòq´ä¼šä¸Šå¤§æ”‘Ö¼‚彩,在今òq?1月底ž®†æ¥åˆ°é¦™æ¸¯å‚åŠ?007亚洲开源èÊY件峰会,遗憾的是ä¸ÞZ»€ä¹ˆä¸æ¥åŒ—äº?-(

[初识Solr]Solr服务器不同于普通的关系型数据库åQŒä¸ä»…仅在于它核心本质的不同åQˆé¢å‘结构化和非¾l“构化数据的不同åQ‰ï¼Œå¾ˆå¤§çš„不同还在于它的体系架构上。Solr服务器一般情况下需要部¾|²äºŽåº”用服务å™?Java容器上(如果是本机通信不涉及RPC可以不ä‹É用Java容器åQŒå¦‚采用嵌入方式使用SolråQ‰ï¼Œæ— æ³•独立工作于JVM上ã€?br />
Solr架构�/strong>
SolræœåŠ¡å™¨å¯ä»¥å­˜å‚¨æ•°æ®åÆˆé€šè¿‡ç´¢å¼•å¯¹å…¶˜q›è¡Œå¿«é€Ÿé«˜æ•ˆæ£€ç´¢ã€‚对外提供HTTP/XMLå’ŒJson API接口åQŒè¿™ä½¿å¾—它能够在多语­a€çŽ¯å¢ƒä¸‹é›†æˆï¼Œæ¯”å¦‚é’ˆå¯¹å®ƒçš„å®¢æˆ·ç«¯çš„å¼€å‘ã€‚Solr目前的客æˆïL«¯é¢å‘的有Java、PHP、Python、C#、Jsonå’ŒRuby½{‰ï¼Œé—憾的是没有面向C/C++åQˆè¿™ä¹Ÿæ˜¯æœ¬äh目前在研½I¶çš„åQ‰ï¼Œç ”究音乐搜烦分类的Brian Whitman曑֜¨è‹ÒŽžœòq›_°ä¸Šä‹É用JNI技术在C代码中嵌入Solr实现‹‚€ç´¢ï¼Œä¸è¿‡æ˜¯ä¸€ä¸ªCocoa工程。有了这些客æˆïL«¯åQŒä‹É用者能很方便地ž®†Solr集成到具体运用中。目前最完善的当属Java客户端SolrjåQŒä»¥åŠåŠ å…¥åˆ°Solr trunkåQŒåƈž®†åœ¨1.3版本中正式发布ã€?/span>

如果不研½I¶å¼€å‘SolråQŒåªæ˜¯ä‹É用SolråQŒåªéœ€è¦å…³æ³¨Solr的以下几个方面:
1、Solr服务器的配置在solrconfig.xml中完成,包括对缓存,servlet的个性化配置½{‰ç­‰åQŒå³¾pȝ»Ÿå…¨å±€çš„配¾|®ï¼›
2、烦引方法、烦引域åQˆå­—ŒDµï¼‰½{‰ç­‰åœ¨schema.xml中完成,˜q™ä¸ªé…ç½®æ˜¯é’ˆå¯¹Solr实例的;
3、烦引数据文仉™»˜è®¤æ”¾åœ¨Solr文档根目录下的data/index目录下,˜q™ä¸ªè·¯å¾„可以通过½W?炚w…¾|®ï¼ŒåŒæ—¶å¯ä»¥ž®†è¿™ä¸ªç›®å½•下的文件进行复制粘è´ß_¼Œå›_¯å®Œæˆç´¢å¼•的复用;
4、徏立烦引的旉™—´ç›¸å½“长,我采用按词无字典索引方式å¯?G110万条中文记录˜q›è¡Œç´¢å¼•åQŒèŠ±äº†å°†˜q?个半ž®æ—¶çš„æ—¶é—ß_¼ˆå½“ç„¶˜q™ä¸ªæ—‰™—´å’Œå¾ˆå¤šå› ç´ æœ‰å…»I¼Œæœ‰å…´­‘£çš„话大家可以留­a€å’Œæˆ‘讨论åQ‰ï¼Œç›¸å¯¹è€Œè¨€åQŒåœ¨linux下徏索引旉™—´è¦æ¯”windows下快很多åQŒå¯ä»¥ä‹É用commit操作使新增烦引生效,同时注意索引的优化,索引优化也是很费资源和时间的åQŒä½†æ˜¯ä¼˜åŒ–烦引也是提高检索速度的重要方法,因此需要好好权衡这一点;
5、安装完后的Solr目录下有˜q™ä¹ˆå‡ ä¸ªæ–‡äšg夹:binæ–‡äšg多w‡Œä¸»è¦æ˜¯ç”¨äºŽå¾ç«‹é•œåƒå’Œå®Œæˆ˜qœç¨‹åŒæ­¥çš„脚本;confæ–‡äšg夹下主要æ˜?ã€?点中提到的配¾|®æ–‡ä»Óž¼›adminæ–‡äšg夹下是的主要是提供web½Ž¡ç†ç•Œé¢çš„æ–‡ä»Óž¼›
6、目前Solr1.2不具备安全性设计,没有用户¾l„及权限讄¡½®åQŒåœ¨˜q›è¡Œå…·ä½“应用旉™œ€è¦æ³¨æ„å®‰å…¨ï¼Œç›®å‰æœ€æœ‰æ•ˆçš„æ–¹æ³•是通过应用服务器上的授权实现ã€?br /> æœ¬æ–‡æ°æ€¹…链接åQ?a >http://www.jinsehupan.com/blog/?p=25

[Solr的安è£?/span>]Solr发行版中已经有一个ä‹É用Jetty为servlet容器的小例子åQŒå¯ä»¥ä‹É用这个例子来体验åQŒé‚£æ­£åœ¨åœ¨è‡ªå·±æƒ³éƒ¨çÖvçš„åã^台和应用服务器上该怎么一个步骤呢åQ?/span>

要开始ä‹Éç”?SolråQŒéœ€å®‰è£…以下软äšgåQ?br /> 1、Java 1.5 或更高版本;
2、Ant 1.6.x 或更高版本(用于¾~–译½Ž¡ç†Solr工程åQŒä¸ªäººæŽ¨èï¼Œå½“然可以使用eclipseåQ‰ï¼›
3、Web ‹¹è§ˆå™¨ï¼Œç”¨æ¥æŸ¥çœ‹½Ž¡ç†™åµé¢åQˆå®˜æ–¹å¾è®®ä‹É用FirefoxåQŒä½†å®žé™…没有发现和IE有什么差别)åQ?br /> 4、servlet 容器åQŒå¦‚Tomcat 5.5åQˆä¸å»ø™®®ä½¿ç”¨6版本åQ‰ã€‚本文以Tomcat åœ?8080 ç«¯å£ä¸Šè¿è¡ŒäØ“ä¾‹ã€‚å¦‚æžœè¿è¡Œçš„æ˜¯å…¶ä»?servlet 容器或在其他的端口上˜qè¡ŒåQŒåˆ™å¯èƒ½è¦ä¿®æ”¹ä»£ç ä¸­çš„URL才能讉K—®½CÞZ¾‹åº”用½E‹åºå’?Solrã€?/span>

下面开始安装配¾|®ï¼š

1、ä‹É用Ant¾~–译工程或下载示例应用程序,ž®†Solr WAR æ–‡äšg复制åˆ?servlet 容器的webapps目录中;
2、得到Solræ–‡äšg夹,以备随后ž®†å…¶å¤åˆ¶åˆ°å½“前目录,可以使用ant build得到åQŒä¹Ÿå¯ä»¥åœ¨ä¸‹è½½çš„压羃包中扑ֈ°åQŒä»¥å®ƒäؓ模板以备之后的修改;
3、可以通过以下三种方式之一讄¡½® Solr 的主位置åQ?br /> 讄¡½® java ¾pȝ»Ÿå±žæ€?solr.solr.home åQˆæ²¡é”™ï¼Œž®±æ˜¯ solr.solr.homeåQŒä¸€èˆ¬åœ¨åµŒå…¥å¼é›†æˆä¸­ç”¨å¾—多)åQ?br /> 配置 java:comp/env/solr/home 的一ä¸?JNDI 查找指向 solr 目录åQŒå¾ç«?tomcat55/conf/Catalina/localhost/solr.xmlæ–‡äšgåQŒæ³¨æ„è¿™ä¸ªxmlæ–‡äšg名将是Solr实例名称åQ?ä¸­çš„å½“å‰ç›®å½•è¢«æŒ‡å®šäØ“ä¸‹é¢ä¸­çš„f:/solrhomeåQŒæ–‡ä»¶å†…容如下:

  1. <context docBase="f:/solr.war" debug="0" crossContext="true" >
  2.    <environment name="solr/home" type="java.lang.String" value="f:/solrhome" override="true" />
  3. </context>

在包å?solr 目录的目录中启动 servlet 容器åQˆé»˜è®¤çš„ Solr ä¸È›®å½•是当前工作目录下的 solråQ‰ï¼›
4、最后一点就是如果有CJKåQˆä¸­æ—¥éŸ©æ–‡å­—åQ‰åº”用,出现ä¹Þq é—®é¢˜åQŒé‡‡ç”¨å¦‚下方法解冻I¼ˆå…¶å®žå·²ç»ä¸ç®—是solr配置问题åQŒè€Œæ˜¯åº”用服务器配¾|®é—®é¢˜ï¼‰åQŒä¿®æ”¹Tomcatçš„conf/server.xmlæ–‡äšg中对于端口(本文ä¸?080åQ‰çš„˜qžæŽ¥å™¨ç»Ÿä¸€èµ„源¾~–码为UTF-8åQŒå› ä¸ºSolr1.2内核支持UTF-8¾~–码åQ?/span>

  1. <server ...>
  2.  <service ...>
  3.    <connector ... URIEncoding="UTF-8"/>
  4.      ...
  5.  </service>
  6. </server>

[Solr分词™åºåº]Solr建立索引和对关键词进行查询都得对字串˜q›è¡Œåˆ†è¯åQŒåœ¨å‘烦引库中添加全文检索类型的索引的时候,Solr会首先用½Iºæ ¼˜q›è¡Œåˆ†è¯åQŒç„¶åŽæŠŠåˆ†è¯¾l“果依次使用指定的过滤器˜q›è¡Œ˜q‡æ×oåQŒæœ€åŽå‰©ä¸‹çš„¾l“果才会加入到烦引库中以备查询。分词的™åºåºå¦‚下åQ?br /> 索引
1åQšç©ºæ ¼whitespaceTokenize
2åQšè¿‡æ»¤è¯StopFilter
3åQ𿋆字WordDelimiterFilter
4åQšå°å†™è¿‡æ»¤LowerCaseFilter
5åQšè‹±æ–‡ç›¸˜q‘词EnglishPorterFilter
6åQšåŽ»é™¤é‡å¤è¯RemoveDuplicatesTokenFilter
查询
1åQšæŸ¥è¯¢ç›¸˜q‘词
2åQšè¿‡æ»¤è¯
3åQ𿋆å­?br /> 4åQšå°å†™è¿‡æ»?br /> 5åQšè‹±æ–‡ç›¸˜q‘词
6åQšåŽ»é™¤é‡å¤è¯
以上是针对英文,中文的除了空æ û|¼Œå…¶ä»–都类ä¼?/span>

[Solr中文应用的一个实�/span>]
1
、首先配¾|®schema.xmlåQŒè¿™ä¸ªç›¸å½“于数据表配¾|®æ–‡ä»Óž¼Œå®ƒå®šä¹‰äº†åŠ å…¥ç´¢å¼•çš„æ•°æ®çš„æ•°æ®¾cÕdž‹çš„ã€?.2版本的schema.xml主要包括types、fields和其他的一些缺省设¾|®ã€?/span>

A、首先需要在types¾l“点内定义一个FieldType子结点,包括name,class,positionIncrementGap½{‰ç­‰ä¸€äº›å‚敎ͼŒnamež®±æ˜¯˜q™ä¸ªFieldType的名¿UŽÍ¼Œclass指向org.apache.solr.analysis包里面对应的class名称åQŒç”¨æ¥å®šä¹‰è¿™ä¸ªç±»åž‹çš„è¡ŒäØ“ã€‚åœ¨FieldType定义的时候最重要的就是定义这个类型的数据在徏立烦引和˜q›è¡ŒæŸ¥è¯¢çš„æ—¶å€™è¦ä½¿ç”¨çš„分析器analyzer,包括分词和过滤。在例子中text˜q™ä¸ªFieldType在定义的时候,在indexçš„analyzer中ä‹É用solr.WhitespaceTokenizerFactory˜q™ä¸ªåˆ†è¯åŒ…,ž®±æ˜¯½Iºæ ¼åˆ†è¯åQŒç„¶åŽä‹É用solr.StopFilterFactoryåQŒsolr.WordDelimiterFilterFactoryåQŒsolr.LowerCaseFilterFactoryåQŒsolr.EnglishPorterFilterFactoryåQŒsolr.RemoveDuplicatesTokenFilterFactory˜q™å‡ ä¸ªè¿‡æ»¤å™¨ã€‚在向烦引库中添加text¾cÕdž‹çš„烦引的时候,Solr会首先用½Iºæ ¼˜q›è¡Œåˆ†è¯åQŒç„¶åŽæŠŠåˆ†è¯¾l“果依次使用指定的过滤器˜q›è¡Œ˜q‡æ×oåQŒæœ€åŽå‰©ä¸‹çš„¾l“果才会加入到烦引库中以备查询。Solrçš„analysisåŒ…åÆˆæ²¡æœ‰å¸¦æ”¯æŒä¸­æ–‡çš„åŒ…ï¼Œåœ¨è¿™é‡Œæˆ‘ä»¬é‡‡ç”¨lucene里的语言包(在下载后的solr压羃包内åQŒlib目录下有一个lucene-analyzers-2.2.0.jar包,里面含有中文处理的cnå’Œcjk¾c»ï¼‰åQŒæœ‰cnå’Œcjk两个¾cÕd¯ä»¥æ”¯æŒä¸­æ–‡ã€‚我们采用cjk¾c»ï¼Œòq¶åœ¨schema.xml中加入如下配¾|®ï¼š

  1. <fieldtype name="text_cjk" class="solr.TextField">
  2.       <analyzer class="org.apache.lucene.analysis.cjk.CJKAnalyzer"/>
  3.     </fieldtype>

支持¾cÕdž‹å®šä¹‰å®Œæˆäº†ã€?/span>

B、接下来的工作就是在fields¾l“点内定义具体的字段åQˆç±»ä¼¼æ•°æ®åº“中的字段åQ‰ï¼Œž®±æ˜¯filedåQŒfiled定义包括name,typeåQˆäؓ之前定义˜q‡çš„各种FieldTypeåQ?indexedåQˆæ˜¯å¦è¢«ç´¢å¼•åQ?storedåQˆæ˜¯å¦è¢«å‚¨å­˜åQ‰ï¼ŒmultiValuedåQˆæ˜¯å¦æœ‰å¤šä¸ªå€û|¼‰½{‰ç­‰ã€‚例如定义如下:

  1. <field name="记录�/span>" type="slong" indexed="true" stored="true" required="true" />
  2.    <field name="æ–‡äšgå?/span>" type="string" indexed="true" stored="true" />
  3.    <field name="日期" type="date" indexed="true" stored="true" />
  4.    <field name="版次" type="string" indexed="true" stored="true" multiValued="true"/>
  5.    <field name="栏目" type="string" indexed="true" stored="true" multiValued="true"/>
  6.    <field name="标题" type="text_cjk" indexed="true" stored="true" multiValued="true"/>
  7.    <field name="作è€?/span>" type="text_cjk" indexed="true" stored="true" multiValued="true"/>
  8.    <field name="正文" type="text_cjk" indexed="true" stored="true" multiValued="true"/>
  9.    <field name="标记" type="text_cjk" indexed="true" stored="true" multiValued="true"/>

field的定义相当重要,有几个技巧需注意一下,对可能存在多值得字段ž®½é‡è®„¡½®multiValuedå±žæ€§äØ“trueåQŒé¿å…å¾ç´¢å¼•是抛出错误;如果不需要存储相应字ŒDµå€û|¼Œž®½é‡ž®†stored属性设为falseã€?/span>

C、徏议徏立了一个拷贝字ŒDµï¼Œž®†æ‰€æœ‰çš„全文字段复制åˆîC¸€ä¸ªå­—ŒDµä¸­åQŒä»¥ä¾¿è¿›è¡Œç»Ÿä¸€çš„æ£€ç´¢ï¼š

  1. <field name="text_com" type="text_cjk" indexed="true" stored="false" multiValued="true"/>

òq¶åœ¨æ‹¯‚´å­—段¾l“点处完成拷贝设¾|®ï¼š

  1. <copyfield source="标题" dest="text_com"/>
  2.    <copyfield source="正文" dest="text_com"/>

D、除此之外,˜q˜å¯ä»¥å®šä¹‰åŠ¨æ€å­—ŒDµï¼Œæ‰€è°“动态字ŒDµå°±æ˜¯ä¸ç”¨æŒ‡å®šå…·ä½“的名称åQŒåªè¦å®šä¹‰å­—ŒDµå¿U°çš„规则åQŒä¾‹å¦‚定义一个dynamicFieldåQŒnameä¸?_iåQŒå®šä¹‰å®ƒçš„type为textåQŒé‚£ä¹ˆåœ¨ä½¿ç”¨˜q™ä¸ªå­—段的时候,ä»ÖM½•以_i¾l“尾的字ŒDµéƒ½è¢«è®¤ä¸ºæ˜¯½W¦åˆ˜q™ä¸ªå®šä¹‰çš„,例如name_iåQŒgender_iåQŒschool_i½{‰ã€?/span>

2、配¾|®solrconfig.xmlåQŒç”¨æ¥é…¾|®Solr的一些系¾lŸå±žæ€§ï¼Œæ¯”较重要的一个就是可以通过更改其中的dataDir属性来指定索引文äšg的存放位¾|®ï¼Œå¯¹äºŽæœ‰å¤§æ•°æ®é‡çš„æƒ…况下还要进行自动commit操作配置åQŒä»¥ä¸‹è®¾¾|®äؓ当内存烦引量辑ֈ°20W条时自动˜q›è¡Œå¾€¼‚ç›˜å†™æ“ä½œï¼Œä»¥å…å †æº¢å‡ºï¼Œ˜q™ä¹Ÿæ˜¯è§£å†›_•个入库xmlæ–‡äšg最好不要超˜q?0M的有效方法:

  1. <autocommit>
  2.     <maxdocs>200000</maxdocs>
  3.   </autocommit>

3、配¾|®å¥½˜q™äº›åŽï¼Œéœ€è¦é‡æ–°å¯åЍSolr服务器ä‹É配置生效åQŒç„¶åŽå‘其中æ·ÕdŠ æ•°æ®ã€?/span>

4、添加数据是通过向服务器的update Servlet POST xml格式的数据来实现的,xml¾l“构是这æ ïLš„add中间有很多个docåQŒæ¯ä¸ªdoc中有很多个field。添加到索引库中的每条记录都必须指定唯一的数字id来唯一标识˜q™æ¡ç´¢å¼•。徏立好xmlæ–‡äšgåQˆä¾‹å¦‚solr.xmlåQ‰ä¹‹åŽï¼Œåœ¨exampledocs目录下执行:java -jar post.jar solr.xml来添加烦引数据。对于postçš„jar包,如果重新配置了应用服务器åQŒå¦‚使用了comcatåQŒç«¯å£æ”¹ä¸?080åQŒå®žä¾‹å¿U°æ”¹ä¸ºsolrx了需要重新生成相应的post.jar包进行操作ã€?/span>

另附ronghao实现中文分词的案例供大家参考:

对全文检索而言åQŒä¸­æ–‡åˆ†è¯éžå¸¸çš„重要åQŒè¿™é‡Œé‡‡ç”¨äº†qieqie庖丁分词åQˆéžå¸æ€¸é”™ï¼šåQ‰ï¼‰ã€‚集成非常的å®ÒŽ˜“åQŒæˆ‘下蝲的是2.0.4-alpha2版本åQŒå…¶ä¸­å®ƒæ”¯æŒæœ€å¤šåˆ‡åˆ†å’ŒæŒ‰æœ€å¤§åˆ‡åˆ†ã€‚åˆ›å»ø™‡ªå·Þqš„一个中文TokenizerFactory¾l§æ‰¿è‡ªsolrçš„BaseTokenizerFactoryã€?/span>

**

* Created by IntelliJ IDEA.

* User: ronghao

* Date: 2007-11-3

* Time: 14:40:59

* 中文切词 对庖丁切词的ž®è£…

*/

public class ChineseTokenizerFactory extends BaseTokenizerFactory {

/**

* 最多切�默认模式

*/

public static final String MOST_WORDS_MODE = “most-words”;

/**

* 按最大切�/span>

*/

public static final String MAX_WORD_LENGTH_MODE = “max-word-length”;

private String mode = null;

public void setMode(String mode) {

if (mode==null||MOST_WORDS_MODE.equalsIgnoreCase(mode)

|| “default”.equalsIgnoreCase(mode)) {

this.mode=MOST_WORDS_MODE;

} else if (MAX_WORD_LENGTH_MODE.equalsIgnoreCase(mode)) {

this.mode=MAX_WORD_LENGTH_MODE;

}

else {

throw new IllegalArgumentException(”不合法的分析器Mode参数讄¡½®:” + mode);

}

}

@Override

public void init(Map args) {

super.init(args);

setMode(args.get(”mode”));

}

public TokenStream create(Reader input) {

return new PaodingTokenizer(input, PaodingMaker.make(),

createTokenCollector());

}

private TokenCollector createTokenCollector() {

if( MOST_WORDS_MODE.equals(mode))

return new MostWordsTokenCollector();

if( MAX_WORD_LENGTH_MODE.equals(mode))

return new MaxWordLengthTokenCollector();

throw new Error(”never happened”);

}

}

在schema.xml的字ŒDµtext配置里加入该分词器ã€?/span>

1. <fieldtype name="text" class="solr.TextField" positionIncrementGap="100">

2.  

3.             <analyzer type="index">

4.  

5.                 <tokenizer class="com.ronghao.fulltextsearch.analyzer.ChineseTokenizerFactory" mode="most-words"/>

6.  

7.  

8.                 <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>

9.  

10.                     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>

11.      

12.                     <filter class="solr.LowerCaseFilterFactory"/>

13.      

14.      

15.                     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>

16.      

17.                 </analyzer>

18.      

19.                 <analyzer type="query">

20.      

21.                     <tokenizer class="com.ronghao.fulltextsearch.analyzer.ChineseTokenizerFactory" mode="most-words"/>               

22.      

23.                     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

24.      

25.                     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>

26.      

27.                     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>

28.      

29.                     <filter class="solr.LowerCaseFilterFactory"/>

30.      

31.                     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>

32.      

33.                 </analyzer>

34.      

35.             </fieldtype>

完成后重启tomcatåQŒå³å¯åœ¨http://localhost:8080/solr/admin/analysis.jsp

体验到庖丁的中文分词。注意要ž®†paoding-analysis.jar复制到solrçš„lib下,注意修改jar包里字典的homeã€?/span>

[Solr的检索运½Ž—符]
 “:”
指定字段查指定å€û|¼Œå¦‚返回所有å€?:*²
 “?”
²è¡¨ç¤ºå•个ä»ÀL„å­—符的通配
 “*” 表示多个ä»ÀL„å­—符的通配åQˆä¸èƒ½åœ¨‹‚€ç´¢çš„™å¹å¼€å§‹ä‹Éç”?或è€?½W¦å·åQ?/span>²
 “~”
²è¡¨ç¤ºæ¨¡ç³Š‹‚€ç´¢ï¼Œå¦‚检索拼写类ä¼égºŽ”roam”的项˜q™æ ·å†™ï¼šroam~ž®†æ‰¾åˆ°åŞ如foamå’Œroams的单词;roam~0.8åQŒæ£€ç´¢è¿”回相似度åœ?.8以上的记录ã€?br /> ²é‚»è¿‘‹‚€ç´¢ï¼Œå¦‚检索相éš?0个单词的”apache”å’?#8221;jakarta”åQ?#8221;jakarta apache”~10
 “^”
²æŽ§åˆ¶ç›¸å…³åº¦æ£€ç´¢ï¼Œå¦‚检索jakarta apacheåQŒåŒæ—¶å¸Œæœ›åŽ»è®?#8221;jakarta”的相兛_º¦æ›´åŠ å¥½ï¼Œé‚£ä¹ˆåœ¨å…¶åŽåŠ ä¸?#8221;^”½W¦å·å’Œå¢žé‡å€û|¼Œå³jakarta^4 apache
 å¸ƒå°”操作½W¦AND、||
²
 
布尔操作½W¦ORã€?/span>²&&
 
布尔操作½W¦NOTã€?ã€?²åQˆæŽ’除操作符不能单独与项使用构成查询åQ?br />  “+” 存在操作½W¦ï¼Œè¦æ±‚½W¦å·”+”后的™å¹å¿…™åÕdœ¨æ–‡æ¡£ç›¸åº”的域中存åœ?/span>²
 ( )
用于构成子查è¯?/span>²
² [] 包含范围‹‚€ç´¢ï¼Œå¦‚检索某旉™—´ŒDµè®°å½•,包含头尾åQŒdate:[200707 TO 200710]
 {}
²ä¸åŒ…含范围检索,如检索某旉™—´ŒDµè®°å½•,不包含头ž®?br /> date:{200707 TO 200710}
 " 转义操作½W¦ï¼Œç‰ÒŽ®Šå­—符包括+ -
² && || ! ( ) { } [ ] ^ ” ~ * ? : "



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ²Æ¾­| Ðû¶÷ÏØ| Í­ÁºÏØ| Ç±É½ÏØ| ƽ²ýÏØ| ³Ç¹ÌÏØ| ¸§ÖÝÊÐ| ÚöáÁÊÐ| ¼ÃÄþÊÐ| ¶õÖÝÊÐ| Æ¤É½ÏØ| È«½·ÏØ| ²ÔÉ½ÏØ| Í©°ØÏØ| ƽÄÏÏØ| ¹ãÄÏÏØ| µÀÕæ| ÆåÅÆ| ÓÀÄêÏØ| ¾ÆÈªÊÐ| ¡×ÓÏØ| ºÊÔóÊÐ| Î¢É½ÏØ| ÒËÀ¼ÊÐ| Ôó¿âÏØ| ÓÀË³ÏØ| Óà¸ÉÏØ| ²ýÀèÏØ| ¸ßÃÜÊÐ| ÂêÄÉË¹ÏØ| ËÞËÉÏØ| ɳƺ°ÓÇø| À¼ÏªÊÐ| ¿Æ¼¼| ÈêÄÏÏØ| »áÀíÏØ| ÔúêãÌØÆì| ÓÀÖÝÊÐ| Ä«Öñ¹¤¿¨ÏØ| ÓÀ°²ÊÐ| ÄþµÂÊÐ|