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Œæ–‡ä»¶å†…容如下:
在包å?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>
[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ä¸åР入如䏋酾|®ï¼š
支挾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ˆæ˜¯å¦æœ‰å¤šä¸ªå€û|¼‰½{‰ç‰ã€‚例如定义如下:
field的定义相当é‡è¦ï¼Œæœ‰å‡ 个技巧需注æ„一下,对å¯èƒ½å˜åœ¨å¤šå€¼å¾—å—æ®µž®½é‡è®„¡½®multiValuedå±žæ€§äØ“trueåQŒé¿å…å¾ç´¢å¼•是抛出错误;如果ä¸éœ€è¦å˜å‚¨ç›¸åº”å—ŒDµå€û|¼Œž®½é‡ž®†stored属性设为falseã€?/span>
Cã€å¾è®®å¾ç«‹äº†ä¸€ä¸ªæ‹·è´å—ŒDµï¼Œž®†æ‰€æœ‰çš„å…¨æ–‡å—æ®µå¤åˆ¶åˆîC¸€ä¸ªå—ŒDµä¸åQŒä»¥ä¾¿è¿›è¡Œç»Ÿä¸€çš„æ£€ç´¢ï¼š
òq¶åœ¨æ‹¯‚´å—段¾l“ç‚¹å¤„å®Œæˆæ‹·è´è®¾¾|®ï¼š
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的有效方法:
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¦ï¼Œç‰ÒŽ®Šå—符包括+ -² && || ! ( ) { } [ ] ^ ” ~ * ? : "