Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
SolrÈëÃÅ
 
  3778  次浏览      27
 2018-2-5
 
±à¼­ÍƼö:

±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎĽéÉÜsolrµÄ¹¦ÄÜʹÓü°Ïà¹Ø×¢ÒâÊÂÏî;Ö÷Òª°üÀ¨ÒÔÏÂÄÚÈÝ:»·¾³´î½¨¼°µ÷ÊÔ;Á½¸öºËÐÄÅäÖÃÎļþ½éÉÜ;ά»¤Ë÷Òý;²éѯË÷Òý,ºÍÔÚ²éѯÖпÉÒÔÓ¦ÓõĸßÁÁÏÔʾ¡¢Æ´Ð´¼ì²é¡¢ËÑË÷½¨Òé¡¢·Ö×éͳ¼Æ¡¢Æ´Òô¼ìË÷µÈ¹¦ÄܵÄʹÓ÷½·¨¡£

1. Solr ÊÇʲô£¿

SolrËüÊÇÒ»ÖÖ¿ª·ÅÔ´ÂëµÄ¡¢»ùÓÚ Lucene Java µÄËÑË÷·þÎñÆ÷£¬Ò×ÓÚ¼ÓÈëµ½ Web Ó¦ÓóÌÐòÖС£Solr ÌṩÁ˲ãÃæËÑË÷(¾ÍÊÇͳ¼Æ)¡¢ÃüÖÐÐÑÄ¿ÏÔʾ²¢ÇÒÖ§³Ö¶àÖÖÊä³ö¸ñʽ£¨°üÀ¨XML/XSLT ºÍJSONµÈ¸ñʽ£©¡£ËüÒ×ÓÚ°²×°ºÍÅäÖ㬶øÇÒ¸½´øÁËÒ»¸ö»ùÓÚHTTP µÄ¹ÜÀí½çÃæ¡£¿ÉÒÔʹÓà Solr µÄ±íÏÖÓÅÒìµÄ»ù±¾ËÑË÷¹¦ÄÜ£¬Ò²¿ÉÒÔ¶ÔËü½øÐÐÀ©Õ¹´Ó¶øÂú×ãÆóÒµµÄÐèÒª¡£SolrµÄÌØÐÔ°üÀ¨£º

¸ß¼¶µÄÈ«ÎÄËÑË÷¹¦ÄÜ

רΪ¸ßͨÁ¿µÄÍøÂçÁ÷Á¿½øÐеÄÓÅ»¯

»ùÓÚ¿ª·Å½Ó¿Ú£¨XMLºÍHTTP£©µÄ±ê×¼

×ۺϵÄHTML¹ÜÀí½çÃæ

¿ÉÉìËõÐÔ£­Äܹ»ÓÐЧµØ¸´ÖƵ½ÁíÍâÒ»¸öSolrËÑË÷·þÎñÆ÷

ʹÓÃXMLÅäÖôﵽÁé»îÐÔºÍÊÊÅäÐÔ

¿ÉÀ©Õ¹µÄ²å¼þÌåϵ

2. Lucene ÊÇʲô£¿

LuceneÊÇÒ»¸ö»ùÓÚJavaµÄÈ«ÎÄÐÅÏ¢¼ìË÷¹¤¾ß°ü£¬Ëü²»ÊÇÒ»¸öÍêÕûµÄËÑË÷Ó¦ÓóÌÐò£¬¶øÊÇΪÄãµÄÓ¦ÓóÌÐòÌṩË÷ÒýºÍËÑË÷¹¦ÄÜ¡£Lucene ĿǰÊÇ Apache Jakarta(ÑżӴï) ¼Ò×åÖеÄÒ»¸ö¿ªÔ´ÏîÄ¿¡£Ò²ÊÇĿǰ×îΪÁ÷ÐеĻùÓÚJava¿ªÔ´È«ÎļìË÷¹¤¾ß°ü¡£Ä¿Ç°ÒѾ­ÓкܶàÓ¦ÓóÌÐòµÄËÑË÷¹¦ÄÜÊÇ»ùÓÚ Lucene £¬±ÈÈçEclipse °ïÖúϵͳµÄËÑË÷¹¦ÄÜ¡£LuceneÄܹ»ÎªÎı¾ÀàÐ͵ÄÊý¾Ý½¨Á¢Ë÷Òý£¬ËùÒÔÄãÖ»Òª°ÑÄãÒªË÷ÒýµÄÊý¾Ý¸ñʽת»¯µÄÎı¾¸ñʽ£¬Lucene ¾ÍÄܶÔÄãµÄÎĵµ½øÐÐË÷ÒýºÍËÑË÷¡£

3. Solr vs Lucene

SolrÓëLucene ²¢²»ÊǾºÕù¶ÔÁ¢¹ØÏµ£¬Ç¡Ç¡Ïà·´Solr ÒÀ´æÓÚLucene£¬ÒòΪSolrµ×²ãµÄºËÐļ¼ÊõÊÇʹÓÃLucene À´ÊµÏֵģ¬SolrºÍLuceneµÄ±¾ÖÊÇø±ðÓÐÒÔÏÂÈýµã£ºËÑË÷·þÎñÆ÷£¬ÆóÒµ¼¶ºÍ¹ÜÀí¡£Lucene±¾ÖÊÉÏÊÇËÑË÷¿â£¬²»ÊǶÀÁ¢µÄÓ¦ÓóÌÐò£¬¶øSolrÊÇ¡£LuceneרעÓÚËÑË÷µ×²ãµÄ½¨É裬¶øSolrרעÓÚÆóÒµÓ¦Óá£Lucene²»¸ºÔðÖ§³ÅËÑË÷·þÎñËù±ØÐëµÄ¹ÜÀí£¬¶øSolr¸ºÔð¡£ËùÒÔ˵£¬Ò»¾ä»°¸ÅÀ¨ Solr: SolrÊÇLuceneÃæÏòÆóÒµËÑË÷Ó¦ÓõÄÀ©Õ¹¡£

SolrÓëLucene¼Ü¹¹Í¼:

SolrʹÓÃLucene²¢ÇÒÀ©Õ¹ÁËËü£¡

Ò»¸öÕæÕýµÄÓµÓж¯Ì¬×Ö¶Î(Dynamic Field)ºÍΨһ¼ü(Unique Key)µÄÊý¾Ýģʽ(Data Schema)

¶ÔLucene²éѯÓïÑÔµÄÇ¿´óÀ©Õ¹£¡

Ö§³Ö¶Ô½á¹û½øÐж¯Ì¬µÄ·Ö×éºÍ¹ýÂË

¸ß¼¶µÄ£¬¿ÉÅäÖõÄÎı¾·ÖÎö

¸ß¶È¿ÉÅäÖúͿÉÀ©Õ¹µÄ»º´æ»úÖÆ

ÐÔÄÜÓÅ»¯

Ö§³Öͨ¹ýXML½øÐÐÍⲿÅäÖÃ

ÓµÓÐÒ»¸ö¹ÜÀí½çÃæ

¿É¼à¿ØµÄÈÕÖ¾

Ö§³Ö¸ßËÙÔöÁ¿Ê½¸üÐÂ(Fast incremental Updates)ºÍ¿ìÕÕ·¢²¼(Snapshot Distribution)

4.´î½¨²¢µ÷ÊÔSolr

4.1 °²×°ÐéÄâ»ú

Solr ±ØÐëÔËÐÐÔÚJava1.6 »ò¸ü¸ß°æ±¾µÄJava ÐéÄâ»úÖУ¬ÔËÐбê×¼Solr ·þÎñÖ»ÐèÒª°²×°JRE ¼´¿É£¬µ«Èç¹ûÐèÒªÀ©Õ¹¹¦ÄÜ»ò±àÒëÔ´ÂëÔòÐèÒªÏÂÔØJDK À´Íê³É¡£¿ÉÒÔͨ¹ýÏÂÃæµÄµØÖ·ÏÂÔØËùÐèJDK »òJRE £º

OpenJDK

Sun

IBM

Oracle

°²×° ²½ÖèÇë²Î¿¼ÏàÓ¦µÄ°ïÖúÎĵµ¡£

4.2ÏÂÔØSolr

±¾ÎÄÕë¶ÔSolr4.2°æ±¾½øÐе÷Ñеģ¬ÏÂÎĽéÉÜÄÚÈݾùÕë¶ÔSolr4.2°æ±¾£¬ÈçÓëSolr ×îа汾ÓгöÈëÇëÒÔ¹Ù·½ÍøÕ¾ÄÚÈÝΪ׼¡£Solr¹Ù·½ÍøÕ¾ÏÂÔØ

4.3ÏÂÔØ²¢ÉèÖÃApache Ant

SolrÊÇʹÓÃAnt½øÐйÜÀíµÄÔ´Âë, AntÊÇÒ»ÖÖ»ùÓÚJavaµÄbuild¹¤¾ß¡£ÀíÂÛÉÏÀ´Ëµ£¬ËüÓÐЩÀàËÆÓÚMaven »òÕßÊÇ CÖеÄmake¡£ÏÂÔØºó½âѹ³öÀ´ºó£¬½øÐл·¾³±äÁ¿ÉèÖá£

ANT_HOME£ºE:\Work\apache-ant\1.9.1 (ÕâÀïΪÄã×Ô¼º½âѹËõµÄĿ¼) PATH£º%ANT_HOME%\bin £¨Õâ¸öÉèÖÃÊÇΪÁË·½±ãÔÚdos»·¾³Ï²Ù×÷£©

²é¿´ÊÇ·ñ°²×°³É¹¦£¬ÔÚÃüÁîÐд°¿ÚÖÐÊäÈëÃüÁîant£¬Èô³öÏÖ½á¹û:

˵Ã÷ant°²×°³É¹¦£¡ÒòΪantĬÈÏÔËÐÐbuild.xmlÎļþ£¬Õâ¸öÎļþÐèÒªÎÒÃǽ¨Á¢¡£ÏÖÔھͿÉÒÔ½øÐÐbuild SolrÔ´ÂëÁË¡£ÔÚÃüÁîÐд°¿ÚÖнøÈëµ½ÄãµÄSolrÔ´ÂëĿ¼£¬ÊäÈëant»á³öÏÖµ±Ç°build.xmlʹÓÃÌáʾÐÅÏ¢¡£

ÆäËüµÄÏȲ»ÓùÜËü£¬ÎÒÃÇÖ»ÒªÕë¶ÔÎÒÃÇʹÓõÄIDE½øÐÐbuild¾ÍÐÐÁË£¬Èç¹ûʹÓÃeclipse¾ÍÔÚÃüÁîÐÐÊäÈ룺ant eclipse.Èç¹ûʹÓÃIntelliJ IDEA ¾ÍÔÚÃüÁîÐÐÊäÈ룺ant idea¡£ÕâÑù¾ÍÄܽøÐÐbuildÁË¡£

ºÚ´°¿ÚÀïÌáʾÕâ¸ö¡£¡£¡£

ʧ°Ü¡£¡£¡£ÎªÊ²Ã´ÄØ£¬×îºóÎÒ·¢ÏÖÊÇÒòΪÏÂÔØµÄantÖÐÉÙÁËÒ»¸öjar¾ÍÊÇÕâapache-ivy£¨ÏÂÔØµØÖ·£ºhttp://ant.apache.org/ivy/£©Õâ¶«¶«Ãû×ÓÕæ¹Ö ivyÊÇant¹ÜÀíjarÒÀÀµ¹ØÏµµÄ¡£µ±µÚÒ»´Îbulidʱivy»á×Ô¶¯°ÑbuildÖеÄȱÉÙµÄÒÀÀµ½øÐÐÏÂÔØ¡£ÍøËÙÂýµÄµÚÒ»´ÎbuildÒªºÃ¾ÃµÄ¡£¡£¡£

ÏÂÔØÒ»¸öjar¾ÍÐаÑjar·Åµ½antµÄlibÏ£¨E:\Work\apache-ant\1.9.1\lib£©ÕâÑùÔÙ´ÎÔËÐÐant ¾Í»á³É¹¦ÁË¡£µ½ÏÖÔڲſÉÒÔ½øÐÐSolrµÄ´úÂëµ÷ÊÔ¡£

4.4ÅäÖò¢ÔËÐÐSolr´úÂë

²»¹ÜÓÃʲôIDEÊ×Ñ¡¶¼ÒªÉèÖÃSolr HomeÔÚIDEµÄJVM²ÎÊýÉèÖÃVM argumentsдÈë -Dsolr.solr.home=solr/example/solrÒ»°ã¾ÍÐÐÁË.²»ÐÐÒ²¿ÉÒÔʹÓþø¶Ô·¾¶.

solrʹÓÃStartSolrJettyÎļþ×÷ΪÈë¿ÚÎļþ½øÐе÷ÊÔ´úÂë,ÔÚÕâÀï¿ÉÒÔÉèÖ÷þÎñÆ÷ʹÓõĶ˿ںÍsolrµÄwebappsĿ¼.Ò»°ã¶¼²»ÓÃÉèÖÃ,ĬÈϵľͿÉÒÔ½øÐе÷ÊÔ.Solr HomeÒ²ÄÜ¿ÉÔÚ´úÂëÖÐÉèÖÃÒ»ÑùºÃÓÃ. System.setProperty("solr.solr.home", "E:\\Work\\solr-4.2.0-src-idea\\solr\\example\\solr");

ĿǰÊÇʹÓÃ×Ô´øµÄÒ»¸öexample×÷ΪsolrÅäÖõĸùĿ¼£¬Èç¹ûÄãÓÐÆäËûµÄsolrÅäÖÃĿ¼£¬ÉèÖÃÖ®¼´¿É¡£µã»÷run¼´¿É£¬debugÒ²ÊÇÒ»Ñù¿ÉÒÔÓÃÁË¡£Ã»ÓбðµÄÎÊÌâ¾ÍÓ¦¸ÃÄÜÔËÐÐÁË.×¢Òâservlet ÈÝÆ÷ʹÓõĶ˿Ú,Èç²éÌáʾ:

FAILED SocketConnector@0.0.0.0:8983: java.net.BindException: Address already in use: JVM_Bind ¾Í˵Ã÷µ±Ç°¶Ë¿ÚÕ¼ÓÃÖÐ.¸ÄһϾͿÉÒÔÁË.Èç¹ûûÓб¨´íÆô¶¯³É¹¦ºó¾Í¿ÉÒÔÔÚä¯ÀÀÆ÷ÖÐÊäÈëµØÖ·: http://localhost:8983/solr/ ¾Í¿ÉÒÔ¿´µ½ÈçϽçÃæ

µ½ÕâÀïSolr¾Í³É¹¦ÅäÖò¢ÔËÐÐÁË.ÒªÊÇÏë¸ú´úÂëµ÷ÊÔÔÚÆô¶¯Ê±ÔÚÕâ¸ö·½·¨Àïµã¶Ïµã¾Í¿ÉÒÔInitializerµÄinitialize()·½·¨Èç¹ûÏë´Óä¯ÀÀÆ÷ÖÐÕҶϵãµ÷ÊÔ¾ÍÒªµ½SolrDispatchFilterµÄdoFilter·½·¨Öеã¶ÏµãÁË.

×¢£ºIE9ÔÚ¼æÈÝģʽÏÂÓÐbug£¬±ØÐëÉèÖÃΪ·Ç¼æÈÝģʽ¡£

5.Solr»ù´¡

ÒòΪ Solr °ü×°²¢À©Õ¹ÁËLucene£¬ËùÒÔËüÃÇʹÓúܶàÏàͬµÄÊõÓï¡£¸üÖØÒªµÄÊÇ£¬Solr ´´½¨µÄË÷ÒýÓë Lucene ËÑË÷ÒýÇæ¿âÍêÈ«¼æÈÝ¡£Í¨¹ý¶Ô Solr ½øÐÐÊʵ±µÄÅäÖã¬Ä³Ð©Çé¿öÏ¿ÉÄÜÐèÒª½øÐбàÂ룬Solr ¿ÉÒÔÔĶÁºÍʹÓù¹½¨µ½ÆäËû Lucene Ó¦ÓóÌÐòÖеÄË÷Òý¡£ÔÚ Solr ºÍ Lucene ÖУ¬Ê¹ÓÃÒ»¸ö»ò¶à¸ö Document À´¹¹½¨Ë÷Òý¡£Document °üÀ¨Ò»¸ö»ò¶à¸ö Field¡£Field °üÀ¨Ãû³Æ¡¢ÄÚÈÝÒÔ¼°¸æËß Solr ÈçºÎ´¦ÀíÄÚÈݵÄÔªÊý¾Ý¡£

ÀýÈ磬Field ¿ÉÒÔ°üº¬×Ö·û´®¡¢Êý×Ö¡¢²¼¶ûÖµ»òÕßÈÕÆÚ£¬Ò²¿ÉÒÔ°üº¬ÄãÏëÌí¼ÓµÄÈκÎÀàÐÍ£¬Ö»ÐèÓÃÔÚsolrµÄÅäÖÃÎļþÖнøÐÐÏàÓ¦µÄÅäÖü´¿É¡£Field ¿ÉÒÔʹÓôóÁ¿µÄÑ¡ÏîÀ´ÃèÊö£¬ÕâЩѡÏî¸æËß Solr ÔÚË÷ÒýºÍËÑË÷ÆÚ¼äÈçºÎ´¦ÀíÄÚÈÝ¡£

ÏÖÔÚ£¬²é¿´Ò»Ï±í 1 ÖÐÁгöµÄÖØÒªÊôÐÔµÄ×Ó¼¯£º

5.1ģʽÅäÖÃSchema.xml

schema.xmlÕâ¸öÅäÖÃÎļþ¿ÉÒÔÔÚÄãÏÂÔØsolr°üµÄ°²×°½âѹĿ¼µÄ\solr\example\solr\collection1\confÖÐÕÒµ½£¬Ëü¾ÍÊÇsolrģʽ¹ØÁªµÄÎļþ¡£´ò¿ªÕâ¸öÅäÖÃÎļþ£¬Äã»á·¢ÏÖÓÐÏêϸµÄ×¢ÊÍ¡£Ä£Ê½×éÖ¯Ö÷Òª·ÖΪÈý¸öÖØÒªÅäÖÃ

5.1.1. types ²¿·Ö

ÊÇһЩ³£¼ûµÄ¿ÉÖØÓö¨Ò壬¶¨ÒåÁË Solr£¨ºÍ Lucene£©ÈçºÎ´¦Àí Field¡£Ò²¾ÍÊÇÌí¼Óµ½Ë÷ÒýÖеÄxmlÎļþÊôÐÔÖеÄÀàÐÍ£¬Èçint¡¢text¡¢dateµÈ.

<fieldType name="string" class="solr.StrField" sortMissingLast="true"/>
<fieldType name=" boolean" class="solr.BoolField" sortMissingLast="true"/>
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class=" solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class=" solr.StandardTokenizerFactory"/>
< filter class="solr.StopFilterFactory" ignoreCase= "true" words="stopwords.txt" enablePositionIncrements ="true" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class=" solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>

²ÎÊý˵Ã÷:

ÊôÐÔ ÃèÊö
name ±êʶ¶øÒÑ
class ºÍÆäËûÊôÐÔ¾ö¶¨ÁËÕâ¸öfieldTypeµÄʵ¼ÊÐÐΪ¡£
sortMissingLast ÉèÖóÉtrueûÓиÃfieldµÄÊý¾ÝÅÅÔÚÓиÃfieldµÄÊý¾ÝÖ®ºó£¬¶ø²»¹ÜÇëÇóʱµÄÅÅÐò¹æÔò, ĬÈÏÊÇÉèÖóÉfalse
sortMissingFirst ¸úÉÏÃæµ¹¹ýÀ´ß¡£ ĬÈÏÊÇÉèÖóÉfalse
analyzer ×Ö¶ÎÀàÐÍÖ¸¶¨µÄ·Ö´ÊÆ÷
type µ±Ç°·Ö´ÊÓÃÓÃÓڵIJÙ×÷.index´ú±íÉú³ÉË÷ÒýʱʹÓÃµÄ·Ö´ÊÆ÷query´úÂëÔÚ²éѯʱʹÓÃµÄ·Ö´ÊÆ÷
tokenizer ·Ö´ÊÆ÷Àà
filter ·Ö´ÊºóÓ¦ÓõĹýÂËÆ÷ ¹ýÂËÆ÷µ÷ÓÃ˳ÐòºÍÅäÖÃÏàͬ.

5.1.2. fileds

ÊÇÄãÌí¼Óµ½Ë÷ÒýÎļþÖгöÏÖµÄÊôÐÔÃû³Æ£¬¶øÉùÃ÷ÀàÐ;ÍÐèÒªÓõ½ÉÏÃæµÄtypes

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued=" false"/>
<field name="path" type="text_smartcn" indexed="false" stored="true" multiValued="false" termVector="true" />
<field name="content" type="text_smartcn" indexed="false" stored="true" multiValued="false" termVector="true"/>
<field name ="text" type ="text_ik" indexed ="true" stored ="false" multiValued =" true"/>
<field name =" pinyin" type ="text_pinyin" indexed ="true" stored ="false" multiValued =" false"/>
<field name="_version_" type="long" indexed="true" stored="true"/>
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
<dynamicField name="*_l" type="long" indexed="true" stored="true"/>
<dynamicField name="*_s" type="string" indexed="true" stored="true" />

field: ¹Ì¶¨µÄ×Ö¶ÎÉèÖÃ

dynamicField: ¶¯Ì¬µÄ×Ö¶ÎÉèÖÃ,ÓÃÓÚºóÆÚ×Ô¶¨Òå×Ö¶Î,*ºÅͨÅä·û.ÀýÈç: test_i¾ÍÊÇintÀàÐ͵Ķ¯Ì¬×Ö¶Î.

»¹ÓÐÒ»¸öÌØÊâµÄ×Ö¶ÎcopyField,Ò»°ãÓÃÓÚ¼ìË÷ʱÓõÄ×Ö¶ÎÕâÑù¾ÍÖ»¶ÔÕâÒ»¸ö×ֶνøÐÐË÷Òý·Ö´Ê¾ÍÐÐÁËcopyFieldµÄdest×Ö¶ÎÈç¹ûÓжà¸ösourceÒ»¶¨ÒªÉèÖÃmultiValued=true,·ñÔò»á±¨´íµÄ

<copyField source="content" dest="pinyin"/>

<copyField source="content" dest="text"/>

<copyField source="pinyin" dest="text"/>

×Ö¶ÎÊôÐÔ˵Ã÷:

ÊôÐÔ ÃèÊö
name ×Ö¶ÎÀàÐÍÃû
class javaˈ̞
indexed ȱʡtrue¡£ ˵Ã÷Õâ¸öÊý¾ÝÓ¦±»ËÑË÷ºÍÅÅÐò£¬Èç¹ûÊý¾ÝûÓÐindexed£¬ÔòstoredÓ¦ÊÇtrue¡£
stored ȱʡtrue¡£ËµÃ÷Õâ¸ö×ֶα»°üº¬ÔÚËÑË÷½á¹ûÖÐÊǺÏÊʵġ£Èç¹ûÊý¾ÝûÓÐstored,ÔòindexedÓ¦ÊÇtrue¡£
omitNorms ×ֶεij¤¶È²»Ó°ÏìµÃ·ÖºÍÔÚË÷Òýʱ²»×öboostʱ£¬ÉèÖÃËüΪtrue¡£ Ò»°ãÎı¾×ֶβ»ÉèÖÃΪtrue¡£
termVectors Èç¹û×ֶα»ÓÃÀ´×ömore like this ºÍhighlightµÄÌØÐÔʱӦÉèÖÃΪtrue¡£
compressed ×Ö¶ÎÊÇѹËõµÄ¡£Õâ¿ÉÄܵ¼ÖÂË÷ÒýºÍËÑË÷±äÂý£¬µ«»á¼õÉÙ´æ´¢¿Õ¼ä£¬Ö»ÓÐStrFieldºÍTextFieldÊÇ¿ÉÒÔѹËõ£¬Õâͨ³£ÊʺÏ×ֶεij¤¶È³¬¹ý200¸ö×Ö·û¡£
multiValued ×ֶζàÓÚÒ»¸öÖµµÄʱºò£¬¿ÉÉèÖÃΪtrue¡£

positionIncrementGap ºÍmultiValuedÒ»ÆðʹÓã¬ÉèÖöà¸öÖµÖ®¼äµÄÐéÄâ¿Õ°×µÄÊýÁ¿

×¢Òâ:_version_ ÊÇÒ»¸öÌØÊâ×Ö¶Î,²»ÄÜɾ³ý,ÊǼǼµ±Ç°Ë÷Òý°æ±¾ºÅµÄ.

5.1.3. ÆäËûÅäÖÃ

uniqueKey: Ψһ¼ü£¬ÕâÀïÅäÖõÄÊÇÉÏÃæ³öÏÖµÄfileds£¬Ò»°ãÊÇid¡¢urlµÈ²»Öظ´µÄ¡£ÔÚ¸üС¢É¾³ýµÄʱºò¿ÉÒÔÓõ½¡£

defaultSearchField:ĬÈÏËÑË÷ÊôÐÔ£¬Èçq=solr¾ÍÊÇĬÈϵÄËÑË÷ÄǸö×Ö¶Î

solrQueryParser:²éѯת»»Ä£Ê½£¬ÊDz¢ÇÒ»¹ÊÇ»òÕߣ¨AND/OR±ØÐë´óд£©

5.2. solrÅäÖÃsolrconfig.xml

solrconfig.xmlÕâ¸öÅäÖÃÎļþ¿ÉÒÔÔÚÄãÏÂÔØsolr°üµÄ°²×°½âѹĿ¼µÄE:\Work\solr-4.2.0-src-idea\solr\example\solr\collection1\confÖÐÕÒµ½£¬Õâ¸öÅäÖÃÎļþÄÚÈÝÓеã¶à,Ö÷ÒªÄÚÈÝÓÐ:ʹÓõÄlibÅäÖÃ,°üº¬ÒÀÀµµÄjarºÍSolrµÄһЩ²å¼þ;×é¼þÐÅÏ¢ÅäÖÃ;Ë÷ÒýÅäÖúͲéѯÅäÖÃ,ÏÂÃæÏêϸ˵һÏÂË÷ÒýÅäÖúͲéѯÅäÖÃ.

5.2.1Ë÷ÒýindexConfig

Solr ÐÔÄÜÒòËØ£¬À´Á˽âÓë¸÷ÖÖ¸ü¸ÄÏà¹ØµÄÐÔÄÜȨºâ¡£ ±í 1 ¸ÅÀ¨Á˿ɿØÖÆ Solr Ë÷Òý´¦ÀíµÄ¸÷ÖÖÒòËØ£º

5.2.2 ²éѯÅäÖÃquery

5.3Solr¼ÓÈëÖÐÎÄ·Ö´ÊÆ÷

ÖÐÎÄ·Ö´ÊÔÚsolrÀïÃæÊÇûÓÐĬÈÏ¿ªÆôµÄ£¬ÐèÒªÎÒÃÇ×Ô¼ºÅäÖÃÒ»¸öÖÐÎÄ·Ö´ÊÆ÷¡£Ä¿Ç°¿ÉÓÃµÄ·Ö´ÊÆ÷ÓÐsmartcn£¬IK£¬Jeasy£¬âÒ¶¡¡£ÆäʵÖ÷ÒªÊÇÁ½ÖÖ£¬Ò»ÖÖÊÇ»ùÓÚÖпÆÔºICTCLASµÄÒþʽÂí¶û¿Æ·òHMMËã·¨µÄÖÐÎÄ·Ö´ÊÆ÷£¬Èçsmartcn£¬ictclas4j£¬ÓŵãÊÇ·Ö´Ê׼ȷ¶È¸ß£¬È±µãÊDz»ÄÜʹÓÃÓû§×Ô¶¨Òå´Ê¿â£»ÁíÒ»ÖÖÊÇ»ùÓÚ×î´óÆ¥ÅäµÄ·Ö´ÊÆ÷£¬ÈçIK £¬Jeasy£¬âÒ¶¡£¬ÓŵãÊÇ¿ÉÒÔ×Ô¶¨Òå´Ê¿â£¬Ôö¼Óдʣ¬È±µãÊÇ·Ö³öÀ´µÄÀ¬»ø´Ê½Ï¶à¡£¸÷ÓÐÓÅȱµã¿´Ó¦Óó¡ºÏ×Ô¼ººâÁ¿Ñ¡Ôñ°É¡£

ÏÂÃæ¸ø³öÁ½ÖÖ·Ö´ÊÆ÷µÄ°²×°·½·¨£¬ÈÎÑ¡ÆäÒ»¼´¿É£¬ÍƼöµÚÒ»ÖÖ£¬ÒòΪsmartcn¾ÍÔÚsolr·¢ÐаüµÄcontrib/analysis-extras/lucene-libs/Ï£¬¾ÍÊÇlucene-analyzers-smartcn-4.2.0.jar,Ê×Ñ¡ÔÚsolrconfig.xmlÖмÓÒ»¾äÒýÓÃanalysis-extrasµÄÅäÖÃ,ÕâÑùÎÒÃÇ×Ô¼º¼ÓÈëµÄ·Ö´ÊÆ÷²Å»áÒýµ½µÄsolrÖÐ.

<lib dir="../../../contrib/analysis-extras/lib" regex=".*\.jar" />

5.3.1. smartcn ·Ö´ÊÆ÷µÄ°²×°

Ê×Ñ¡½«·¢ÐаüµÄcontrib/analysis-extras/lucene-libs/ lucene-analyzers-smartcn-4.2.0.jar¸´ÖƵ½\solr\contrib\analysis-extras\libÏÂ,ÔÚsolr±¾µØÓ¦ÓÃÎļþ¼ÐÏ£¬´ò¿ª/solr/conf/scheme.xml£¬±à¼­text×Ö¶ÎÀàÐÍÈçÏ£¬Ìí¼ÓÒÔÏ´úÂëµ½scheme.xmlÖеÄÏàӦλÖ㬾ÍÊÇÕÒµ½fieldType¶¨ÒåµÄÄÇÒ»¶Î£¬ÔÚÏÂÃæ¶àÌí¼ÓÕâÒ»¶Î¾ÍºÃÀ²

<fieldType name="text_smartcn" class="solr.TextField" positionIncrementGap="0">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>
<filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>
<filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>
</analyzer>
</fieldType>

Èç¹ûÐèÒª¼ìË÷ij¸ö×ֶΣ¬»¹ÐèÒªÔÚscheme.xmlÏÂÃæµÄfieldÖУ¬Ìí¼ÓÖ¸¶¨µÄ×ֶΣ¬ÓÃtext_ smartcn×÷ΪtypeµÄÃû×Ö£¬À´Íê³ÉÖÐÎÄ·Ö´Ê¡£Èç textҪʵÏÖÖÐÎļìË÷µÄ»°£¬¾ÍÒª×öÈçϵÄÅäÖãº

<field name ="text" type ="text_smartcn" indexed ="true" stored ="false" multiValued ="true"/>

5.3.2. IK ·Ö´ÊÆ÷µÄ°²×°

Ê×ѡҪȥÏÂÔØIKAnalyzerµÄ·¢Ðаü.ÏÂÔØ .

ÏÂÔØºó½âѹ³öÀ´ÎļþÖеÄÈý¸ö¸´ÖƵ½\solr\contrib\analysis-extras\libĿ¼ÖÐ.

IKAnalyzer2012FF_u1.jar ·Ö´ÊÆ÷jar°ü
IKAnalyzer.cfg.xml ·Ö´ÊÆ÷ÅäÖÃÎļþ
Stopword.dic ·Ö´ÊÆ÷Í£´Ê×Öµä,¿É×Ô¶¨ÒåÌí¼ÓÄÚÈÝ

¸´Öƺó¾Í¿ÉÒÔÏñsmartcnÒ»ÑùµÄ½øÐÐÅäÖÃscheme.xmlÁË.

fieldType name="text_ik" class="solr.TextField">
<analyzer class= "org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<field name ="text" type ="text_ik" indexed ="true" stored ="false" multiValued ="true"/>

ÏÖÔÚÀ´ÑéÖ¤ÏÂÊÇ·ñÌí¼Ó³É¹¦,Ê×ÏÈʹÓÃStartSolrJettyÀ´Æô¶¯solr·þÎñ,Æô¶¯¹ý³ÌÖÐÈç¹ûÅäÖóö´í,Ò»°ãÓÐÁ½¸öÔ­Òò:Ò»ÊÇÅäÖÃµÄ·Ö´ÊÆ÷jarÕÒ²»µ½,Ò²¾ÍÊÇÄãûÓи´ÖÆjar°üµ½\solr\contrib\analysis-extras\libĿǰÏÂ;¶þÊÇ·Ö´ÊÆ÷°æ±¾²»¶Ôµ¼ÖÂµÄ·Ö´ÊÆ÷½Ó¿ÚAPI²»Ò»Ñù³öµÄ´í,ÒªÊÇÕâ¸ö´íµÄ»°¾ÍÔÚ¼ì²é·Ö´ÊÆ÷µÄÏà¹ØÎĵµ,¿´Ò»ÏÂÖ§³ÖµÄ°æ±¾ÊÇ·ñÒ»Ñù.

Èç¹ûÔÚÆô¶¯¹ý³ÌÖÐûÓб¨´íµÄ»°ËµÃ÷ÅäÖóɹ¦ÁË.ÎÒÃÇ¿ÉÒÔ½øÈëµ½http://localhost:8983/solrµØÖ·½øÐвâÊÔһϸռÓÈëµÄÖÐÎÄ·Ö´ÊÆ÷.ÔÚÊ×Ò³µÄCore SelectorÖÐÑ¡ÔñÄãÅäÖõÄCroeºóµã»÷ÏÂÃæµÄAnalysis,ÔÚAnalyse Fieldname / FieldTypeÀïÑ¡ÔñÄã¸Õ²ÅÉèÖõÄ×Ö¶ÎÃû³Æ»òÊÇ·Ö´ÊÆ÷ÀàÐÍ,ÔÚField Value(index)ÖÐÊäÈë:ÖйúÈË,µã»÷ÓÒÃæµÄ·Ö´Ê¾ÍÐÐÁË.

6.Solr¹¦ÄÜÓ¦ÓÃ

ÎÒÕâÀïÖ÷ҪʹÓÃSolrJ½øÐнéÉÜÒ»ÏÂSolrµÄһЩ»ù±¾Ó¦ÓÃ,ʹÓÃSolrJ¼ÓÉÏEmbeddedSolrServer(ǶÈëʽ·þÎñÆ÷),·½±ã½øÐдúÂë¸ú×Ùµ÷ÊÔ.ÔÚ¹¦ÄÜÉÏºÍÆäËü·þÎñÆ÷¶¼ÊÇÒ»ÑùµÄ,ËüÃǶ¼ÊǼ̳еÄSolrServerÀ´Ìṩ·þÎñAPIµÄ. EmbeddedSolrServerÓŵãÊDz»ÓÃÆðhttpЭÒé,Ö±½Ó¼ÓÔØSolrCore½øÐвÙ×÷,ÐÔÄÜÉÏÓ¦¸ÃÊÇ×î¿ìµÄ,·½±ãÓÃÓÚ°ÑSolrµ¥½áµã·þÎñǶÈëµ½ÏîÄ¿ÖÐʹÓÃ.ÏÂÃæ¿ªÊ¼½éÉÜSolrµÄ¹¦ÄܵÄÓ¦ÓÃ.EmbeddedSolrServer³õʼ»¯:

System.setProperty ("solr.solr.home", "E:\\Work\\solr-4.2.0 -src\\solr\\example\\solr");
CoreContainer.Initializer initializer = new CoreContainer.Initializer();
CoreContainer coreContainer = initializer.initialize();
SolrServer server = new EmbeddedSolrServer(coreContainer, "");

6.1ά»¤Ë÷Òý

ÔÚÒ»°ãϵͳÖÐά»¤µÄ¶¼ÊÇÔöɾ¸Ä,ÔÚSolrÖеÄά»¤¹¦ÄÜÊÇÔöɾºÍÓÅ»¯¹¦ÄÜ,ÔÚSolrÖеÄÐ޸IJÙ×÷¾ÍÊÇÏÈɾµôÔÙÌí¼Ó.ÔÚ×öË÷Òýά»¤Ö®Ç°,Ê×ÏÈÒª×öµÄÊÇÅäÖÃschema.xmlÖ÷ÒªÊǰ´ÉÏÃæÕ½ÚÖеÄ˵Ã÷ÉèÖúÃ×Ö¶ÎÐÅÏ¢(Ãû³Æ,ÀàÐÍ,Ë÷Òý,´æ´¢,·Ö´ÊµÈÐÅÏ¢),´ó¸Å¾ÍÏñÔÚÊý¾Ý¿âÖÐн¨Ò»¸ö±íÒ»Ñù.ÉèÖúÃschema.xml¾Í¿ÉÒÔ½øÐÐË÷ÒýÏà¹Ø²Ù×÷ÁË.

6.1.1Ôö¼ÓË÷Òý

ÔÚÔö¼ÓË÷Òý֮ǰÏȿɹ¹½¨ºÃSolrInputDocument¶ÔÏó.Ö÷Òª²Ù×÷¾ÍÊǸøÎĵµÌí¼Ó×ֶκÍÖµ.´úÂëÈçÏÂ:


SolrInputDocument doc = new SolrInputDocument();
doc.setField ("id", "ABC");
doc.setField ("content", "ÖлªÈËÃñ¹²ºÍ¹ú");
¹¹½¨ºÃÎĵµºóÌí¼ÓµÄÉÏÃæ³õʼ»¯ºÃµÄserverÀï¾ÍÐÐÁË.
server.add(doc);
server.commit();//Õâ¾äÒ»°ã²»ÓüÓÒòΪÎÒÃÇ¿ÉÒÔͨ¹ýÔÚÅäÖÃÎļþÖеÄ
//autoCommitÀ´Ìá¸ßÐÔÄÜ

SolrÔÚaddÎĵµÊ±.Èç¹ûÎĵµ²»´æÔÚ¾ÍÖ±½ÓÌí¼Ó,Èç¹ûÎĵµ´æÔÚ¾Íɾ³ýºóÌí¼Ó,ÕâÒ²¾ÍÊÇÐ޸ŦÄÜÁË.ÅжÏÎĵµÊÇ·ñ´æÔÚµÄÒÀ¾ÝÊǶ¨ÒåºÃµÄuniqueKey×Ö¶Î.

6.1.2ɾ³ýË÷Òý

ɾ³ýË÷Òý¿ÉÒÔͨ¹ýÁ½ÖÖ·½Ê½²Ù×÷,Ò»ÖÖÊÇͨ¹ýÎĵµID½øÐÐɾ³ý,±ðÒ»ÖÖÊÇͨ¹ý²éѯµ½µÄ½á¹û½øÐÐɾ³ý.

ͨ¹ýIDɾ³ý·½Ê½´úÂë:

server.deleteById(id);
//»òÊÇʹÓÃÅúÁ¿É¾³ý
server.deleteById(ids);
ͨ¹ý²éѯɾ³ý·½Ê½´úÂë:
server.deleteByQuery("*.*");//ÕâÑù¾Íɾ³ýÁËËùÓÐÎĵµË÷Òý
//¡±*.*¡±¾Í²éѯËùÓÐÄÚÈݵÄ,½éÉܲéѯʱ»áÏêϸ˵Ã÷.

6.1.2ÓÅ»¯Ë÷Òý

ÓÅ»¯Lucene µÄË÷ÒýÎļþÒԸĽøËÑË÷ÐÔÄÜ¡£Ë÷ÒýÍê³ÉºóÖ´ÐÐÒ»ÏÂÓÅ»¯Í¨³£±È½ÏºÃ¡£Èç¹û¸üÐÂ±È½ÏÆµ·±£¬ÔòÓ¦¸ÃÔÚʹÓÃÂʽϵ͵Äʱºò°²ÅÅÓÅ»¯¡£Ò»¸öË÷ÒýÎÞÐèÓÅ»¯Ò²¿ÉÒÔÕý³£µØÔËÐС£ÓÅ»¯ÊÇÒ»¸öºÄʱ½Ï¶àµÄ¹ý³Ì¡£

server.optimize();//²»ÒªÆµ·±µÄµ÷ÓÃ..¾¡Á¿ÔÚÎÞÈËʹÓÃʱµ÷ÓÃ.

6.2²éѯË÷Òý

SolrÔÚ²»ÐÞ¸ÄÈÎÎñÅäÖõÄÇé¿öϾͿÉÒÔʹÓòéѯ¹¦ÄÜ£¬ÔÚwebÏîÄ¿ÖÐÓ¦ÓÿÉÒÔÖ±½ÓURL½øÐзÃÎÊSolr·þÎñÆ÷ÀýÈç £º

http://localhost:8983/solr/ collection1/select?q=*%3A*&wt=xml&indent=true

ÉÏÃæµÄÒâ˼¾ÍÊDzéѯÃûΪcollection1µÄSolrCoreµÄËùÓÐÄÚÈÝÓÃxml¸ñʽ·µ»Ø²¢ÇÒÓÐËõ½ø¡£

·µ»Ø½á¹ûÈçÏÂ:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
<lst name="params">
<str name="indent">true</str>
<str name="q">*:*</str>
<str name="wt">xml</str>
</lst>
</lst>
<result name="response" numFound="17971" start="0">
<doc>
<str name="path">E:\Reduced\¾üÊÂ\1539.txt</str>
<str name="category_s">2</str>
<int name="browseCount_i">-1423701734</int>
<long name="modified_l">1162438568000</long>
<long name="releasedate_l">1162438568000</long>

[¶íÂÞ˹lentaÍøÕ¾2006Äê2ÔÂ9ÈÕ±¨µÀ]¶í¿Õ¾ü¸±×Ü˾Áî±ÈÈÈÒ®·òÖн«³Æ£¬2006Äê´ºÌì¶ÀÁªÌå¹ú¼Ò·À¿Õϵͳ´ò»÷·¶Î§ÏòÎ÷ÍÆ½ø150ǧÃ×£¬Õì²ì·¶Î§ÏòÎ÷ÍÆ½ø400ǧÃס£¡¡¡¡2006Äê3Ô°׶íÂÞ˹4¸öS-300PS·À¿Õµ¼µ¯Óªµ£¸ºÕ½¶·ÈÎÎñ£¬Ê¹¶ÀÁªÌå·À¿Õϵͳ×÷Õ½·¶Î§µÃÒÔÏòÎ÷ÍÆ½ø¡£±ÈÈÈÒ®·òÖн«»¹Ðû²¼£¬½üÆÚÎÚ×ȱð¿Ë˹̹¿ÉÄܼÓÈë¶ÀÁªÌå·À¿Õϵͳ¡£¡¡¡¡¶ÀÁªÌå¹ú¼Ò·À¿Õϵͳ½¨ÓÚ9Äêǰ£¬¹²ÓÐ9¸ö¹ú¼Ò²Î¼Ó¸Ã×éÖ¯¡£Ä¿Ç°Ö»ÓÐÑÇÃÀÄáÑÇ¡¢°×¶íÂÞ˹¡¢¹þÈø¿Ë˹̹¡¢¼ª¶û¼ªË¹¡¢¶íÂÞ˹ºÍËþ¼ª¿Ë˹̹֧³Ö¸ÃÌåϵ¡£¡¡¡¡ÎÚ¿ËÀ¼¡¢ÎÚ×ȱð¿Ë˹̹Óë¶íÂÞ˹ÔÚË«±ß»ù´¡ÉϺÏ×÷£¬¸ñ³¼ªÑǺÍÍÁ¿âÂü×î½ü7Äê²»²Î¼Ó¶ÀÁªÌå¹ú¼Ò¶Ô¿Õ·ÀÓù¡£

<str name="id">E3798D82-EAB6 -2BEA-D7E2-79FBD102E845</str>
<long name="_version_"> 1436361868021071872</long></doc>
¡­
</result>
</response>

 

ÉÏÃæËù¿´µ½µÄ¾ÍÊÇÓÃxml¸ñʽ·µ»ØµÄ²éѯ½á¹û,ÆäÖеÄdoc¾ÍÊÇÒ»¸öÎĵµ,ÔÚdocÀïÃæµÄÄǸö¾ÍÊÇÎÒÃÇ¿ªÊ¼ÔÚschema.xmlÖж¨ÒåµÄ×Ö¶Î.

Èç¹ûʹÓÃSolrJ½øÐе÷Óõϰ´úÂëÈçÏ£º

SolrQuery query = new SolrQuery();
query.set("q","*.*");
QueryResponse rsp =server.query(query)
SolrDocumentList list = rsp.getResults();

 

·µ»Ø½á¹ûÔÚSolrDocumentListÖÐÔÚÕâ¸ö¶ÔÏóÖбéÀúÈ¡³öÖµÀ´:


for (int i = 0; i < list.size(); i++) {
SolrDocument sd = list.get(i);
String id = (String) sd.getFieldValue("id");
System.out.println(id);
}

 

6.2.1²éѯ²ÎÊý

Ãû³Æ ÃèÊö
q ²éѯ×Ö·û´®£¬±ØÐëµÄ¡£
fq filter query¡£Ê¹ÓÃFilter Query¿ÉÒÔ³ä·ÖÀûÓÃFilter Query Cache£¬Ìá¸ß¼ìË÷ÐÔÄÜ¡£×÷ÓãºÔÚq²éѯ·ûºÏ½á¹ûÖÐͬʱÊÇfq²éѯ·ûºÏµÄ£¬ÀýÈ磺q=mm&fq=date_time:[20081001 TO 20091031]£¬Õҹؼü×Ömm£¬²¢ÇÒdate_timeÊÇ20081001µ½20091031Ö®¼äµÄ¡£
fl field list¡£Ö¸¶¨·µ»Ø½á¹û×ֶΡ£ÒÔ¿Õ¸ñ¡° ¡±»ò¶ººÅ¡°,¡±·Ö¸ô¡£
start ÓÃÓÚ·ÖÒ³¶¨Òå½á¹ûÆðʼ¼Ç¼Êý£¬Ä¬ÈÏΪ0¡£
rows
ÓÃÓÚ·ÖÒ³¶¨Òå½á¹ûÿҳ·µ»Ø¼Ç¼Êý£¬Ä¬ÈÏΪ10¡£
sort <desc|asc>]¡­ ¡£Ê¾Àý£º£¨inStock desc, price asc£©±íʾÏÈ ¡°inStock¡± ½µÐò, ÔÙ ¡°price¡± ÉýÐò£¬Ä¬ÈÏÊÇÏà¹ØÐÔ½µÐò¡£
df
ĬÈϵIJéѯ×ֶΣ¬Ò»°ãĬÈÏÖ¸¶¨¡£
q.op
¸²¸Çschema.xmlµÄdefaultOperator£¨ÓпոñʱÓÃ"AND"»¹ÊÇÓÃ"OR"²Ù×÷Âß¼­£©£¬Ò»°ãĬÈÏÖ¸¶¨¡£±ØÐë´óд
wt ¶¨ÒåÁ˲éѯÊä³ö¸ñʽ£ºxml¡¢json¡¢python¡¢ruby¡¢php¡¢phps¡¢custom¡£
qt query type£¬Ö¸¶¨²éѯʹÓõÄQuery Handler£¬Ä¬ÈÏΪ¡°standard¡±¡£
explainOther ÉèÖõ±debugQuery=trueʱ£¬ÏÔʾÆäËûµÄ²éѯ˵Ã÷¡£
defType ÉèÖòéѯ½âÎöÆ÷Ãû³Æ¡£
timeAllowed ÉèÖòéѯ³¬Ê±Ê±¼ä¡£
omitHeader ÉèÖÃÊÇ·ñºöÂÔ²éѯ½á¹û·µ»ØÍ·ÐÅÏ¢£¬Ä¬ÈÏΪ¡°false¡±¡£
indent ·µ»ØµÄ½á¹ûÊÇ·ñËõ½ø£¬Ä¬ÈϹرգ¬Óà indent=true|on ¿ªÆô£¬Ò»°ãµ÷ÊÔjson,php,phps,rubyÊä³ö²ÅÓбØÒªÓÃÕâ¸ö²ÎÊý¡£
version
²éѯÓï·¨µÄ°æ±¾£¬½¨Ò鲻ʹÓÃËü£¬ÓÉ·þÎñÆ÷Ö¸¶¨Ä¬ÈÏÖµ¡£
debugQuery
ÉèÖ÷µ»Ø½á¹ûÊÇ·ñÏÔʾDebugÐÅÏ¢¡£

 

6.2.2²éѯÓï·¨

1.Æ¥ÅäËùÓÐÎĵµ£º*:*

2.Ç¿ÖÆ¡¢×èÖ¹ºÍ¿ÉÑ¡²éѯ£º

1) Mandatory£º²éѯ½á¹ûÖбØÐë°üÀ¨µÄ(for example, only entry name containing the word make)

Solr/Lucene Statement£º+make, +make +up ,+make +up +kiss

2) prohibited£º(for example, all documents except those with word believe)

Solr/Lucene Statement£º+make +up -kiss

3) optional£º

Solr/Lucene Statement£º+make +up kiss

3.²¼¶û²Ù×÷£ºAND¡¢ORºÍNOT²¼¶û²Ù×÷£¨±ØÐë´óд£©ÓëMandatory¡¢optionalºÍprohibitedÏàËÆ¡£

1) make AND up £½ +make +up :AND×óÓÒÁ½±ßµÄ²Ù×÷¶¼ÊÇmandatory

2) make || up £½ make OR up£½make up :OR×óÓÒÁ½±ßµÄ²Ù×÷¶¼ÊÇoptional

3) +make +up NOT kiss £½ +make +up ¨Ckiss

4) make AND up OR french AND Kiss²»¿ÉÒÔ´ïµ½ÆÚÍûµÄ½á¹û£¬ÒòΪANDÁ½±ßµÄ²Ù×÷¶¼ÊÇmandatoryµÄ¡£

4. ×Ó±í´ïʽ²éѯ£¨×Ó²éѯ£©£º¿ÉÒÔʹÓá°()¡±¹¹Ôì×Ó²éѯ¡£

ʾÀý£º(make AND up) OR (french AND Kiss)

5.×Ó±í´ïʽ²éѯÖÐ×èÖ¹²éѯµÄÏÞÖÆ£º

ʾÀý£ºmake (-up):Ö»ÄÜÈ¡µÃmakeµÄ²éѯ½á¹û£»ÒªÊ¹ÓÃmake (-up *:*)²éѯmake»òÕß²»°üÀ¨upµÄ½á¹û¡£

6.¶à×Ö¶Îfields²éѯ£ºÍ¨¹ý×Ö¶ÎÃû¼ÓÉϷֺŵķ½Ê½£¨fieldName:query£©À´½øÐвéѯ

ʾÀý£ºentryNm:make AND entryId:3cdc86e8e0fb4da8ab17caed42f6760c

7.ͨÅä·û²éѯ£¨wildCard Query£©£º

1) ͨÅä·û£¿ºÍ*£º¡°*¡±±íʾƥÅäÈÎÒâ×Ö·û£»¡°£¿¡±±íʾƥÅä³öÏÖµÄλÖá£

ʾÀý£ºma?*£¨maºóÃæµÄÒ»¸öλÖÃÆ¥Å䣩£¬ma??*(maºóÃæÁ½¸öλÖö¼Æ¥Åä)

2) ²éѯ×Ö·û±ØÐëҪСд:+Ma +be**¿ÉÒÔËÑË÷µ½½á¹û£»+Ma +Be**ûÓÐËÑË÷½á¹û.

3) ²éѯËٶȽÏÂý£¬ÓÈÆäÊÇͨÅä·ûÔÚÊ×λ£ºÖ÷ÒªÔ­ÒòÒ»ÊÇÐèÒªµü´ú²éѯ×Ö¶ÎÖеÄÿ¸öterm£¬ÅжÏÊÇ·ñÆ¥Å䣻¶þÊÇÆ¥ÅäÉϵÄterm±»¼Óµ½ÄÚ²¿µÄ²éѯ£¬µ±termsÊýÁ¿´ïµ½1024µÄʱºò£¬²éѯ»áʧ°Ü¡£

4) SolrÖÐĬÈÏͨÅä·û²»ÄܳöÏÖÔÚÊ×루¿ÉÒÔÐÞ¸ÄQueryParser£¬ÉèÖÃ

setAllowLeadingWildcardΪtrue£©

5) set setAllowLeadingWildcard to true.

8.Ä£ºý²éѯ¡¢ÏàËÆ²éѯ£º²»ÊǾ«È·µÄ²éѯ£¬Í¨¹ý¶Ô²éѯµÄ×ֶνøÐÐÖØÐ²åÈ롢ɾ³ýºÍת»»À´È¡µÃµÃ·Ö½Ï¸ßµÄ²éѯ½â¾ö£¨ÓÉLevenstein Distance AlgorithmËã·¨Ö§³Ö£©¡£

1) Ò»°ãÄ£ºý²éѯ£ºÊ¾Àý£ºmake-believ~

2) Ãż÷Ä£ºý²éѯ£º¶ÔÄ£ºý²éѯ¿ÉÒÔÉèÖòéѯÃż÷£¬Ãż÷ÊÇ0~1Ö®¼äµÄÊýÖµ£¬Ãż÷Ô½¸ß±íÃæÏàËÆ¶ÈÔ½¸ß¡£Ê¾Àý£ºmake-believ~0.5¡¢make-believ~0.8¡¢make-believ~0.9

9.·¶Î§²éѯ£¨Range Query£©£ºLuceneÖ§³Ö¶ÔÊý×Ö¡¢ÈÕÆÚÉõÖÁÎı¾µÄ·¶Î§²éѯ¡£½áÊøµÄ·¶Î§¿ÉÒÔʹÓá°*¡±Í¨Åä·û¡£

ʾÀý£º

1) ÈÕÆÚ·¶Î§£¨ISO-8601 ʱ¼äGMT£©£ºsa_type:2 AND a_begin_date: [1990-01-01T00:00:00.000Z TO 1999-12-31T24:59:99.999Z]

2) Êý×Ö£ºsalary:[2000 TO *]

3) Îı¾£ºentryNm:[a TO a]

10.ÈÕÆÚÆ¥Å䣺YEAR, MONTH, DAY, DATE (synonymous with DAY) HOUR, MINUTE, SECOND, MILLISECOND, and MILLI (synonymous with MILLISECOND)¿ÉÒÔ±»±êÖ¾³ÉÈÕÆÚ¡£

ʾÀý£º

1) r_event_date:[* TO NOW-2YEAR]£º2ÄêǰµÄÏÖÔÚÕâ¸öʱ¼ä

2) r_event_date:[* TO NOW/DAY-2YEAR]£º2ÄêǰǰһÌìµÄÕâ¸öʱ¼ä

6.2.3º¯Êý²éѯ£¨Function Query£©

º¯Êý²éѯ ¿ÉÒÔÀûÓà numeric×ֶεÄÖµ »òÕß Óë×Ö¶ÎÏà¹ØµÄµÄij¸öÌØ¶¨µÄÖµµÄº¯Êý£¬À´¶ÔÎĵµ½øÐÐÆÀ·Ö¡£

1. ʹÓú¯Êý²éѯµÄ·½·¨

ÕâÀïÖ÷ÒªÓÐÈýÖÖ·½·¨¿ÉÒÔʹÓú¯Êý²éѯ£¬ÕâÈýÖÖs·½·¨¶¼ÊÇͨ¹ýsolr http½Ó¿ÚµÄ¡£

1) ʹÓÃFunctionQParserPlugin¡£ie: q={!func}log(foo)

2) ʹÓá°_val_¡±ÄÚǶ·½·¨

ÄÚǶÔÚÕý³£µÄsolr²éѯ±í´ïʽÖС£¼´£¬½«º¯Êý²éѯдÔÚ qÕâ¸ö²ÎÊýÖУ¬Õâʱºò£¬ÎÒÃÇʹÓá°_val_¡±½«º¯ÊýÓëÆäËûµÄ²éѯ¼ÓÒÔÇø±ð¡£

ie£ºentryNm:make && _val_:ord(entryNm)

3) ʹÓÃdismaxÖеÄbf²ÎÊý

ʹÓÃÃ÷ȷΪº¯Êý²éѯµÄ²ÎÊý£¬±ÈÈç˵dismaxÖеÄbf£¨boost function£©Õâ¸ö²ÎÊý¡£ ×¢Ò⣺bfÕâ¸ö²ÎÊýÊÇ¿ÉÒÔ½ÓÊܶà¸öº¯Êý²éѯµÄ£¬ËüÃÇÖ®¼äÓÿոñ¸ô¿ª£¬ËüÃÇ»¹¿ÉÒÔ´øÉÏÈ¨ÖØ¡£ËùÒÔ£¬µ±ÎÒÃÇʹÓÃbfÕâ¸ö²ÎÊýµÄʱºò£¬ÎÒÃDZØÐë±£Ö¤µ¥¸öº¯ÊýÖÐÊÇûÓпոñ³öÏֵ쬲»È»³ÌÐòÓпÉÄÜ»áÒÔΪÊÇÁ½¸öº¯Êý¡£

ʾÀý£º

q=dismax&bf="ord(popularity)^0.5 recip(rord(price),1,1000,1000)^0.3

2. º¯ÊýµÄ¸ñʽ£¨Function Query Syntax)

Ŀǰ£¬function query ²¢²»Ö§³Ö a+b ÕâÑùµÄÐÎʽ£¬ÎÒÃǵðÑËüд³ÉÒ»¸ö·½·¨ÐÎʽ£¬Õâ¾ÍÊÇ sum(a,b).

3. ʹÓú¯Êý²éѯעÒâÊÂÏî

1) ÓÃÓÚº¯Êý²éѯµÄfield±ØÐëÊDZ»Ë÷ÒýµÄ£»

2) ×ֶβ»¿ÉÒÔÊǶàÖµµÄ£¨multi-value£©

4. ¿ÉÒÔÀûÓõĺ¯Êý £¨available function£©

1) constant£ºÖ§³ÖÓÐСÊýµãµÄ³£Á¿£» ÀýÈ磺1.5 £»SolrQuerySyntax:_val_:1.5

2) fieldvalue£ºÕâ¸öº¯Êý½«»á·µ»Ønumeric fieldµÄÖµ£¬Õâ¸ö×ֶαØÐëÊÇindexdµÄ£¬·ÇmultiValuedµÄ¡£¸ñʽºÜ¼òµ¥£¬¾ÍÊǸÃ×ֶεÄÃû×Ö¡£Èç¹ûÕâ¸ö×Ö¶ÎÖÐûÓÐÕâÑùµÄÖµ£¬ÄÇô½«»á·µ»Ø0¡£

3) ord£º¶ÔÓÚÒ»¸ö×ֶΣ¬ËüËùÓеÄÖµ¶¼½«»á°´ÕÕ×Öµä˳ÐòÅÅÁУ¬Õâ¸öº¯Êý·µ»ØÄãÒª²éѯµÄÄǸöÌØ¶¨µÄÖµÔÚÕâ¸ö˳ÐòÖеÄÅÅÃû¡£Õâ¸ö×ֶΣ¬±ØÐëÊÇ·ÇmultiValuedµÄ£¬µ±Ã»ÓÐÖµ´æÔÚµÄʱºò£¬½«·µ»Ø0¡£ÀýÈ磺ij¸öÌØ¶¨µÄ×Ö¶ÎÖ»ÄÜÈ¥Èý¸öÖµ£¬¡°apple¡±¡¢¡°banana¡±¡¢¡°pear¡±£¬ÄÇôord£¨¡°apple¡±£©=1£¬ord£¨¡°banana¡±£©=2£¬ord£¨¡°pear¡±£©=3.ÐèҪעÒâµÄÊÇ£¬ord£¨£©Õâ¸öº¯Êý£¬ÒÀÀµÓÚÖµÔÚË÷ÒýÖеÄλÖã¬ËùÒÔµ±ÓÐÎĵµ±»É¾³ý¡¢»òÕßÌí¼ÓµÄʱºò£¬ord£¨£©µÄÖµ¾Í»á·¢Éú±ä»¯¡£µ±ÄãʹÓÃMultiSearcherµÄʱºò£¬Õâ¸öÖµÒ²¾ÍÊDz»¶¨µÄÁË¡£

4) rord£ºÕâ¸öº¯Êý½«»á·µ»ØÓëordÏà¶ÔÓ¦µÄµ¹ÅÅÐòµÄÅÅÃû¡£

¸ñʽ: rord(myIndexedField)¡£

5) sum£ºÕâ¸öº¯ÊýµÄÒâ˼¾ÍÏÔ¶øÒ×¼ûÀ²£¬Ëü¾ÍÊDZíʾ¡°ºÍ¡±À²¡£

¸ñʽ£ºsum(x,1) ¡¢sum(x,y)¡¢ sum(sqrt(x),log(y),z,0.5)

6) product£ºproduct(x,y,...)½«»á·µ»Ø¶à¸öº¯ÊýµÄ³Ë»ý¡£¸ñʽ£ºproduct(x,2)¡¢product(x,y)

7) div£ºdiv(x,y)±íʾx³ýÒÔyµÄÖµ£¬¸ñʽ£ºdiv£¨1,x£©¡¢div(sum(x,100),max(y,1))

8) pow£ºpow±íʾÃÝÖµ¡£pow(x,y) =x^y¡£ÀýÈ磺pow(x,0.5) ±íʾ¿ª·½pow(x,log(y))

9) abs£ºabs(x)½«·µ»Ø±í´ïʽµÄ¾ø¶ÔÖµ¡£¸ñʽ£ºabs(-5)¡¢ abs(x)

10) log£ºlog(x)½«»á·µ»Ø»ùÊýΪ10£¬xµÄ¶ÔÊý¡£¸ñʽ£º log(x)¡¢ log(sum(x,100))

11) Sqrt£ºsqrt(x) ·µ»Ø Ò»¸öÊýµÄƽ·½¸ù¡£¸ñʽ£ºsqrt£¨2£©¡¢sqrt(sum(x,100))

12) Map£ºÈç¹û x>=min,ÇÒx<=max,ÄÇômap(x,min,max,target)=target.Èç¹û x²»ÔÚ[min,max]Õâ¸öÇø¼äÄÚ£¬ÄÇômap(x,min,max,target)=x.

¸ñʽ£ºmap(x,0,0,1)

13) Scale£ºscale(x,minTarget,maxTarget) Õâ¸öº¯Êý½«»á°ÑxµÄÖµÏÞÖÆÔÚ[minTarget,maxTarget]·¶Î§ÄÚ¡£

14) query £ºquery(subquery,default)½«»á·µ»Ø¸ø¶¨subqueryµÄ·ÖÊý£¬Èç¹ûsubqueryÓëÎĵµ²»Æ¥Å䣬ÄÇô½«»á·µ»ØÄ¬ÈÏÖµ¡£ÈκεIJéѯÀàÐͶ¼ÊÇÊÜÖ§³ÖµÄ¡£¿ÉÒÔͨ¹ýÒýÓõķ½Ê½£¬Ò²¿ÉÒÔÖ±½ÓÖ¸¶¨²éѯ´®¡£

Àý×Ó£ºq=product(popularity, query({!dismax v='solr rocks'}) ½«»á·µ»ØpopularityºÍͨ¹ýdismax ²éѯµÃµ½µÄ·ÖÊýµÄ³Ë»ý¡£

q=product(popularity, query($qq)&qq={!dismax}solr rocks ¸úÉÏÒ»¸öÀý×ÓµÄЧ¹ûÊÇÒ»ÑùµÄ¡£²»¹ýÕâÀïʹÓõÄÊÇÒýÓõķ½Ê½

q=product(popularity, query($qq,0.1)&qq={!dismax}solr rocks ÔÚǰһ¸öÀý×ӵĻù´¡ÉÏÓÖ¼ÓÁËÒ»¸öĬÈÏÖµ¡£

15) linear£º inear(x,m,c)±íʾ m*x+c ,ÆäÖÐmºÍc¶¼Êdz£Á¿£¬xÊÇÒ»¸ö±äÁ¿Ò²¿ÉÒÔÊÇÒ»¸öº¯Êý¡£ÀýÈ磺 linear(x,2,4)=2*x+4.

16) Recip£ºrecip(x,m,a,b)=a/(m*x+b)ÆäÖУ¬m¡¢a¡¢bÊdz£Á¿£¬xÊDZäÁ¿»òÕßÒ»¸öº¯Êý¡£µ±a=b£¬²¢ÇÒx>=0µÄʱºò£¬Õâ¸öº¯ÊýµÄ×î´óÖµÊÇ1£¬ÖµµÄ´óÐ¡Ëæ×ÅxµÄÔö´ó¶ø¼õС¡£ÀýÈ磺recip(rord(creationDate),1,1000,1000)

17) Max£º max(x,c)½«»á·µ»ØÒ»¸öº¯ÊýºÍÒ»¸ö³£Á¿Ö®¼äµÄ×î´óÖµ¡£

ÀýÈ磺max(myfield,0)

6.3¸ßÁÁÏÔʾ

ÎÒÃǾ­³£Ê¹ÓÃËÑË÷ÒýÇæ£¬±ÈÈçÔÚbaidu ËÑË÷ java £¬»á³öÏÖÈçϽá¹û£¬½á¹ûÖÐÓë¹Ø¼ü×ÖÆ¥ÅäµÄµØ·½ÊǺìÉ«ÏÔʾÓëÆäËûÄÚÈÝÇø±ð¿ªÀ´¡£

solr ĬÈÏÒѾ­ÅäÖÃÁËhighlight ×é¼þ(Ïê¼û SOLR_HOME/conf/sorlconfig.xml)¡£Í¨³£ÎÒ³öÖ»ÐèÒªÕâÑùÇëÇóhttp://localhost:8983/solr/ collection1 /select? q=%E4%B8%AD%E5%9B%BD& start=0&rows=1&fl =content+path+&wt=xml& indent=true&hl=true&hl.fl=content

¿ÉÒÔ¿´µ½Óë±ÈÒ»°ãµÄÇëÇó¶àÁËÁ½¸ö²ÎÊý "hl=true" ºÍ "hl.fl= content " ¡£

"hl=true" ÊÇ¿ªÆô¸ßÁÁ£¬"hl.fl= content " ÊǸæËßsolr ¶Ô name ×ֶνøÐиßÁÁ(Èç¹ûÄãÏë¶Ô¶à¸ö×ֶνøÐиßÁÁ£¬¿ÉÒÔ¼ÌÐøÌí¼Ó×ֶΣ¬×ֶμäÓöººÅ¸ô¿ª£¬Èç "hl.fl=name,name2,name3")¡£ ¸ßÁÁÄÚÈÝÓë¹Ø¼üÆ¥ÅäµÄµØ·½£¬Ä¬ÈϽ«»á±» "<em>" ºÍ "</em>" °üΧ¡£»¹¿ÉÒÔʹÓÃhl.simple.pre" ºÍ "hl.simple.post"²ÎÊýÉèÖÃǰºó±êÇ©.

²éѯ½á¹ûÈçÏ£º

<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">2</int>
<lst name="params">
<str name="fl">content path</str>
<str name="indent">true</str>
<str name="start">0</str>
<str name="q">Öйú</str>
<str name="hl.simple.pre"><em></str>
<str name="hl.simple.post"></em></str>
<str name="hl.fl">content</str>
<str name="wt">xml</str>
<str name="hl">true</str>
<str name="rows">1</str>
</lst>
</lst>

±¾±¨Ñ¶ ÖйúÒøÁª¹É·ÝÓÐÏÞ¹«Ë¾ºÍÖйúµçÐż¯ÍÅÈÕǰÔÚ±±¾©Ç©ÊðÈ«ÃæÕ½ÂÔºÏ×÷ЭÒé¡£Õâ±êÖ¾×ÅÖйúÒøÁªºÍÖйúµçÐŽ«ÔÚͨÐÅ·þÎñ¡¢ÐÅÏ¢ÔöÖµ·þÎñ¡¢ÐÂÐÍÖ§¸¶²úÆ·ºÏ×÷¿ª·¢µÈÁìÓò½¨Á¢È«ÃæºÏ×÷»ï°é¹ØÏµ¡£¡¡¡¡¾ÝϤ£¬Ë«·½Ç©ÊðµÄÈ«ÃæÕ½ÂÔºÏ×÷ЭÒéÖ÷ÒªÄÚÈÝÊÇ£ºÖйúÒøÁª½«Ñ¡ÔñÖйúµçÐÅ×÷ΪͨÐÅÐÅÏ¢·þÎñµÄÖ÷ÒªÌṩÉÌ£¬Ë«·½Î§ÈÆÌá¸ßÖйúÒøÁªÄÚ²¿Í¨ÐŵÄˮƽºÍÏúÊÛÍøÂçµÄ·þÎñˮƽ¿ªÕ¹È«Ãæ¡¢ÉîÈëµÄºÏ×÷£»ÖйúµçÐÅÑ¡ÔñÖйúÒøÁª×÷ÎªÒøÐп¨×ª½ÓÖ§¸¶·þÎñµÄÖ÷ÒªÌṩÉÌ£¬²¢Î§ÈÆ¿ª·¢¡¢ÍƹãÐÂÐÍÖ§¸¶Öն˲úÆ·ºÍÔöÖµ·þÎñ¿ªÕ¹È«ÃæºÏ×÷¡££¨ÐÁ»ª£©

 

±¾±¨Ñ¶ <em>Öйú</em>ÒøÁª¹É·ÝÓÐÏÞ¹«Ë¾ºÍ<em>Öйú</em>µçÐż¯ÍÅÈÕǰÔÚ±±¾©Ç©ÊðÈ«ÃæÕ½ÂÔºÏ×÷ЭÒé¡£Õâ±êÖ¾×Å<em>Öйú</em>ÒøÁªºÍ<em>Öйú</em>µçÐŽ«ÔÚͨÐÅ·þÎñ¡¢ÐÅÏ¢ÔöÖµ·þÎñ¡¢ÐÂÐÍÖ§¸¶²úÆ·ºÏ×÷¿ª·¢µÈÁìÓò½¨Á¢È«ÃæºÏ×÷»ï°é¹ØÏµ¡£¡¡¡¡¾ÝϤ£¬Ë«·½Ç©Êð

ʹÓÃSolrJ·½·¨»ù±¾Ò»ÑùÒ²ÊÇÉèÖÃÕâЩ¸ö²ÎÊý,Ö»²»¹ýÊÇSolrJ·â×°ÆðÀ´ÁË,´úÂëÈçÏÂ:

SolrQuery query = new SolrQuery();
query.set("q","*.*");
query.setHighlight(true); // ¿ªÆô¸ßÁÁ×é¼þ
query.addHighlightField("content");// ¸ßÁÁ×Ö¶Î
query.setHighlightSimplePre(PRE_TAG);// 񈬀
query.setHighlightSimplePost(POST_TAG);
QueryResponse rsp =server.query(query)
//¡­ÉÏÃæÈ¡½á¹ûµÄ´úÂë
//È¡³ö¸ßÁÁ½á¹û
if (rsp.getHighlighting() != null) {
if (rsp.getHighlighting().get(id) != null) {//ÏÈͨ¹ý½á¹ûÖеÄIDµ½¸ßÁÁ¼¯ºÏÖÐÈ¡³öÎĵµ¸ßÁÁÐÅÏ¢
Map<String, List<String>> map = rsp.getHighlighting().get(id);//È¡³ö¸ßÁÁƬ¶Î
if (map.get(name) != null) {
for (String s : map.get(name)) {
System.out.println(s);
}
}
}

6.4ƴд¼ì²é

Ê×ÏÈÅäÖà solrconfig.xml£¬Îļþ¿ÉÄÜÒѾ­ÓÐÕâÁ½¸öÔªËØ(Èç¹ûûÓÐÌí¼Ó¼´¿É)£¬ÐèÒª¸ù¾ÝÎÒÃÇ×Ô¼ºµÄϵͳ»·¾³×öЩÊʵ±µÄÐ޸ġ£

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">text_spell</str>
<lst name="spellchecker">
<str name="name">direct</str>
<str name="field">spell</str>
<str name="classname">solr.DirectSolrSpellChecker</str>
<str name="distanceMeasure">internal</str>
<float name="accuracy">0.5</float>
<int name="maxEdits">2</int>
<int name="minPrefix">1</int>
<int name="maxInspections">5</int>
<int name="minQueryLength">2</int>
<float name="maxQueryFrequency">0.01</float>
</lst>
</searchComponent>

<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="spellcheck.dictionary">direct</str>
<str name="spellcheck">on</str>
<str name="spellcheck.collate">true</str>
<str name="spellcheck.collateExtendedResults">true</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>

 

ÅäÖÃÍê³ÉÖ®ºó£¬ÎÒÃǽøÐÐһϲâÊÔ,ÖØÆôSolrºó£¬·ÃÎÊÁ´½Ó

 

<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
</lst>
<result name="response" numFound="0" start="0"/>
<lst name="spellcheck">
<lst name="suggestions">
<lst name="beijink">
<int name="numFound">1</int>
<int name="startOffset">0</int>
<int name="endOffset">3</int>
<arr name="suggestion">
<str>beijing</str>
</arr>
</lst>
</lst>
</lst>
</response>

ʹÓÃSolrJʱҲͬÑù¼ÓÈë²ÎÊý¾Í¿ÉÒÔ


SolrQuery query = new SolrQuery();
query.set("q","*.*");
query.set("qt", "/spell");
QueryResponse rsp =server.query(query)
//¡­ÉÏÃæÈ¡½á¹ûµÄ´úÂë
SpellCheckResponse spellCheckResponse = rsp.getSpellCheckResponse();
if (spellCheckResponse != null) {
String collation = spellCheckResponse.getCollatedResult();
}

6.5¼ìË÷½¨Òé

¼ìË÷½¨ÒéĿǰÊǸ÷´óËÑË÷µÄ±êÅäÓ¦Óã¬Ö÷Òª×÷ÓÃÊDZÜÃâÓû§ÊäÈë´íÎóµÄËÑË÷´Ê£¬Í¬Ê±½«Óû§Òýµ¼µ½ÏàÓ¦µÄ¹Ø¼ü´ÊËÑË÷ÉÏ¡£SolrÄÚÖÃÁ˼ìË÷½¨Ò鹦ÄÜ£¬ËüÔÚSolrÀï½Ð×öSuggestÄ£¿é.¸ÃÄ£¿é¿ÉÑ¡Ôñ»ùÓÚÌáʾ´ÊÎı¾×ö¼ìË÷½¨Ò飬»¹Ö§³Öͨ¹ýÕë¶ÔË÷ÒýµÄij¸ö×ֶν¨Á¢Ë÷Òý´Ê¿â×ö¼ìË÷½¨Òé¡£ÔÚÖî¶àÎĵµÖж¼ÍƼöʹÓûùÓÚË÷ÒýÀ´×ö¼ìË÷½¨Ò飬Òò´ËÎÒÃÇĿǰµÄʵÏÖÒ²ÊDzÉÈ¡¸Ã·½°¸¡£

ÏÖÔÚÎÒÃÇ¿ªÊ¼ÅäÖÃSuggestÄ£¿é,Ê×ÏÈÔÚsolrconfig.xmlÎļþÖÐÅäÖÃSuggestÒÀÀµµÄSpellCheckerÄ£¿é£¬È»ºóÔÙÅäÖÃSuggestÄ£¿é,ËùÒÔÕâÁ½¸ö¶¼ÐèÒªÅäÖá£

<searchComponent name="suggest" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">string</str>
<lst name="spellchecker">
<str name="name">suggest</str>
<str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
<str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
<str name="field">text</str>
<float name="threshold">0.0001</float>
<str name="spellcheckIndexDir">spellchecker</str>
<str name="comparatorClass">freq</str>
<str name="buildOnOptimize">true</str>
<!--<str name="buildOnCommit">true</str>-->
</lst>
</searchComponent>
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="spellcheck">true</str>
<str name="spellcheck.dictionary">suggest</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.extendedResults">false</str>
<str name="spellcheck.count">10</str>
<str name="spellcheck.collate">true</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>

 

ÅäÖÃÍê³ÉÖ®ºó£¬ÎÒÃǽøÐÐһϲâÊÔ,ÖØÆôSolrºó£¬·ÃÎÊÈçÏÂÁ´½Ó

http://localhost:8983/solr/ collection1/suggest?wt=xml&indent=true&spellcheck=true&spellcheck.q=%E4%B8%AD%E5%9B%BD

<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">4</int>
</lst>
<lst name="spellcheck">
<lst name="suggestions">
<lst name="Öйú">
<int name="numFound">4</int>
<int name="startOffset">0</int>
<int name="endOffset">2</int>
<arr name="suggestion">
<str>Öйú¶Ó</str>
<str>ÖйúÖ¤¼à»á</str>
<str>Öйú×ãЭ</str>
<str>ÖйúÒøÐÐ</str>
</arr>
</lst>
</lst>
</lst>
</response>

 

ʹÓÃSolrJʱҲͬÑù¼ÓÈë²ÎÊý¾Í¿ÉÒÔ


SolrQuery query = new SolrQuery();
query.set("q", token);
query.set("qt", "/suggest");
query.set("spellcheck.count", "10");
QueryResponse response = server.query(query);
SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse();
if (spellCheckResponse != null) {
List<SpellCheckResponse.Suggestion> suggestionList = spellCheckResponse.getSuggestions();
for (SpellCheckResponse.Suggestion suggestion : suggestionList) {
List<String> suggestedWordList = suggestion.getAlternatives();
for (int i = 0; i < suggestedWordList.size(); i++) {
String word = suggestedWordList.get(i);
}
}
return results;
}

 

ͨ¹ýthreshold²ÎÊýÀ´ÏÞÖÆÒ»Ð©²»³£ÓõĴʲ»³öÏÖÔÚÖÇÄÜÌáʾÁбíÖУ¬µ±Õâ¸öÖµÉèÖùý´óʱ£¬¿ÉÄܵ¼Ö½á¹ûÌ«ÉÙ£¬ÐèÒªÒýÆð×¢Ò⡣ĿǰÖ÷Òª´æÔÚµÄÎÊÌâÊÇʹÓÃfreqÅÅÐòËã·¨£¬·µ»ØµÄ½á¹ûÍêÈ«»ùÓÚË÷ÒýÖÐ×Ö·ûµÄ³öÏÖ´ÎÊý£¬Ã»Óмæ¹ËÓû§ËÑË÷´ÊÓïµÄƵÂÊ£¬Òò´ËÎÞ·¨½«Ò»Ð©ÈÈÃÅ´ÊÅÅÔÚ¸ü¿¿Ç°µÄλÖá£Õâ¿é¿É¶¨ÖÆSuggestWordScoreComparatorÀ´ÊµÏÖ£¬Ä¿Ç°»¹Ã»ÓÐ×ÅÊÖ×öÕâ¼þÊÂÇé¡£

6.6·Ö×éͳ¼Æ

ÎÒÕâÀïʵÏÖ·Ö×éͳ¼ÆµÄ·½·¨ÊÇʹÓÃÁËSolrµÄFacet×é¼þ, Facet×é¼þÊÇSolrĬÈϼ¯³ÉµÄÒ»¸ö×é¼þ.

6.6.1 Facet¼ò½é

FacetÊÇsolrµÄ¸ß¼¶ËÑË÷¹¦ÄÜÖ®Ò»,¿ÉÒÔ¸øÓû§Ìṩ¸üÓѺõÄËÑË÷ÌåÑé.ÔÚËÑË÷¹Ø¼ü×ÖµÄͬʱ,Äܹ»°´ÕÕFacetµÄ×ֶνøÐзÖ×鲢ͳ¼Æ

6.6.2 Facet×Ö¶Î

1. ÊÊÒ˱»FacetµÄ×Ö¶Î

Ò»°ã´ú±íÁËʵÌåµÄijÖÖ¹«¹²ÊôÐÔ,ÈçÉÌÆ·µÄ·ÖÀà,ÉÌÆ·µÄÖÆÔì³§¼Ò,Êé¼®µÄ³ö°æÉ̵ȵÈ.

2. Facet×ֶεÄÒªÇó

FacetµÄ×ֶαØÐë±»Ë÷Òý.Ò»°ãÀ´Ëµ¸Ã×Ö¶ÎÎÞÐè·Ö´Ê,ÎÞÐè´æ´¢.

ÎÞÐè·Ö´ÊÊÇÒòΪ¸Ã×ֶεÄÖµ´ú±íÁËÒ»¸öÕûÌå¸ÅÄî,ÈçµçÄÔµÄÆ·ÅÆ¡±ÁªÏ롱´ú±íÁËÒ»¸öÕû Ìå¸ÅÄî,Èç¹û²ð³É¡±Áª¡±,¡±Ï롱Á½¸ö×Ö¶¼²»¾ßÓÐʵ¼ÊÒâÒå.ÁíÍâ¸Ã×ֶεÄÖµÎÞÐè½øÐдóС дת»»µÈ´¦Àí,±£³ÖÆäԭò¼´¿É.

ÎÞÐè´æ´¢ÊÇÒòΪһ°ã¶øÑÔÓû§Ëù¹ØÐĵIJ¢²»ÊǸÃ×ֶεľßÌåÖµ,¶øÊÇ×÷Ϊ¶Ô²éѯ½á¹û½ø ÐзÖ×éµÄÒ»ÖÖÊÖ¶Î,Óû§Ò»°ã»áÑØ×ÅÕâ¸ö·Ö×é½øÒ»²½ÉîÈëËÑË÷.

3. ÌØÊâÇé¿ö

¶ÔÓÚÒ»°ã²éѯ¶øÑÔ,·Ö´ÊºÍ´æ´¢¶¼ÊDZØÒªµÄ.±ÈÈçCPUÀàÐÍ¡±Intel ¿áî£2Ë«ºË P7570¡±, ²ð·Ö³É¡±Intel¡±,¡±¿á±,¡±P7570¡±ÕâÑùһЩ¹Ø¼ü×Ö²¢·Ö±ðË÷Òý,¿ÉÄÜÌṩ¸üºÃµÄËÑË÷ ÌåÑé.µ«ÊÇÈç¹û½«CPU×÷ΪFacet×Ö¶Î,×îºÃ²»½øÐзִÊ.ÕâÑù¾ÍÔì³ÉÁËì¶Ü,½â¾ö·½·¨Îª, ½«CPU×Ö¶ÎÉèÖÃΪ²»·Ö´Ê²»´æ´¢,È»ºó½¨Á¢ÁíÍâÒ»¸ö×Ö¶ÎΪËüµÄCOPY,¶ÔÕâ¸öCOPYµÄ ×ֶνøÐзִʺʹ洢.

<types>
<fieldType name="string" class="solr.StrField" omitNorms="true"/>
<fieldType name="tokened" class="solr.TextField" >
<analyzer>
¡­¡­
</analyzer>
</fieldType>
</types>
<fields>
<field name="cpu" type="string" indexed="true" stored="false"/>
<field name="cpuCopy¡± type=" tokened" indexed="true" stored="true"/>
</fields>
<copyField source="cpu" dest="cpuCopy"/>

6.6.2 Facet×é¼þ

SolrµÄĬÈÏrequestHandlerÒѾ­°üº¬ÁËFacet×é¼þ(solr.FacetComponent).Èç¹û×Ô¶¨ÒårequestHandler»òÕß¶ÔĬÈϵÄrequestHandler×Ô¶¨Òå×é¼þÁбí,ÄÇôÐèÒª½«Facet¼ÓÈëµ½×é¼þÁбíÖÐÈ¥.

<requestHandler name="standard" class="solr.SearchHandler" default="true">
¡­¡­
<arr name="components">
<str>×Ô¶¨Òå×é¼þÃû</str>
<str>facet</str>
¡­¡­
</arr>
</requestHandler>

6.6.2 Facet²éѯ

½øÐÐFacet²éѯÐèÒªÔÚÇëÇó²ÎÊýÖмÓÈëfacet=on»òÕßfacet=trueÖ»ÓÐÕâÑùFacet×é¼þ²ÅÆð×÷ÓÃ.

1. Field Facet

Facet×Ö¶Îͨ¹ýÔÚÇëÇóÖмÓÈëfacet.field²ÎÊý¼ÓÒÔÉùÃ÷,Èç¹ûÐèÒª¶Ô¶à¸ö×ֶνøÐÐFacet²éѯ,ÄÇô½«¸Ã²ÎÊýÉùÃ÷¶à´Î.ÀýÈç:

http://localhost:8983/solr/ collection1/select?q=*%3A*&start=0&rows=1&wt=xml&indent=true&facet=true&facet.field=category_s&facet.field=modified_l

·µ»Ø½á¹û:

<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
<lst name="params">
<str name="facet">true</str>
<str name="indent">true</str>
<str name="start">0</str>
<str name="q">*:*</str>
<arr name="facet.field">
<str>category_s</str>
<str>modified_l</str>
</arr>
<str name="wt">xml</str>
<str name="rows">0</str>
</lst>
</lst>
<result name="response" numFound="17971" start="0">
</result>
<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name="category_s">
<int name="0">5991</int>
<int name="1">5990</int>
<int name="2">5990</int>
</lst>
<lst name="modified_l">
<int name="1162438554000">951</int>
<int name="1162438556000">917</int>
<int name="1162438548000">902</int>
<int name="1162438546000">674</int>
</lst>
</lst>
<lst name="facet_dates"/>
<lst name="facet_ranges"/>
</lst>
</response>

¸÷¸öFacet×ֶλ¥²»Ó°Ïì,ÇÒ¿ÉÒÔÕë¶Ôÿ¸öFacet×Ö¶ÎÉèÖòéѯ²ÎÊý.ÒÔϽéÉܵIJÎÊý¼È¿ÉÒÔÓ¦ÓÃÓÚËùÓеÄFacet×Ö¶Î,Ò²¿ÉÒÔÓ¦ÓÃÓÚÿ¸öµ¥¶ÀµÄFacet×Ö¶Î.Ó¦ÓÃÓÚµ¥¶ÀµÄ×Ö¶Îʱͨ¹ý

f.×Ö¶ÎÃû.²ÎÊýÃû=²ÎÊýÖµ

ÕâÖÖ·½Ê½µ÷ÓÃ.±ÈÈçfacet.prefix²ÎÊýÓ¦ÓÃÓÚcpu×Ö¶Î,¿ÉÒÔ²ÉÓÃÈçÏÂÐÎʽ

f.cpu.facet.prefix=Intel

1.1 facet.prefix

±íʾFacet×Ö¶ÎÖµµÄǰ׺.±ÈÈçfacet.field=cpu&facet.prefix=Intel,ÄÇô¶Ôcpu×ֶνøÐÐFacet²éѯ,·µ»ØµÄcpu¶¼ÊÇÒÔIntel¿ªÍ·µÄ, AMD¿ªÍ·µÄcpuÐͺŽ«²»»á±»Í³¼ÆÔÚÄÚ.

1.2 facet.sort

±íʾFacet×Ö¶ÎÖµÒÔÄÄÖÖ˳Ðò·µ»Ø.¿É½ÓÊܵÄֵΪtrue(count)|false(index,lex). true(count)±íʾ°´ÕÕcountÖµ´Ó´óµ½Ð¡ÅÅÁÐ. false(index,lex)±íʾ°´ÕÕ×Ö¶ÎÖµµÄ×ÔȻ˳Ðò(×Öĸ,Êý×ÖµÄ˳Ðò)ÅÅÁÐ.ĬÈÏÇé¿öÏÂΪtrue(count).µ±facet.limitֵΪ¸ºÊýʱ,ĬÈÏfacet.sort= false(index,lex).

1.3 facet.limit

ÏÞÖÆFacet×ֶηµ»ØµÄ½á¹ûÌõÊý.ĬÈÏֵΪ100.Èç¹û´ËֵΪ¸ºÊý,±íʾ²»ÏÞÖÆ.

1.4 facet.offset

·µ»Ø½á¹û¼¯µÄÆ«ÒÆÁ¿,ĬÈÏΪ0.ËüÓëfacet.limitÅäºÏʹÓÿÉÒÔ´ïµ½·ÖÒ³µÄЧ¹û.

1.5 facet.mincount

ÏÞÖÆÁËFacet×Ö¶ÎÖµµÄ×îСcount,ĬÈÏΪ0.ºÏÀíÉèÖøòÎÊý¿ÉÒÔ½«Óû§µÄ¹Ø×¢µã¼¯ÖÐÔÚÉÙÊý±È½ÏÈÈÃŵÄÁìÓò.

1.6 facet.missing

ĬÈÏΪ¡±¡±,Èç¹ûÉèÖÃΪtrue»òÕßon,ÄÇô½«Í³¼ÆÄÇЩ¸ÃFacet×Ö¶ÎֵΪnullµÄ¼Ç¼.

1.7 facet.method

ȡֵΪenum»òfc,ĬÈÏΪfc.¸Ã×ֶαíʾÁËÁ½ÖÖFacetµÄËã·¨,ÓëÖ´ÐÐЧÂÊÏà¹Ø.

enumÊÊÓÃÓÚ×Ö¶ÎÖµ±È½ÏÉÙµÄÇé¿ö,±ÈÈç×Ö¶ÎÀàÐÍΪ²¼¶ûÐÍ,»òÕß×ֶαíʾÖйúµÄËùÓÐÊ¡·Ý.Solr»á±éÀú¸Ã×ֶεÄËùÓÐȡֵ,²¢´ÓfilterCacheÀïΪÿ¸öÖµ·ÖÅäÒ»¸öfilter(ÕâÀïÒªÇósolrconfig.xmlÀï¶ÔfilterCacheµÄÉèÖÃ×ã¹»´ó).È»ºó¼ÆËãÿ¸öfilterÓëÖ÷²éѯµÄ½»¼¯.

fc(±íʾField Cache)ÊÊÓÃÓÚ×Ö¶Îȡֵ±È½Ï¶à,µ«ÔÚÿ¸öÎĵµÀï³öÏÖ´ÎÊý±È½ÏÉÙµÄÇé¿ö.Solr»á±éÀúËùÓеÄÎĵµ,ÔÚÿ¸öÎĵµÄÚËÑË÷CacheÄÚµÄÖµ,Èç¹ûÕÒµ½¾Í½«CacheÄÚ¸ÃÖµµÄcount¼Ó1.

1.8 facet.enum.cache.minDf

µ±facet.method=enumʱ,´Ë²ÎÊýÆä×÷ÓÃ,minDf±íʾminimum document frequency.Ò²¾ÍÊÇÎĵµÄÚ³öÏÖij¸ö¹Ø¼ü×ÖµÄ×îÉÙ´ÎÊý.¸Ã²ÎÊýĬÈÏֵΪ0.ÉèÖøòÎÊý¿ÉÒÔ¼õÉÙfilterCacheµÄÄÚ´æÏûºÄ,µ«»áÔö¼Ó×ܵIJéѯʱ¼ä(¼ÆËã½»¼¯µÄʱ¼äÔö¼ÓÁË).Èç¹ûÉèÖøÃÖµµÄ»°,¹Ù·½Îĵµ½¨ÒéÓÅÏȳ¢ÊÔ25-50ÄÚµÄÖµ.

6.6.3 Date Facet

ÈÕÆÚÀàÐ͵Ä×Ö¶ÎÔÚÎĵµÖкܳ£¼û,ÈçÉÌÆ·ÉÏÊÐʱ¼ä,»õÎï³ö²Öʱ¼ä,Êé¼®ÉϼÜʱ¼äµÈµÈ.ijЩÇé¿öÏÂÐèÒªÕë¶ÔÕâЩ×ֶνøÐÐFacet.²»¹ýʱ¼ä×ֶεÄȡֵÓÐÎÞÏÞÐÔ,Óû§ÍùÍù¹ØÐĵIJ»ÊÇij¸öʱ¼äµã¶øÊÇij¸öʱ¼ä¶ÎÄڵIJéѯͳ¼Æ½á¹û. SolrΪÈÕÆÚ×Ö¶ÎÌṩÁ˸üΪ·½±ãµÄ²éѯͳ¼Æ·½Ê½.µ±È»,×ֶεÄÀàÐͱØÐëÊÇDateField(»òÆä×ÓÀàÐÍ).

ÐèҪעÒâµÄÊÇ,ʹÓÃDate Facetʱ,×Ö¶ÎÃû,Æðʼʱ¼ä,½áÊøÊ±¼ä,ʱ¼ä¼ä¸ôÕâ4¸ö²ÎÊý¶¼±ØÐëÌṩ.ÓëField FacetÀàËÆ,Date FacetÒ²¿ÉÒÔ¶Ô¶à¸ö×ֶνøÐÐFacet.²¢ÇÒÕë¶Ôÿ¸ö×ֶζ¼¿ÉÒÔµ¥¶ÀÉèÖòÎÊý.

facet.date:¸Ã²ÎÊý±íʾÐèÒª½øÐÐDate FacetµÄ×Ö¶ÎÃû,Óëfacet.fieldÒ»Ñù,¸Ã²ÎÊý¿ÉÒÔ±»ÉèÖöà´Î,±íʾ¶Ô¶à¸ö×ֶνøÐÐDate Facet.

facet.date.start:Æðʼʱ¼ä,ʱ¼äµÄÒ»°ã¸ñʽΪ1995-12-31T23:59:59Z,ÁíÍâ¿ÉÒÔʹÓÃNOW\YEAR\ MONTHµÈµÈ,¾ßÌå¸ñʽ¿ÉÒԲο¼DateFieldµÄjava doc.

facet.date.end:½áÊøÊ±¼ä.

facet.date.gap:ʱ¼ä¼ä¸ô.Èç¹ûstartΪ2009-1-1,endΪ2010-1-1.gapÉèÖÃΪ+1MONTH±íʾ¼ä¸ô1¸öÔÂ,ÄÇô½«»á°ÑÕâ¶Îʱ¼ä»®·ÖΪ12¸ö¼ä¸ô¶Î.

×¢Òâ+ÒòΪÊÇÌØÊâ×Ö·ûËùÒÔÓ¦¸ÃÓÃ%2B´úÌæ.

facet.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.

facet.date.other:ȡֵ·¶Î§Îªbefore|after|between|none|all,ĬÈÏΪnone.before»á¶Ôstart֮ǰµÄÖµ×öͳ¼Æ.after»á¶ÔendÖ®ºóµÄÖµ×öͳ¼Æ.between»á¶ÔstartÖÁendÖ®¼äËùÓÐÖµ×öͳ¼Æ.Èç¹ûhardendΪtrueµÄ»°,ÄÇô¸ÃÖµ¾ÍÊǸ÷¸öʱ¼ä¶Îͳ¼ÆÖµµÄºÍ.none±íʾ¸ÃÏî½ûÓÃ.all±íʾbefore,after,all¶¼»áͳ¼Æ.

¾ÙÀý:


&facet=on
&facet.date=date
&facet.date.start=2009-1-1T0:0:0Z
&facet.date.end=2010-1-1T0:0:0Z
&facet.date.gap=%2B1MONTH
&facet.date.other=all

 

·µ»Ø½á¹û:

<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields"/>
<lst name="facet_dates">
<int name="2009-01-01T00:00:00Z">5</int>
<int name="2009-02-01T00:00:00Z">7</int>
<int name="2009-03-01T00:00:00Z">4</int>
<int name="2009-04-01T00:00:00Z">3</int>
<int name="2009-05-01T00:00:00Z">7</int>
<int name="2009-06-01T00:00:00Z">3</int>
<int name="2009-07-01T00:00:00Z">6</int>
<int name="2009-08-01T00:00:00Z">7</int>
<int name="2009-09-01T00:00:00Z">2</int>
<int name="2009-10-01T00:00:00Z">4</int>
<int name="2009-11-01T00:00:00Z">1</int>
<int name="2009-12-01T00:00:00Z">5</int>
<str name="gap">+1MONTH</str>
<date name="end">2010-01-01T00:00:00Z</date>
<int name="before">180</int>
<int name="after">5</int>
<int name="between">54</int>
</lst>
</lst>

 

6.6.4 Facet Query

Facet QueryÀûÓÃÀàËÆÓÚfilter queryµÄÓï·¨ÌṩÁ˸üΪÁé»îµÄFacet.ͨ¹ýfacet.query²ÎÊý,¿ÉÒÔ¶ÔÈÎÒâ×ֶνøÐÐɸѡ.

Àý1:

&facet=on
&facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]
&facet.query=date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]

 

·µ»Ø½á¹û:

<lst name="facet_counts">
<lst name="facet_queries">
<int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int>
<int name="date:[2009-4-1T0:0:0Z TO 2009-5-1T0:0:0Z]">3</int>
</lst>
<lst name="facet_fields"/>
<lst name="facet_dates"/>
</lst>

 

Àý2:

&facet=on
&facet.query=date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]
&facet.query=price:[* TO 5000]

 

·µ»Ø½á¹û:

lst name="facet_counts">
<lst name="facet_queries">
<int name="date:[2009-1-1T0:0:0Z TO 2009-2-1T0:0:0Z]">5</int>
<int name="price:[* TO 5000]">116</int>
</lst>
<lst name="facet_fields"/>
<lst name="facet_dates"/>
</lst>

 

Àý3:


&facet=on
&facet.query=cpu:[A TO G]

 

·µ»Ø½á¹û:

<lst name="facet_counts">
<lst name="facet_queries">
<int name="cpu:[A TO G]">11</int>
</lst>
<lst name="facet_fields"/>
<lst name="facet_dates"/>
</lst>

 

6.6.5 key²Ù×÷·û

¿ÉÒÔÓÃkey²Ù×÷·ûΪFacet×Ö¶Îȡһ¸ö±ðÃû.

Àý:


&facet=on
&facet.field={!key=ÖÐÑë´¦ÀíÆ÷}cpu
&facet.field={!key=ÏÔ¿¨}videoCard

 

·µ»Ø½á¹û:

<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name="ÖÐÑë´¦ÀíÆ÷">
<int name="Intel ¿áî£2Ë«ºË T6600">48</int>
<int name="Intel ±¼ÌÚË«ºË T4300">28</int>
<int name="Intel ¿áî£2Ë«ºË P8700">18</int>
<int name="Intel ¿áî£2Ë«ºË T6570">11</int>
<int name="Intel ¿áî£2Ë«ºË T6670">11</int>
<int name="Intel ±¼ÌÚË«ºË T4400">9</int>
<int name="Intel ¿áî£2Ë«ºË P7450">9</int>
<int name="Intel ¿áî£2Ë«ºË T5870">8</int>
<int name="Intel ÈüÑïË«ºË T3000">7</int>
<int name="Intel ±¼ÌÚË«ºË SU4100">6</int>
<int name="Intel ¿áî£2Ë«ºË P8400">6</int>
<int name="Intel ¿áî£2Ë«ºË SU7300">5</int>
<int name="Intel ¿áî£ i3 330M">4</int>
</lst>
<lst name="ÏÔ¿¨">
<int name="ATI Mobility Radeon HD 4">63</int>
<int name="NVIDIA GeForce G 105M">24</int>
<int name="NVIDIA GeForce GT 240M">21</int>
<int name="NVIDIA GeForce G 103M">8</int>
<int name="NVIDIA GeForce GT 220M">8</int>
<int name="NVIDIA GeForce 9400M G">7</int>
<int name="NVIDIA GeForce G 210M">6</int>
</lst>
</lst>
<lst name="facet_dates"/>
</lst>

 

6.6.6 tag²Ù×÷·ûºÍex²Ù×÷·û

µ±²éѯʹÓÃfilter queryµÄʱºò,Èç¹ûfilter queryµÄ×Ö¶ÎÕýºÃÊÇFacet×Ö¶Î,ÄÇô²éѯ½á¹ûÍùÍù±»ÏÞÖÆÔÚijһ¸öÖµÄÚ.

Àý:

&fq=screenSize:14
&facet=on
&facet.field=screenSize

 

·µ»Ø½á¹û:

<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name=" screenSize">
<int name="14.0">107</int>
<int name="10.2">0</int>
<int name="11.1">0</int>
<int name="11.6">0</int>
<int name="12.1">0</int>
<int name="13.1">0</int>
<int name="13.3">0</int>
<int name="14.1">0</int>
<int name="15.4">0</int>
<int name="15.5">0</int>
<int name="15.6">0</int>
<int name="16.0">0</int>
<int name="17.0">0</int>
<int name="17.3">0</int>
</lst>
</lst>
<lst name="facet_dates"/>
</lst>

 

¿ÉÒÔ¿´µ½,ÆÁÄ»³ß´ç(screenSize)Ϊ14´çµÄ²úÆ·¹²ÓÐ107¼þ,ÆäËü³ß´çµÄ²úÆ·µÄÊýÄ¿¶¼ÊÇ0,ÕâÊÇÒòΪÔÚfilterÀïÒѾ­ÏÞÖÆÁËscreenSize:14.ÕâÑù,²éѯ½á¹ûÖÐ,³ýÁËscreenSize=14µÄÕâÒ»ÏîÖ®Íâ,ÆäËüÏîĿûÓÐʵ¼ÊµÄÒâÒå.ÓÐЩʱºò,Óû§Ï£Íû°Ñ½á¹ûÏÞÖÆÔÚijһ·¶Î§ÄÚ,ÓÖÏ£Íû²é¿´¸Ã·¶Î§ÍâµÄ¸Å¿ö.±ÈÈçÉÏÊöÇé¿ö,¼ÈÒª°Ñ²éѯ½á¹ûÏÞÖÆÔÚ14´çÆÁµÄ±Ê¼Ç±¾,ÓÖÏë²é¿´Ò»ÏÂÆäËüÆÁÄ»³ß´çµÄ±Ê¼Ç±¾ÓжàÉÙ²úÆ·.Õâ¸öʱºòÐèÒªÓõ½tagºÍex²Ù×÷·û.tag¾ÍÊǰÑÒ»¸öfilter±ê¼ÇÆðÀ´,ex(exclude)ÊÇÔÚFacetµÄʱºò°Ñ±ê¼Ç¹ýµÄfilterÅųýÔÚÍâ.

Àý:


&fq={!tag=aa}screenSize:14
&facet=on
&facet.field={!ex=aa}screenSize

 

·µ»Ø½á¹û:


<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name=" screenSize">
<int name="14.0">107</int>
<int name="14.1">40</int>
<int name="13.3">34</int>
<int name="15.6">22</int>
<int name="15.4">8</int>
<int name="11.6">6</int>
<int name="12.1">5</int>
<int name="16.0">5</int>
<int name="15.5">3</int>
<int name="17.0">3</int>
<int name="17.3">3</int>
<int name="10.2">1</int>
<int name="11.1">1</int>
<int name="13.1">1</int>
</lst>
</lst>
<lst name="facet_dates"/>
</lst>

 

ÕâÑùÆäËüÆÁÄ»³ß´çµÄͳ¼ÆÐÅÏ¢¾ÍÓÐÒâÒåÁË.

6.6.7 SolrJ¶ÔFacetµÄÖ§³Ö


//³õʼ»¯²éѯ¶ÔÏó
String q = ¡°*.*¡±;
SolrQuery query = new SolrQuery(q);
query.setIncludeScore(false);//ÊÇ·ñ°´Ã¿×éÊýÁ¿¸ßµÍÅÅÐò
query.setFacet(true);//ÊÇ·ñ·Ö×é²éѯ
query.setRows(0);//ÉèÖ÷µ»Ø½á¹ûÌõÊý£¬Èç¹ûÄãʱ·Ö×é²éѯ£¬Äã¾ÍÉèÖÃΪ0
query.addFacetField(¡°modified_l¡±);//Ôö¼Ó·Ö×é×Ö¶Î q
query.addFacetQuery (¡°category_s[0 TO 1]¡±);
QueryResponse rsp = server.query(query);
¡­
//È¡³ö½á¹û
List<FacetField.Count> list = rsp.getFacetField(¡°modified_l¡±).getValues();
Map<String, Integer> list = rsp.getFacetQuery();

6.7×Ô¶¯¾ÛÀà

Solr ʹÓÃCarrot2Íê³ÉÁ˾ÛÀ๦ÄÜ,Äܹ»°Ñ¼ìË÷µ½µÄÄÚÈÝ×Ô¶¯·ÖÀà, Carrot2¾ÛÀàʾÀý:

ÒªÏëSolrÖ§³Ö¾ÛÀ๦ÄÜ,Ê×ѡҪ°ÑSolr·¢ÐаüµÄÖеÄdist/ solr-clustering-4.2.0.jar, ¸´ÖƵ½\solr\contrib\analysis-extras\libÏÂ.È»ºó´ò¿ªsolrconfig.xml½øÐÐÌí¼ÓÅäÖÃ:

<searchComponent name="clustering"
enable="${solr.clustering.enabled:true}"
class="solr.clustering.ClusteringComponent" >
<lst name="engine">
<str name="name">default</str>
<str name="carrot.algorithm">org.carrot2.clustering.
lingo.LingoClusteringAlgorithm</str>
<str name="LingoClusteringAlgorithm.desiredClusterCountBase">20</str>
</lst>
</searchComponent>

 

ÅäºÃÁ˾ÛÀà×é¼þºó,ÏÂÃæÅäÖÃrequestHandler:


<requestHandler name="/clustering" startup="lazy" enable="${solr.clustering.enabled:true}" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<bool name="clustering">true</bool>
<str name="clustering.engine">default</str>
<bool name="clustering.results">true</bool>
<str name="carrot.title">category_s</str>
<str name="carrot.snippet">content</str> </lst>
<arr name="last-components">
<str>clustering</str> </arr>
</requestHandler>

ÓÐÁ½¸ö²ÎÊýҪעÒâcarrot.title, carrot.snippetÊǾÛÀàµÄ±È½Ï¼ÆËã×Ö¶Î,ÕâÁ½¸ö²ÎÊý±ØÐëÊÇstored="true".carrot.titleµÄÈ¨ÖØÒª¸ßÓÚcarrot.snippet,Èç¹ûÖ»ÓÐÒ»¸ö×ö¼ÆËãµÄ×Ö¶Îcarrot.snippet¿ÉÒÔÈ¥µô(ÊÇÈ¥µô²»ÊÇֵΪ¿Õ).ÉèÍêÁËÓÃÏÂÃæµÄURL¾Í¿ÉÒÔ²éѯÁË

http://localhost:8983/skyCore/clustering?q=*%3A*&wt=xml&indent=true

6.8ÏàËÆÆ¥Åä

¡¡¡¡ÔÚÎÒÃÇʹÓÃÍøÒ³ËÑË÷ʱ£¬»á×¢Ò⵽ÿһ¸ö½á¹û¶¼°üº¬Ò»¸ö ¡°ÏàËÆÒ³Ãæ¡± Á´½Ó£¬µ¥»÷¸ÃÁ´½Ó£¬¾Í»á·¢²¼ÁíÒ»¸öËÑË÷ÇëÇ󣬲éÕÒ³öÓëÆð³õ½á¹ûÀàËÆµÄÎĵµ¡£Solr ʹÓà MoreLikeThisComponent£¨MLT£©ºÍ MoreLikeThisHandler ʵÏÖÁËÒ»ÑùµÄ¹¦ÄÜ¡£ÈçÉÏËùÊö£¬MLT ÊÇÓë±ê×¼ SolrRequestHandler ¼¯³ÉÔÚÒ»ÆðµÄ£»MoreLikeThisHandler Óë MLT ½áºÏÔÚÒ»Æð£¬²¢Ìí¼ÓÁËһЩÆäËûÑ¡Ïµ«ËüÒªÇó·¢²¼Ò»¸öµ¥Ò»µÄÇëÇó¡£ÎÒ½«×ÅÖØ½²Êö MLT£¬ÒòΪʹÓÃËüµÄ¿ÉÄÜÐÔ¸ü´óһЩ¡£ÐÒÔ˵ÄÊÇ£¬²»ÐèÒªÈκÎÉèÖþͿÉÒÔ²éѯËü£¬ËùÒÔÄúÏÖÔھͿÉÒÔ¿ªÊ¼²éѯ¡£

¡¡¡¡MLT ÒªÇó×ֶα»´¢´æ»òʹÓüìË÷´ÊÏòÁ¿£¬¼ìË÷´ÊÏòÁ¿ÒÔÒ»ÖÖÒÔÎĵµÎªÖÐÐĵķ½Ê½´¢´æÐÅÏ¢¡£MLT ͨ¹ýÎĵµµÄÄÚÈÝÀ´¼ÆËãÎĵµÖйؼü´ÊÓȻºóʹÓÃԭʼ²éѯ´ÊÓïºÍÕâЩдÊÓï´´½¨Ò»¸öеIJéѯ¡£Ìύвéѯ¾Í»á·µ»ØÆäËû²éѯ½á¹û¡£ËùÓÐÕâЩ¶¼¿ÉÒÔÓüìË÷´ÊÏòÁ¿À´Íê³É£ºÖ»Ð轫 termVectors="true" Ìí¼Óµ½ schema.xml ÖÐµÄ <field> ÉùÃ÷¡£

MoreLikeThisComponent ²ÎÊý£º

²ÎÊý
¡¡ËµÃ÷
¡¡ÖµÓò
mlt
ÔÚ²éѯʱ£¬´ò¿ª/¹Ø±Õ MoreLikeThisComponent µÄ²¼¶ûÖµ¡£

true|false
mlt.count ¿ÉÑ¡¡£Ã¿Ò»¸ö½á¹ûÒª¼ìË÷µÄÏàËÆÎĵµÊý¡£ > 0
mlt.fl ÓÃÓÚ´´½¨ MLT ²éѯµÄ×ֶΡ£ Èκα»´¢´æµÄ»òº¬ÓмìË÷´ÊÏòÁ¿µÄ×ֶΡ£
mlt.maxqt ¶à¹Ø¼ü´ÊÓÕâÑù MLT ²éѯ¿ÉÄÜ»áºÜ´ó£¬´Ó¶øµ¼Ö·´Ó¦»ºÂý»ò¿ÉÅ嵀 TooManyClausesException£¬¸Ã²ÎÊýÖ»±£Áô¹Ø¼üµÄ´ÊÓï¡£ > 0

 

ÒªÏëʹÓÃÆ¥ÅäÏàËÆÊ×ÏÈÔÚ solrconfig.xml ÖÐÅäÖà MoreLikeThisHandler

<requestHandler name="/mlt" class="solr.MoreLikeThisHandler">

</requestHandler>

È»ºóÎҾͿÉÒÔÇëÇó

http://localhost:8983/skyCore/mlt?q=id%3A6F398CCD-2DE0-D3B1-9DD6-D4E532FFC531&mlt.true&mlt.fl=content&wt=xml&indent=true

ÉÏÃæÇëÇóµÄÒâ˼²éÕÒ id Ϊ 6F398CCD-2DE0-D3B1-9DD6-D4E532FFC531 µÄ document ,È»ºó·µ»ØÓë´Ë document ÔÚ name ×Ö¶ÎÉÏÏàËÆµÄÆäËû document¡£ÐèҪעÒâµÄÊÇ mlt.fl ÖÐµÄ field µÄ termVector=true ²ÅÓÐЧ¹û

<field name="content" type="text_smartcn" indexed="false" stored="true" multiValued="false" termVector="true"/>

ʹÓÃSolrJʱҲͬÑù¼ÓÈë²ÎÊý¾Í¿ÉÒÔ

SolrQuery query = new SolrQuery();
query.set("qt", "/mlt");
query.set("mlt.fl","content");
query.set("fl", "id,");
query.set("q", "id: 6F398CCD-2DE0-D3B1-9DD6-D4E532FFC531");
query.setStart(0);
query.setRows(5);
QueryResponse rsp = server.query(query);
SolrDocumentList list = rsp.getResults();

6.9Æ´Òô¼ìË÷

Æ´Òô¼ìË÷ÖйúÈ˵ÄרÓüìË÷,ÀýÈç:ÖÐÎÄÄÚÈÝΪ Öйú µÄÊäÈëzhongguo¡¢zg¡¢zhonggu ȫƴ¡¢¼òÆ´¡¢Æ´ÒôµÄÏàÁÚµÄÒ»²¿·Ý¶¼Ó¦¸ÃÄܼìË÷³ö Öйú À´¡£

ÏëҪʵÏÖÆ´Òô¼ìË÷µÚÒ»¸ö¾ÍÊÇÆ´Òôת»»ÎÒÕâÀïÓõÄÊÇpinyin4j½øÐÐÆ´Òôת»»¡£µÚ¶þ¸ö¾ÍÊÇN-GramµÄÌâÄ¿£¬ÍÆÇõ½Óû§¿ÉÄÜÊäÈëµÄ¼È²»ÊÇǰ׺Ҳ²»ÊǺó׺£¬ËùÒÔ´Ë´¦Ñ¡ÔñµÄÊÇN-Gram¼¼ÇÉ£¬µ«²»Í¬ÓÚ³£ÓõÄN-Gram£¬ÎÒÓ¦ÓõĴÓÒ»±ß¿ª¶ËµÄµ¥ÏòµÄN-Gram£¬SolrÀïµÄʵÏÖ½ÐEdgeNGramTokenFilter£¬µ«ÊǷֵķֵÄ̫ϸÁË£¬²»ÐèÒªÕâô¸´ÔÓEdgeNGramTokenFilter,Ò²¾ÍÊÇ˵ÎÒÃÇÓõÄN-Gram²»Í¬ÓÚ´«Í³µÄN-Gram¡£

ͬÑùµÄÀý×ÓʹÓÃEdgeNGramTokenFilter´ÓǰÍùºóÈ¡2-GramµÄ½á¹ûÊÇzh, Ò»°ãÊÇÈ¡min¨CmaxÖ®¼äµÄËùÓÐgram£¬ËùÒÔʹÓÃEdgeNGramTokenFilterÈ¡2-20µÄgram½á¹û¾ÍÊÇzh,zho, zhon, zhong, zhongg, zhonggu, zhongguo, ´ÓÕâ¸öÀý×ÓÒ²²»ÄÑÀí½âΪʲôÎÒҪѡÔñʹÓÃEdgeNGramTokenFilter¶ø·ÇÒ»°ãÒâÒåÉϵÄN-Gram£¬ ¿¼Âǵ½Óû§¿ÉÄÜÊäÈëµÄ²»ÊÇǰ׺¶øÊǺó׺£¬ËùÒÔΪÁËÕÕ¹ËÕâЩÓû§£¬ÎÒÑ¡ÔñÁË´ÓǰÍùºóºÍ´ÓºóÍùǰʹÓÃÁËÁ½´ÎEdgeNGramTokenFilter£¬ÕâÑù²»Ö»ÊÇǰ׺¡¢ºó׺£¬¶þÊ®ÈÎÒâµÄ×Ö´®¶¼¿¼ÂǽøÈ¥ÁË£¬ËùÒÔ´ó·ù¶ÈµÄÌá¸ßÁËËÑË÷ÌåÑé.

ÏÖÔÚ˼·Ã÷È·ÁËÎÒÃǰÑËü½áºÏµ½SolrÖУ¬ÎªÁË·½±ãʹÓÃÏÖÔÚдÁËÁ½¸öFilter½øÐд¦ÀíÆ´Òô·Ö´ÊÎÊÌâÒ»¸öÊÇÆ´Òôת»»Filter£¨PinyinTransformTokenFilter£©Ò»¸öÊÇÆ´ÒôN-GramµÄFilter(PinyinNGramTokenFilter),ÕâÑùÒ»À´Ê¹ÓÃʱ¾Í²»ÓÃÔÚÌí¼ÓË÷Òýǰ×öÀ¹ÒôµÄת»»ÁË¡£¶øÇÒPinyinTransformTokenFilter»¹ÓиöºÃ´¦¾ÍÊÇËüֻʹÓÃÖÐÎÄ·Ö´ÊÆ÷·Ö¹ýµÄ´Ê£¬Ò²¾ÍÊÇ˵×öת»»µÄ´Ê¶¼ÊÇÓÐÓõIJ»Öظ´µÄ£¬²»»á¶ÔûÓõÄÍ£´ÊÀàµÄ×öÆ´Òôת»»ºÍÖØ¸´Æ´Òôת»»£¬ÕâÑù´ó´óµÄÌá¸ßÁËÆ´Òôת»»ËÙ¶È¡£

ÏëÒªSolrÖ§³ÖÆ´Òô¼ìË÷¾ÍÒªÏÈ°ÑÆ´Òô·Ö´Ê£¨PinyinAnalyzer£©µÄjar¸´ÖƵ½\solr\contrib\analysis-extras\libÏ£¬È»ºóÔÚschema.xmlÖÐÅäÖÃÒ»¸öÆ´Òô×Ö¶ÎÀàÐÍ£º

<fieldType name="text_pinyin" class="solr.TextField" positionIncrementGap="0">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>
<filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>
<filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />
<filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>
<filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>
<filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />
<filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />
</analyzer>
</fieldType>

minTermLenght£º×îСÖÐÎĴʳ¤¶È£¬Òâ˼ÊÇСÓÚÕâ¸öÖµµÄÖÐÎĴʲ»»á×öÆ´Òôת»»¡£

minGram£º×îСƴÒôÇзֳ¤¶È¡£

Èç¹ûÏëʹÓüòÆ´µÄ»°ÔÚÆ´Òôת»»Filter ʹÓÃÕâ¸ö²ÎÊýisFirstChar="true"¾Í¿ÉÒÔÁË

ÔÚÕâ¸öÆ´ÒôÀàÐÍÖÐÎÒÃÇʹÓÃÁËsmartcnµÄÖÐÑÔÓï·Ö´ÊÆ÷£¬Èç¹ûÏëʹÓÃÆäËüµÄ×Ô¼º»»µô¾ÍÐÐÁË¡£ÏÖÔÚÎÒÃÇÔÚÔ­À´Ë÷ÒýÖмÓÈëÒ»¸öÆ´Òô×ֶΣ¬ÒòΪֻ×öË÷Òý,ÎÒÃÇ¿ÉÒÔÕâÑùÅäÖÃ:

<field name ="pinyin" type ="text_pinyin" indexed ="true" stored ="false" multiValued ="false"/>

¼ÓÍêºóÎÒÃÇÖØÐÂÆô¶¯Solr²âÊÔһϿ´¿´

ÓÉÓÚÉÏÃæminTermLenghtºÍminGramÉèÖõÄÖµ£¬ÏÖÔÚ³öÏÖÁËÈËûÓнøÐÐÆ´Òôת»»²¢ÇÒ×îСƴÒôÇзÖÊÇ´Ó1¸ö¿ªÊ¼µÄ¡£

µ½ÕâÀïÎÒÃǵÄÅäÖû¹ÓÐûÍê³ÉÄØ£¬»¹Òª¼Ó¼¸¸öcopyFiled£¬ÕâÑù¾Í²»Óõ¥¶À´¦ÀíÎÒÃÇÐÂ¼ÓµÄÆ´Òô×Ö¶ÎÁË¡£·½±ãѽ~~~

<copyField source="content" dest="pinyin"/>

<copyField source="text" dest="spell"/>

µ½ÏÖÔھͿÉÒÔʹÓÃÆ´Òô¼ìË÷ÁË¡£

Æ´Òô·Ö´ÊÆ÷jar µã»÷²¢¸´ÖƾͿÉÒÔÕ³³öÈ¥ÁË.

6.10 SolrCloud

SolrCloudÊÇ»ùÓÚSolrºÍZookeeperµÄ·Ö²¼Ê½ËÑË÷·½°¸£¬ÊÇÕýÔÚ¿ª·¢ÖеÄSolr4.0µÄºËÐÄ×é¼þÖ®Ò»£¬ËüµÄÖ÷Ҫ˼ÏëÊÇʹÓÃZookeeper×÷Ϊ¼¯ÈºµÄÅäÖÃÐÅÏ¢ÖÐÐÄ¡£ËüÓм¸¸öÌØÉ«¹¦ÄÜ,¼¯ÖÐʽµÄÅäÖÃÐÅÏ¢¡¢×Ô¶¯ÈÝ´í ¡¢½üʵʱËÑË÷ ¡¢²éѯʱ×Ô¶¯¸ºÔؾùºâ¡£

»ù±¾¿ÉÒÔÓÃÉÏÃæÕâ·ùͼÀ´¸ÅÊö£¬ÕâÊÇÒ»¸öÓµÓÐ4¸öSolr½ÚµãµÄ¼¯Èº£¬Ë÷Òý·Ö²¼ÔÚÁ½¸öShardÀïÃæ£¬Ã¿¸öShard°üº¬Á½¸öSolr½Úµã£¬Ò»¸öÊÇLeader½Úµã£¬Ò»¸öÊÇReplica½Úµã£¬´ËÍ⼯ȺÖÐÓÐÒ»¸ö¸ºÔðά»¤¼¯Èº×´Ì¬ÐÅÏ¢µÄOverseer½Úµã£¬ËüÊÇÒ»¸ö×Ü¿ØÖÆÆ÷¡£¼¯ÈºµÄËùÓÐ״̬ÐÅÏ¢¶¼·ÅÔÚZookeeper¼¯ÈºÖÐͳһά»¤¡£´ÓͼÖл¹¿ÉÒÔ¿´µ½£¬ÈκÎÒ»¸ö½Úµã¶¼¿ÉÒÔ½ÓÊÕË÷Òý¸üеÄÇëÇó£¬È»ºóÔÙ½«Õâ¸öÇëÇóת·¢µ½ÎĵµËùÓ¦¸ÃÊôÓÚµÄÄǸöShardµÄLeader½Úµã£¬Leader½Úµã¸üнáÊøÍê³É£¬×îºó½«°æ±¾ºÅºÍÎĵµ×ª·¢¸øÍ¬ÊôÓÚÒ»¸öShardµÄreplicas½Úµã¡£ÕâÀï¾Í²»¶à˵SolrCloudÁË£¬µÈÑо¿Ã÷°×ºóÔÙµ¥Ð´Ò»¸öÎĵµ¡£

¸½1£ºschema.xml

<?xml version="1.0" encoding="UTF-8" ?>

<schema name="example" version="1.5">

<fields>

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"/>

<field name="path" type="text_ik" indexed="false" stored="true" multiValued="false" termVector="true" />

<field name="content" type="text_ik" indexed="false" stored="true" multiValued="false" termVector="true"/>

<field name ="text" type ="text_ik" indexed ="true" stored ="false" multiValued ="true"/>

<field name ="pinyin" type ="text_pinyin" indexed ="true" stored ="false" multiValued ="false"/>

<field name ="py" type ="text_py" indexed ="true" stored ="false" multiValued ="false"/>

<field name="spell" type="text_spell" indexed="true" stored="false" multiValued="false" termVector="true"/>

<field name="_version_" type="long" indexed="true" stored="true"/>

<dynamicField name="*_i" type="int" indexed="true" stored="true"/>

<dynamicField name="*_is" type="int" indexed="true" stored="true" multiValued="true"/>

<dynamicField name="*_s" type="string" indexed="true" stored="true" />

<dynamicField name="*_ss" type="string" indexed="true" stored="true" multiValued="true"/>

<dynamicField name="*_l" type="long" indexed="true" stored="true"/>

<dynamicField name="*_ls" type="long" indexed="true" stored="true" multiValued="true"/>

<dynamicField name="*_t" type="text_general" indexed="true" stored="true"/>

<dynamicField name="*_txt" type="text_general" indexed="true" stored="true" multiValued="true"/>

<dynamicField name="*_en" type="text_en" indexed="true" stored="true" multiValued="true"/>

<dynamicField name="*_b" type="boolean" indexed="true" stored="true"/>

<dynamicField name="*_bs" type="boolean" indexed="true" stored="true" multiValued="true"/>

<dynamicField name="*_f" type="float" indexed="true" stored="true"/>

<dynamicField name="*_fs" type="float" indexed="true" stored="true" multiValued="true"/>

<dynamicField name="*_d" type="double" indexed="true" stored="true"/>

<dynamicField name="*_ds" type="double" indexed="true" stored="true" multiValued="true"/>

<!-- Type used to index the lat and lon components for the "location" FieldType -->

<dynamicField name="*_coordinate" type="tdouble" indexed="true" stored="false"/>

<dynamicField name="*_dt" type="date" indexed="true" stored="true"/>

<dynamicField name="*_dts" type="date" indexed="true" stored="true" multiValued="true"/>

<dynamicField name="*_p" type="location" indexed="true" stored="true"/>

<!-- some trie-coded dynamic fields for faster range queries -->

<dynamicField name="*_ti" type="tint" indexed="true" stored="true"/>

<dynamicField name="*_tl" type="tlong" indexed="true" stored="true"/>

<dynamicField name="*_tf" type="tfloat" indexed="true" stored="true"/>

<dynamicField name="*_td" type="tdouble" indexed="true" stored="true"/>

<dynamicField name="*_tdt" type="tdate" indexed="true" stored="true"/>

<dynamicField name="*_pi" type="pint" indexed="true" stored="true"/>

<dynamicField name="*_c" type="currency" indexed="true" stored="true"/>

<dynamicField name="ignored_*" type="ignored" multiValued="true"/>

<dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>

<dynamicField name="random_*" type="random"/>

</fields>

<uniqueKey>id</uniqueKey>

<copyField source="content" dest="spell"/>

<copyField source="content" dest="pinyin"/>

<copyField source="content" dest="py"/>

<copyField source="path" dest="text"/>

<copyField source="content" dest="text"/>

<copyField source="pinyin" dest="text"/>

<copyField source="py" dest="text"/>

<defaultSearchField>text</defaultSearchField>

<types>

<fieldType name="string" class="solr.StrField" sortMissingLast="true"/>

<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>

<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>

<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>

<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>

<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>

<fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>

<fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>

<fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>

<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>

<fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>

<fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>

<fieldtype name="binary" class="solr.BinaryField"/>

<fieldType name="pint" class="solr.IntField"/>

<fieldType name="plong" class="solr.LongField"/>

<fieldType name="pfloat" class="solr.FloatField"/>

<fieldType name="pdouble" class="solr.DoubleField"/>

<fieldType name="pdate" class="solr.DateField" sortMissingLast="true"/>

<fieldType name="random" class="solr.RandomSortField" indexed="true"/>

<fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.WhitespaceTokenizerFactory"/>

</analyzer>

</fieldType>

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">

<analyzer type="index">

<tokenizer class="solr.StandardTokenizerFactory"/>

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

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

<analyzer type="query">

<tokenizer class="solr.StandardTokenizerFactory"/>

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

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

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

<fieldType name="text_spell" class="solr.TextField" >

<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

</fieldType>

<fieldType name="text_ik" class="solr.TextField">

<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

</fieldType>

<fieldType name="text_smartcn" class="solr.TextField" positionIncrementGap="0">

<analyzer type="index">

<tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

<filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

</analyzer>

<analyzer type="query">

<tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

<filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

</analyzer>

</fieldType>

<fieldType name="text_pinyin" class="solr.TextField" positionIncrementGap="0">

<analyzer type="index">

<tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

<filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

<filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />

<filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />

</analyzer>

<analyzer type="query">

<tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

<filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

<filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />

<filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" />

</analyzer>

</fieldType>

<fieldType name="text_py" class="solr.TextField" positionIncrementGap="0">

<analyzer type="index">

<tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

<filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

<filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" isFirstChar="true" minTermLenght="2" />

</analyzer>

<analyzer type="query">

<tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>

<filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>

<filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" isFirstChar="true" minTermLenght="2" />

</analyzer>

</fieldType>

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">

<analyzer type="index">

<tokenizer class="solr.StandardTokenizerFactory"/>

<!-- in this example, we will only use synonyms at query time

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

-->

<!-- Case insensitive stop word removal.

add enablePositionIncrements=true in both the index and query

analyzers to leave a 'gap' for more accurate phrase queries.

-->

<filter class="solr.StopFilterFactory"

ignoreCase="true"

words="lang/stopwords_en.txt"

enablePositionIncrements="true"

/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.EnglishPossessiveFilterFactory"/>

<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>

<!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:

<filter class="solr.EnglishMinimalStemFilterFactory"/>

-->

<filter class="solr.PorterStemFilterFactory"/>

</analyzer>

<analyzer type="query">

<tokenizer class="solr.StandardTokenizerFactory"/>

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

<filter class="solr.StopFilterFactory"

ignoreCase="true"

words="lang/stopwords_en.txt"

enablePositionIncrements="true"

/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.EnglishPossessiveFilterFactory"/>

<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>

<!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:

<filter class="solr.EnglishMinimalStemFilterFactory"/>

-->

<filter class="solr.PorterStemFilterFactory"/>

</analyzer>

</fieldType>

<fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100"

autoGeneratePhraseQueries="true">

<analyzer type="index">

<tokenizer class="solr.WhitespaceTokenizerFactory"/>

<!-- in this example, we will only use synonyms at query time

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

-->

<!-- Case insensitive stop word removal.

add enablePositionIncrements=true in both the index and query

analyzers to leave a 'gap' for more accurate phrase queries.

-->

<filter class="solr.StopFilterFactory"

ignoreCase="true"

words="lang/stopwords_en.txt"

enablePositionIncrements="true"

/>

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1"

catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>

<filter class="solr.PorterStemFilterFactory"/>

</analyzer>

<analyzer type="query">

<tokenizer class="solr.WhitespaceTokenizerFactory"/>

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

<filter class="solr.StopFilterFactory"

ignoreCase="true"

words="lang/stopwords_en.txt"

enablePositionIncrements="true"

/>

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0"

catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>

<filter class="solr.PorterStemFilterFactory"/>

</analyzer>

</fieldType>

<fieldType name="text_en_splitting_tight" class="solr.TextField" positionIncrementGap="100"

autoGeneratePhraseQueries="true">

<analyzer>

<tokenizer class="solr.WhitespaceTokenizerFactory"/>

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

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/>

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1"

catenateNumbers="1" catenateAll="0"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>

<filter class="solr.EnglishMinimalStemFilterFactory"/>

<!-- this filter can remove any duplicate tokens that appear at the same position - sometimes

possible with WordDelimiterFilter in conjuncton with stemming. -->

<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>

</analyzer>

</fieldType>

<fieldType name="text_general_rev" class="solr.TextField" positionIncrementGap="100">

<analyzer type="index">

<tokenizer class="solr.StandardTokenizerFactory"/>

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

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.ReversedWildcardFilterFactory" withOriginal="true"

maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/>

</analyzer>

<analyzer type="query">

<tokenizer class="solr.StandardTokenizerFactory"/>

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

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

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

<fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true">

<analyzer>

<!-- KeywordTokenizer does no actual tokenizing, so the entire

input string is preserved as a single token

-->

<tokenizer class="solr.KeywordTokenizerFactory"/>

<!-- The LowerCase TokenFilter does what you expect, which can be

when you want your sorting to be case insensitive

-->

<filter class="solr.LowerCaseFilterFactory"/>

<!-- The TrimFilter removes any leading or trailing whitespace -->

<filter class="solr.TrimFilterFactory"/>

<!-- The PatternReplaceFilter gives you the flexibility to use

Java Regular expression to replace any sequence of characters

matching a pattern with an arbitrary replacement string,

which may include back references to portions of the original

string matched by the pattern.

See the Java Regular Expression documentation for more

information on pattern and replacement string syntax.

http://java.sun.com/j2se/1.6.0/docs/api/java/util/regex/package-summary.html

-->

<filter class="solr.PatternReplaceFilterFactory"

pattern="([^a-z])" replacement="" replace="all"

/>

</analyzer>

</fieldType>

<fieldtype name="phonetic" stored="false" indexed="true" class="solr.TextField">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.DoubleMetaphoneFilterFactory" inject="false"/>

</analyzer>

</fieldtype>

<fieldtype name="payloads" stored="false" indexed="true" class="solr.TextField">

<analyzer>

<tokenizer class="solr.WhitespaceTokenizerFactory"/>

<!--

The DelimitedPayloadTokenFilter can put payloads on tokens... for example,

a token of "foo|1.4" would be indexed as "foo" with a payload of 1.4f

Attributes of the DelimitedPayloadTokenFilterFactory :

"delimiter" - a one character delimiter. Default is | (pipe)

"encoder" - how to encode the following value into a playload

float -> org.apache.lucene.analysis.payloads.FloatEncoder,

integer -> o.a.l.a.p.IntegerEncoder

identity -> o.a.l.a.p.IdentityEncoder

Fully Qualified class name implementing PayloadEncoder, Encoder must have a no arg constructor.

-->

<filter class="solr.DelimitedPayloadTokenFilterFactory" encoder="float"/>

</analyzer>

</fieldtype>

<fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.KeywordTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

<fieldType name="descendent_path" class="solr.TextField">

<analyzer type="index">

<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/"/>

</analyzer>

<analyzer type="query">

<tokenizer class="solr.KeywordTokenizerFactory"/>

</analyzer>

</fieldType>

<fieldType name="ancestor_path" class="solr.TextField">

<analyzer type="index">

<tokenizer class="solr.KeywordTokenizerFactory"/>

</analyzer>

<analyzer type="query">

<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/"/>

</analyzer>

</fieldType>

<fieldtype name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField"/>

<fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>

<fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>

<fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"

geo="true" distErrPct="0.025" maxDistErr="0.000009" units="degrees"/>

<fieldType name="currency" class="solr.CurrencyField" precisionStep="8" defaultCurrency="USD"

currencyConfig="currency.xml"/>

<!-- some examples for different languages (generally ordered by ISO code) -->

<!-- Arabic -->

<fieldType name="text_ar" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<!-- for any non-arabic -->

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ar.txt"

enablePositionIncrements="true"/>

<!-- normalizes ? to ?, etc -->

<filter class="solr.ArabicNormalizationFilterFactory"/>

<filter class="solr.ArabicStemFilterFactory"/>

</analyzer>

</fieldType>

<!-- Bulgarian -->

<fieldType name="text_bg" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_bg.txt"

enablePositionIncrements="true"/>

<filter class="solr.BulgarianStemFilterFactory"/>

</analyzer>

</fieldType>

<!-- Catalan -->

<fieldType name="text_ca" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<!-- removes l', etc -->

<filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_ca.txt"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ca.txt"

enablePositionIncrements="true"/>

<filter class="solr.SnowballPorterFilterFactory" language="Catalan"/>

</analyzer>

</fieldType>

<!-- CJK bigram (see text_ja for a Japanese configuration using morphological analysis) -->

<fieldType name="text_cjk" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<!-- normalize width before bigram, as e.g. half-width dakuten combine -->

<filter class="solr.CJKWidthFilterFactory"/>

<!-- for any non-CJK -->

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.CJKBigramFilterFactory"/>

</analyzer>

</fieldType>

<!-- Czech -->

<fieldType name="text_cz" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_cz.txt"

enablePositionIncrements="true"/>

<filter class="solr.CzechStemFilterFactory"/>

</analyzer>

</fieldType>

<!-- Danish -->

<fieldType name="text_da" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_da.txt" format="snowball"

enablePositionIncrements="true"/>

<filter class="solr.SnowballPorterFilterFactory" language="Danish"/>

</analyzer>

</fieldType>

<!-- German -->

<fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" format="snowball"

enablePositionIncrements="true"/>

<filter class="solr.GermanNormalizationFilterFactory"/>

<filter class="solr.GermanLightStemFilterFactory"/>

<!-- less aggressive: <filter class="solr.GermanMinimalStemFilterFactory"/> -->

<!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="German2"/> -->

</analyzer>

</fieldType>

<!-- Greek -->

<fieldType name="text_el" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<!-- greek specific lowercase for sigma -->

<filter class="solr.GreekLowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="false" words="lang/stopwords_el.txt"

enablePositionIncrements="true"/>

<filter class="solr.GreekStemFilterFactory"/>

</analyzer>

</fieldType>

<!-- Spanish -->

<fieldType name="text_es" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_es.txt" format="snowball"

enablePositionIncrements="true"/>

<filter class="solr.SpanishLightStemFilterFactory"/>

<!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="Spanish"/> -->

</analyzer>

</fieldType>

<!-- Basque -->

<fieldType name="text_eu" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_eu.txt"

enablePositionIncrements="true"/>

<filter class="solr.SnowballPorterFilterFactory" language="Basque"/>

</analyzer>

</fieldType>

<!-- Persian -->

<fieldType name="text_fa" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<!-- for ZWNJ -->

<charFilter class="solr.PersianCharFilterFactory"/>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.ArabicNormalizationFilterFactory"/>

<filter class="solr.PersianNormalizationFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_fa.txt"

enablePositionIncrements="true"/>

</analyzer>

</fieldType>

<!-- Finnish -->

<fieldType name="text_fi" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_fi.txt" format="snowball"

enablePositionIncrements="true"/>

<filter class="solr.SnowballPorterFilterFactory" language="Finnish"/>

<!-- less aggressive: <filter class="solr.FinnishLightStemFilterFactory"/> -->

</analyzer>

</fieldType>

<!-- French -->

<fieldType name="text_fr" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<!-- removes l', etc -->

<filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_fr.txt"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_fr.txt" format="snowball"

enablePositionIncrements="true"/>

<filter class="solr.FrenchLightStemFilterFactory"/>

<!-- less aggressive: <filter class="solr.FrenchMinimalStemFilterFactory"/> -->

<!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="French"/> -->

</analyzer>

</fieldType>

<!-- Irish -->

<fieldType name="text_ga" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<!-- removes d', etc -->

<filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_ga.txt"/>

<!-- removes n-, etc. position increments is intentionally false! -->

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/hyphenations_ga.txt"

enablePositionIncrements="false"/>

<filter class="solr.IrishLowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ga.txt"

enablePositionIncrements="true"/>

<filter class="solr.SnowballPorterFilterFactory" language="Irish"/>

</analyzer>

</fieldType>

<!-- Galician -->

<fieldType name="text_gl" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_gl.txt"

enablePositionIncrements="true"/>

<filter class="solr.GalicianStemFilterFactory"/>

<!-- less aggressive: <filter class="solr.GalicianMinimalStemFilterFactory"/> -->

</analyzer>

</fieldType>

<!-- Hindi -->

<fieldType name="text_hi" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<!-- normalizes unicode representation -->

<filter class="solr.IndicNormalizationFilterFactory"/>

<!-- normalizes variation in spelling -->

<filter class="solr.HindiNormalizationFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_hi.txt"

enablePositionIncrements="true"/>

<filter class="solr.HindiStemFilterFactory"/>

</analyzer>

</fieldType>

<!-- Hungarian -->

<fieldType name="text_hu" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_hu.txt" format="snowball"

enablePositionIncrements="true"/>

<filter class="solr.SnowballPorterFilterFactory" language="Hungarian"/>

<!-- less aggressive: <filter class="solr.HungarianLightStemFilterFactory"/> -->

</analyzer>

</fieldType>

<!-- Armenian -->

<fieldType name="text_hy" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_hy.txt"

enablePositionIncrements="true"/>

<filter class="solr.SnowballPorterFilterFactory" language="Armenian"/>

</analyzer>

</fieldType>

<!-- Indonesian -->

<fieldType name="text_id" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_id.txt"

enablePositionIncrements="true"/>

<!-- for a less aggressive approach (only inflectional suffixes), set stemDerivational to false -->

<filter class="solr.IndonesianStemFilterFactory" stemDerivational="true"/>

</analyzer>

</fieldType>

<!-- Italian -->

<fieldType name="text_it" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<!-- removes l', etc -->

<filter class="solr.ElisionFilterFactory" ignoreCase="true" articles="lang/contractions_it.txt"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_it.txt" format="snowball"

enablePositionIncrements="true"/>

<filter class="solr.ItalianLightStemFilterFactory"/>

<!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="Italian"/> -->

</analyzer>

</fieldType>

<!-- Japanese using morphological analysis (see text_cjk for a configuration using bigramming)

NOTE: If you want to optimize search for precision, use default operator AND in your query

parser config with <solrQueryParser defaultOperator="AND"/> further down in this file. Use

OR if you would like to optimize for recall (default).

-->

<fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">

<analyzer>

<!-- Kuromoji Japanese morphological analyzer/tokenizer (JapaneseTokenizer)

Kuromoji has a search mode (default) that does segmentation useful for search. A heuristic

is used to segment compounds into its parts and the compound itself is kept as synonym.

Valid values for attribute mode are:

normal: regular segmentation

search: segmentation useful for search with synonyms compounds (default)

extended: same as search mode, but unigrams unknown words (experimental)

For some applications it might be good to use search mode for indexing and normal mode for

queries to reduce recall and prevent parts of compounds from being matched and highlighted.

Use <analyzer type="index"> and <analyzer type="query"> for this and mode normal in query.

Kuromoji also has a convenient user dictionary feature that allows overriding the statistical

model with your own entries for segmentation, part-of-speech tags and readings without a need

to specify weights. Notice that user dictionaries have not been subject to extensive testing.

User dictionary attributes are:

userDictionary: user dictionary filename

userDictionaryEncoding: user dictionary encoding (default is UTF-8)

See lang/userdict_ja.txt for a sample user dictionary file.

Punctuation characters are discarded by default. Use discardPunctuation="false" to keep them.

See http://wiki.apache.org/solr/JapaneseLanguageSupport for more on Japanese language support.

-->

<tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>

<!--<tokenizer class="solr.JapaneseTokenizerFactory" mode="search" userDictionary="lang/userdict_ja.txt"/>-->

<!-- Reduces inflected verbs and adjectives to their base/dictionary forms (´Ç•øÐÎ) -->

<filter class="solr.JapaneseBaseFormFilterFactory"/>

<!-- Removes tokens with certain part-of-speech tags -->

<filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt"

enablePositionIncrements="true"/>

<!-- Normalizes full-width romaji to half-width and half-width kana to full-width (Unicode NFKC subset) -->

<filter class="solr.CJKWidthFilterFactory"/>

<!-- Removes common tokens typically not useful for search, but have a negative effect on ranking -->

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt"

enablePositionIncrements="true"/>

<!-- Normalizes common katakana spelling variations by removing any last long sound character (U+30FC) -->

<filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>

<!-- Lower-cases romaji characters -->

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

<!-- Latvian -->

<fieldType name="text_lv" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_lv.txt"

enablePositionIncrements="true"/>

<filter class="solr.LatvianStemFilterFactory"/>

</analyzer>

</fieldType>

<!-- Dutch -->

<fieldType name="text_nl" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_nl.txt" format="snowball"

enablePositionIncrements="true"/>

<filter class="solr.StemmerOverrideFilterFactory" dictionary="lang/stemdict_nl.txt" ignoreCase="false"/>

<filter class="solr.SnowballPorterFilterFactory" language="Dutch"/>

</analyzer>

</fieldType>

<!-- Norwegian -->

<fieldType name="text_no" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_no.txt" format="snowball"

enablePositionIncrements="true"/>

<filter class="solr.SnowballPorterFilterFactory" language="Norwegian"/>

<!-- less aggressive: <filter class="solr.NorwegianLightStemFilterFactory"/> -->

<!-- singular/plural: <filter class="solr.NorwegianMinimalStemFilterFactory"/> -->

</analyzer>

</fieldType>

<!-- Portuguese -->

<fieldType name="text_pt" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_pt.txt" format="snowball"

enablePositionIncrements="true"/>

<filter class="solr.PortugueseLightStemFilterFactory"/>

<!-- less aggressive: <filter class="solr.PortugueseMinimalStemFilterFactory"/> -->

<!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="Portuguese"/> -->

<!-- most aggressive: <filter class="solr.PortugueseStemFilterFactory"/> -->

</analyzer>

</fieldType>

<!-- Romanian -->

<fieldType name="text_ro" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ro.txt"

enablePositionIncrements="true"/>

<filter class="solr.SnowballPorterFilterFactory" language="Romanian"/>

</analyzer>

</fieldType>

<!-- Russian -->

<fieldType name="text_ru" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ru.txt" format="snowball"

enablePositionIncrements="true"/>

<filter class="solr.SnowballPorterFilterFactory" language="Russian"/>

<!-- less aggressive: <filter class="solr.RussianLightStemFilterFactory"/> -->

</analyzer>

</fieldType>

<!-- Swedish -->

<fieldType name="text_sv" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_sv.txt" format="snowball"

enablePositionIncrements="true"/>

<filter class="solr.SnowballPorterFilterFactory" language="Swedish"/>

<!-- less aggressive: <filter class="solr.SwedishLightStemFilterFactory"/> -->

</analyzer>

</fieldType>

<!-- Thai -->

<fieldType name="text_th" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.LowerCaseFilterFactory"/>

<filter class="solr.ThaiWordFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_th.txt"

enablePositionIncrements="true"/>

</analyzer>

</fieldType>

<!-- Turkish -->

<fieldType name="text_tr" class="solr.TextField" positionIncrementGap="100">

<analyzer>

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.TurkishLowerCaseFilterFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="false" words="lang/stopwords_tr.txt"

enablePositionIncrements="true"/>

<filter class="solr.SnowballPorterFilterFactory" language="Turkish"/>

</analyzer>

</fieldType>

</types>

</schema>

¸½2£ºsolrconfig.xml

<?xml version="1.0" encoding="UTF-8" ?>

<config>

<luceneMatchVersion>LUCENE_42</luceneMatchVersion>

<lib dir="../../../lib" regex=".*\.jar" />

<lib dir="../../../contrib/extraction/lib" regex=".*\.jar" />

<lib dir="../../../dist/" regex="solr-cell-\d.*\.jar" />

<lib dir="../../../contrib/clustering/lib/" regex=".*\.jar" />

<lib dir="../../../dist/" regex="solr-clustering-\d.*\.jar" />

<lib dir="../../../contrib/langid/lib/" regex=".*\.jar" />

<lib dir="../../../dist/" regex="solr-langid-\d.*\.jar" />

<lib dir="../../../contrib/velocity/lib" regex=".*\.jar" />

<lib dir="../../../dist/" regex="solr-velocity-\d.*\.jar" />

<lib dir="/total/crap/dir/ignored" />

<dataDir>${solr.data.dir:}</dataDir>

<directoryFactory name="DirectoryFactory"

class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>

<codecFactory class="solr.SchemaCodecFactory"/>

<indexConfig>

<!-- maxFieldLength was removed in 4.0. To get similar behavior, include a

LimitTokenCountFilterFactory in your fieldType definition. E.g.

<filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="10000"/>

-->

<!-- Maximum time to wait for a write lock (ms) for an IndexWriter. Default: 1000 -->

<!-- <writeLockTimeout>1000</writeLockTimeout> -->

<!-- The maximum number of simultaneous threads that may be

indexing documents at once in IndexWriter; if more than this

many threads arrive they will wait for others to finish.

Default in Solr/Lucene is 8. -->

<!-- <maxIndexingThreads>8</maxIndexingThreads> -->

<!-- Expert: Enabling compound file will use less files for the index,

using fewer file descriptors on the expense of performance decrease.

Default in Lucene is "true". Default in Solr is "false" (since 3.6) -->

<!-- <useCompoundFile>false</useCompoundFile> -->

<!-- ramBufferSizeMB sets the amount of RAM that may be used by Lucene

indexing for buffering added documents and deletions before they are

flushed to the Directory.

maxBufferedDocs sets a limit on the number of documents buffered

before flushing.

If both ramBufferSizeMB and maxBufferedDocs is set, then

Lucene will flush based on whichever limit is hit first. -->

<ramBufferSizeMB>100</ramBufferSizeMB>

<maxBufferedDocs>1000</maxBufferedDocs>

<!-- Expert: Merge Policy

The Merge Policy in Lucene controls how merging of segments is done.

The default since Solr/Lucene 3.3 is TieredMergePolicy.

The default since Lucene 2.3 was the LogByteSizeMergePolicy,

Even older versions of Lucene used LogDocMergePolicy.

<mergePolicy class="org.apache.lucene.index.TieredMergePolicy">

<int name="maxMergeAtOnce">100</int>

<int name="segmentsPerTier">100</int>

</mergePolicy>

-->

<!-- Merge Factor

The merge factor controls how many segments will get merged at a time.

For TieredMergePolicy, mergeFactor is a convenience parameter which

will set both MaxMergeAtOnce and SegmentsPerTier at once.

For LogByteSizeMergePolicy, mergeFactor decides how many new segments

will be allowed before they are merged into one.

Default is 10 for both merge policies.

-->

<mergeFactor>50</mergeFactor>

<!-- Expert: Merge Scheduler

The Merge Scheduler in Lucene controls how merges are

performed. The ConcurrentMergeScheduler (Lucene 2.3 default)

can perform merges in the background using separate threads.

The SerialMergeScheduler (Lucene 2.2 default) does not.

-->

<!--

<mergeScheduler class="org.apache.lucene.index.ConcurrentMergeScheduler"/>

-->

<!-- LockFactory

This option specifies which Lucene LockFactory implementation

to use.

single = SingleInstanceLockFactory - suggested for a

read-only index or when there is no possibility of

another process trying to modify the index.

native = NativeFSLockFactory - uses OS native file locking.

Do not use when multiple solr webapps in the same

JVM are attempting to share a single index.

simple = SimpleFSLockFactory - uses a plain file for locking

Defaults: 'native' is default for Solr3.6 and later, otherwise

'simple' is the default

More details on the nuances of each LockFactory...

http://wiki.apache.org/lucene-java/AvailableLockFactories

-->

<lockType>${solr.lock.type:native}</lockType>

<!-- Unlock On Startup

If true, unlock any held write or commit locks on startup.

This defeats the locking mechanism that allows multiple

processes to safely access a lucene index, and should be used

with care. Default is "false".

This is not needed if lock type is 'single'

-->

<!--

<unlockOnStartup>false</unlockOnStartup>

-->

<!-- Expert: Controls how often Lucene loads terms into memory

Default is 128 and is likely good for most everyone.

-->

<!-- <termIndexInterval>128</termIndexInterval> -->

<!-- If true, IndexReaders will be reopened (often more efficient)

instead of closed and then opened. Default: true

-->

<!--

<reopenReaders>true</reopenReaders>

-->

<!-- Commit Deletion Policy

Custom deletion policies can be specified here. The class must

implement org.apache.lucene.index.IndexDeletionPolicy.

The default Solr IndexDeletionPolicy implementation supports

deleting index commit points on number of commits, age of

commit point and optimized status.

The latest commit point should always be preserved regardless

of the criteria.

-->

<!--

<deletionPolicy class="solr.SolrDeletionPolicy">

-->

<!-- The number of commit points to be kept -->

<!-- <str name="maxCommitsToKeep">1</str> -->

<!-- The number of optimized commit points to be kept -->

<!-- <str name="maxOptimizedCommitsToKeep">0</str> -->

<!--

Delete all commit points once they have reached the given age.

Supports DateMathParser syntax e.g.

-->

<!--

<str name="maxCommitAge">30MINUTES</str>

<str name="maxCommitAge">1DAY</str>

-->

<!--

</deletionPolicy>

-->

<!-- Lucene Infostream

To aid in advanced debugging, Lucene provides an "InfoStream"

of detailed information when indexing.

Setting The value to true will instruct the underlying Lucene

IndexWriter to write its debugging info the specified file

-->

<!-- <infoStream file="INFOSTREAM.txt">false</infoStream> -->

</indexConfig>

<jmx />

<updateHandler class="solr.DirectUpdateHandler2">

<updateLog>

<str name="dir">${solr.ulog.dir:}</str>

</updateLog>

<autoCommit>

<maxDocs>1000</maxDocs>

<maxTime>15000</maxTime>

<openSearcher>false</openSearcher>

</autoCommit>

</updateHandler>

<query>

<!-- Max Boolean Clauses

Maximum number of clauses in each BooleanQuery, an exception

is thrown if exceeded.

** WARNING **

This option actually modifies a global Lucene property that

will affect all SolrCores. If multiple solrconfig.xml files

disagree on this property, the value at any given moment will

be based on the last SolrCore to be initialized.

-->

<maxBooleanClauses>1024</maxBooleanClauses>

<!-- Solr Internal Query Caches

There are two implementations of cache available for Solr,

LRUCache, based on a synchronized LinkedHashMap, and

FastLRUCache, based on a ConcurrentHashMap.

FastLRUCache has faster gets and slower puts in single

threaded operation and thus is generally faster than LRUCache

when the hit ratio of the cache is high (> 75%), and may be

faster under other scenarios on multi-cpu systems.

-->

<!-- Filter Cache

Cache used by SolrIndexSearcher for filters (DocSets),

unordered sets of *all* documents that match a query. When a

new searcher is opened, its caches may be prepopulated or

"autowarmed" using data from caches in the old searcher.

autowarmCount is the number of items to prepopulate. For

LRUCache, the autowarmed items will be the most recently

accessed items.

Parameters:

class - the SolrCache implementation LRUCache or

(LRUCache or FastLRUCache)

size - the maximum number of entries in the cache

initialSize - the initial capacity (number of entries) of

the cache. (see java.util.HashMap)

autowarmCount - the number of entries to prepopulate from

and old cache.

-->

<filterCache class="solr.FastLRUCache"

size="512"

initialSize="512"

autowarmCount="0"/>

<!-- Query Result Cache

Caches results of searches - ordered lists of document ids

(DocList) based on a query, a sort, and the range of documents requested.

-->

<queryResultCache class="solr.LRUCache"

size="512"

initialSize="512"

autowarmCount="0"/>

<!-- Document Cache

Caches Lucene Document objects (the stored fields for each

document). Since Lucene internal document ids are transient,

this cache will not be autowarmed.

-->

<documentCache class="solr.LRUCache"

size="512"

initialSize="512"

autowarmCount="0"/>

<!-- Field Value Cache

Cache used to hold field values that are quickly accessible

by document id. The fieldValueCache is created by default

even if not configured here.

-->

<!--

<fieldValueCache class="solr.FastLRUCache"

size="512"

autowarmCount="128"

showItems="32" />

-->

<!-- Custom Cache

Example of a generic cache. These caches may be accessed by

name through SolrIndexSearcher.getCache(),cacheLookup(), and

cacheInsert(). The purpose is to enable easy caching of

user/application level data. The regenerator argument should

be specified as an implementation of solr.CacheRegenerator

if autowarming is desired.

-->

<!--

<cache name="myUserCache"

class="solr.LRUCache"

size="4096"

initialSize="1024"

autowarmCount="1024"

regenerator="com.mycompany.MyRegenerator"

/>

-->

<!-- Lazy Field Loading

If true, stored fields that are not requested will be loaded

lazily. This can result in a significant speed improvement

if the usual case is to not load all stored fields,

especially if the skipped fields are large compressed text

fields.

-->

<enableLazyFieldLoading>true</enableLazyFieldLoading>

<!-- Use Filter For Sorted Query

A possible optimization that attempts to use a filter to

satisfy a search. If the requested sort does not include

score, then the filterCache will be checked for a filter

matching the query. If found, the filter will be used as the

source of document ids, and then the sort will be applied to

that.

For most situations, this will not be useful unless you

frequently get the same search repeatedly with different sort

options, and none of them ever use "score"

-->

<!--

<useFilterForSortedQuery>true</useFilterForSortedQuery>

-->

<!-- Result Window Size

An optimization for use with the queryResultCache. When a search

is requested, a superset of the requested number of document ids

are collected. For example, if a search for a particular query

requests matching documents 10 through 19, and queryWindowSize is 50,

then documents 0 through 49 will be collected and cached. Any further

requests in that range can be satisfied via the cache.

-->

<queryResultWindowSize>20</queryResultWindowSize>

<!-- Maximum number of documents to cache for any entry in the

queryResultCache.

-->

<queryResultMaxDocsCached>200</queryResultMaxDocsCached>

<!-- Query Related Event Listeners

Various IndexSearcher related events can trigger Listeners to

take actions.

newSearcher - fired whenever a new searcher is being prepared

and there is a current searcher handling requests (aka

registered). It can be used to prime certain caches to

prevent long request times for certain requests.

firstSearcher - fired whenever a new searcher is being

prepared but there is no current registered searcher to handle

requests or to gain autowarming data from.

-->

<!-- QuerySenderListener takes an array of NamedList and executes a

local query request for each NamedList in sequence.

-->

<listener event="newSearcher" class="solr.QuerySenderListener">

<arr name="queries">

<!--

<lst><str name="q">solr</str><str name="sort">price asc</str></lst>

<lst><str name="q">rocks</str><str name="sort">weight asc</str></lst>

-->

</arr>

</listener>

<listener event="firstSearcher" class="solr.QuerySenderListener">

<arr name="queries">

<lst>

<str name="q">static firstSearcher warming in solrconfig.xml</str>

</lst>

</arr>

</listener>

<!-- Use Cold Searcher

If a search request comes in and there is no current

registered searcher, then immediately register the still

warming searcher and use it. If "false" then all requests

will block until the first searcher is done warming.

-->

<useColdSearcher>false</useColdSearcher>

<!-- Max Warming Searchers

Maximum number of searchers that may be warming in the

background concurrently. An error is returned if this limit

is exceeded.

Recommend values of 1-2 for read-only slaves, higher for

masters w/o cache warming.

-->

<maxWarmingSearchers>2</maxWarmingSearchers>

</query>

<requestDispatcher handleSelect="false" >

<requestParsers enableRemoteStreaming="true"

multipartUploadLimitInKB="2048000"

formdataUploadLimitInKB="2048"/>

<httpCaching never304="true" />

</requestDispatcher>

<requestHandler name="/select" class="solr.SearchHandler">

<lst name="defaults">

<str name="echoParams">explicit</str>

<int name="rows">10</int>

<str name="df">text</str>

</lst>

</requestHandler>

<requestHandler name="/query" class="solr.SearchHandler">

<lst name="defaults">

<str name="echoParams">explicit</str>

<str name="wt">json</str>

<str name="indent">true</str>

<str name="df">text</str>

</lst>

</requestHandler>

<requestHandler name="/get" class="solr.RealTimeGetHandler">

<lst name="defaults">

<str name="omitHeader">true</str>

<str name="wt">json</str>

<str name="indent">true</str>

</lst>

</requestHandler>

<requestHandler name="/browse" class="solr.SearchHandler">

<lst name="defaults">

<str name="echoParams">explicit</str>

<!-- VelocityResponseWriter settings -->

<str name="wt">velocity</str>

<str name="v.template">browse</str>

<str name="v.layout">layout</str>

<str name="title">Solritas</str>

<!-- Query settings -->

<str name="defType">edismax</str>

<str name="qf">

text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4

title^10.0 description^5.0 keywords^5.0 author^2.0 resourcename^1.0

</str>

<str name="df">text</str>

<str name="mm">100%</str>

<str name="q.alt">*:*</str>

<str name="rows">10</str>

<str name="fl">*,score</str>

<str name="mlt.qf">

text^0.5 features^1.0 name^1.2 sku^1.5 id^10.0 manu^1.1 cat^1.4

title^10.0 description^5.0 keywords^5.0 author^2.0 resourcename^1.0

</str>

<str name="mlt.fl">text,features,name,sku,id,manu,cat,title,description,keywords,author,resourcename</str>

<int name="mlt.count">3</int>

<!-- Faceting defaults -->

<str name="facet">on</str>

<str name="facet.field">cat</str>

<str name="facet.field">manu_exact</str>

<str name="facet.field">content_type</str>

<str name="facet.field">author_s</str>

<str name="facet.query">ipod</str>

<str name="facet.query">GB</str>

<str name="facet.mincount">1</str>

<str name="facet.pivot">cat,inStock</str>

<str name="facet.range.other">after</str>

<str name="facet.range">price</str>

<int name="f.price.facet.range.start">0</int>

<int name="f.price.facet.range.end">600</int>

<int name="f.price.facet.range.gap">50</int>

<str name="facet.range">popularity</str>

<int name="f.popularity.facet.range.start">0</int>

<int name="f.popularity.facet.range.end">10</int>

<int name="f.popularity.facet.range.gap">3</int>

<str name="facet.range">manufacturedate_dt</str>

<str name="f.manufacturedate_dt.facet.range.start">NOW/YEAR-10YEARS</str>

<str name="f.manufacturedate_dt.facet.range.end">NOW</str>

<str name="f.manufacturedate_dt.facet.range.gap">+1YEAR</str>

<str name="f.manufacturedate_dt.facet.range.other">before</str>

<str name="f.manufacturedate_dt.facet.range.other">after</str>

<!-- Highlighting defaults -->

<str name="hl">on</str>

<str name="hl.fl">content features title name</str>

<str name="hl.encoder">html</str>

<str name="hl.simple.pre">&lt;b&gt;</str>

<str name="hl.simple.post">&lt;/b&gt;</str>

<str name="f.title.hl.fragsize">0</str>

<str name="f.title.hl.alternateField">title</str>

<str name="f.name.hl.fragsize">0</str>

<str name="f.name.hl.alternateField">name</str>

<str name="f.content.hl.snippets">3</str>

<str name="f.content.hl.fragsize">200</str>

<str name="f.content.hl.alternateField">content</str>

<str name="f.content.hl.maxAlternateFieldLength">750</str>

<!-- Spell checking defaults -->

<str name="spellcheck">on</str>

<str name="spellcheck.extendedResults">false</str>

<str name="spellcheck.count">5</str>

<str name="spellcheck.alternativeTermCount">2</str>

<str name="spellcheck.maxResultsForSuggest">5</str>

<str name="spellcheck.collate">true</str>

<str name="spellcheck.collateExtendedResults">true</str>

<str name="spellcheck.maxCollationTries">5</str>

<str name="spellcheck.maxCollations">3</str>

</lst>

<!-- append spellchecking to our list of components -->

<arr name="last-components">

<str>spellcheck</str>

</arr>

</requestHandler>

<requestHandler name="/update" class="solr.UpdateRequestHandler">

</requestHandler>

<requestHandler name="/update/json" class="solr.JsonUpdateRequestHandler">

<lst name="defaults">

<str name="stream.contentType">application/json</str>

</lst>

</requestHandler>

<requestHandler name="/update/csv" class="solr.CSVRequestHandler">

<lst name="defaults">

<str name="stream.contentType">application/csv</str>

</lst>

</requestHandler>

<requestHandler name="/update/extract"

startup="lazy"

class="solr.extraction.ExtractingRequestHandler" >

<lst name="defaults">

<str name="lowernames">true</str>

<str name="uprefix">ignored_</str>

<!-- capture link hrefs but ignore div attributes -->

<str name="captureAttr">true</str>

<str name="fmap.a">links</str>

<str name="fmap.div">ignored_</str>

</lst>

</requestHandler>

<requestHandler name="/analysis/field"

startup="lazy"

class="solr.FieldAnalysisRequestHandler" />

<requestHandler name="/analysis/document"

class="solr.DocumentAnalysisRequestHandler"

startup="lazy" />

<requestHandler name="/admin/"

class="solr.admin.AdminHandlers" />

<requestHandler name="/admin/ping" class="solr.PingRequestHandler">

<lst name="invariants">

<str name="q">solrpingquery</str>

</lst>

<lst name="defaults">

<str name="echoParams">all</str>

</lst>

</requestHandler>

<!-- Echo the request contents back to the client -->

<requestHandler name="/debug/dump" class="solr.DumpRequestHandler" >

<lst name="defaults">

<str name="echoParams">explicit</str>

<str name="echoHandler">true</str>

</lst>

</requestHandler>

<requestHandler name="/replication" class="solr.ReplicationHandler" >

</requestHandler>

<!-- spell -->

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">

<lst name="spellchecker">

<str name="name">direct</str>

<str name="field">spell</str>

<str name="classname">solr.DirectSolrSpellChecker</str>

<str name="distanceMeasure">internal</str>

<float name="accuracy">0.5</float>

<int name="maxEdits">2</int>

<int name="minPrefix">1</int>

<int name="maxInspections">5</int>

<int name="minQueryLength">2</int>

<float name="maxQueryFrequency">0.001</float>

<str name="buildOnCommit">true</str>

</lst>

<lst name="spellchecker">

<!--

Optional, it is required when more than one spellchecker is configured.

Select non-default name with spellcheck.dictionary in request handler.

nameÊÇ¿ÉÑ¡µÄ£¬Èç¹ûÖ»ÓÐÒ»¸öspellchecker¿ÉÒÔ²»Ð´name

Èç¹ûÓжà¸öspellchecker£¬ÐèÒªÔÚRequest HandlerÖÐÖ¸¶¨spellcheck.dictionary

-->

<str name="name">default</str>

<!-- The classname is optional, defaults to IndexBasedSpellChecker -->

<str name="classname">solr.IndexBasedSpellChecker</str>

<!--

Load tokens from the following field for spell checking,

analyzer for the field's type as defined in schema.xml are used

ÏÂÃæÕâ¸öfieldÃû×ÖÖ¸µÄÊÇÆ´Ð´¼ì²éµÄÒÀ¾Ý£¬Ò²¾ÍÊÇ˵Ҫ¸ù¾ÝÄĸöFieldÀ´¼ì²éÓû§ÊäÈë¡£

-->

<str name="field">spell</str>

<!-- Optional, by default use in-memory index (RAMDirectory)

SpellCheckË÷ÒýÎļþµÄ´æ·ÅλÖã¬ÊÇ¿ÉÑ¡µÄ£¬Èç¹û²»Ð´Ä¬ÈÏʹÓÃÄÚ´æÄ£Ê½RAMDirectory¡£

./spellchecker1Ö¸µÄÊÇ£ºcorex\data\spellchecker1

-->

<str name="spellcheckIndexDir">./spellchecker1</str>

<!-- Set the accuracy (float) to be used for the suggestions. Default is 0.5 -->

<str name="accuracy">0.7</str>

<!--ºÎʱ´´½¨Æ´Ð´Ë÷Òý£ºbuildOnCommit/buildOnOptimize -->

<str name="buildOnCommit">true</str>

</lst>

<!-- ÁíÒ»¸öƴд¼ì²éÆ÷£¬Ê¹ÓÃJaroWinklerDistance¾àÀëËã·¨ -->

<lst name="spellchecker">

<str name="name">jarowinkler</str>

<str name="classname">solr.IndexBasedSpellChecker</str>

<str name="field">spell</str>

<str name="distanceMeasure">org.apache.lucene.search.spell.JaroWinklerDistance</str>

<str name="spellcheckIndexDir">./spellchecker2</str>

<str name="buildOnCommit">true</str>

</lst>

<!-- ÁíÒ»¸öƴд¼ì²éÆ÷£¬Ê¹ÓÃÎļþÄÚÈÝΪ¼ì²éÒÀ¾Ý

<lst name="spellchecker">

<str name="classname">solr.FileBasedSpellChecker</str>

<str name="name">file</str>

<str name="sourceLocation">spellings.txt</str>

<str name="characterEncoding">UTF-8</str>

<str name="spellcheckIndexDir">./spellcheckerFile</str>

<str name="buildOnCommit">true</str>

</lst>-->

<str name="queryAnalyzerFieldType">text_spell</str>

</searchComponent>

<queryConverter name="queryConverter" class="solr.SpellingQueryConverter"/>

<requestHandler name="/spell" class="solr.SearchHandler">

<lst name="defaults">

<str name="spellcheck.dictionary">default</str>

<str name="spellcheck.collate">true</str>

<str name="spellcheck.onlyMorePopular">true</str>

<str name="spellcheck.extendedResults">false</str>

<str name="spellcheck.count">10</str>

</lst>

<arr name="last-components">

<str>spellcheck</str>

</arr>

</requestHandler>

<searchComponent name="suggest" class="solr.SpellCheckComponent">

<str name="queryAnalyzerFieldType">string</str>

<lst name="spellchecker">

<str name="name">suggest</str>

<str name="classname">org.apache.solr.spelling.suggest.Suggester</str>

<str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>

<str name="field">text</str>

<float name="threshold">0.0001</float>

<str name="comparatorClass">freq</str>

<str name="buildOnOptimize">true</str>

<!--<str name="buildOnCommit">true</str>-->

</lst>

</searchComponent>

<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">

<lst name="defaults">

<str name="spellcheck">true</str>

<str name="spellcheck.dictionary">suggest</str>

<str name="spellcheck.onlyMorePopular">true</str>

<str name="spellcheck.extendedResults">false</str>

<str name="spellcheck.count">10</str>

<!--<str name="spellcheck.collate">true</str>-->

</lst>

<arr name="components">

<str>suggest</str>

</arr>

</requestHandler>

<requestHandler name="/mlt" class="solr.MoreLikeThisHandler">

</requestHandler>

<searchComponent name="tvComponent" class="solr.TermVectorComponent"/>

<requestHandler name="/tvrh" class="solr.SearchHandler" startup="lazy">

<lst name="defaults">

<str name="df">text</str>

<bool name="tv">true</bool>

</lst>

<arr name="last-components">

<str>tvComponent</str>

</arr>

</requestHandler>

<searchComponent name="clustering"

enable="${solr.clustering.enabled:true}"

class="solr.clustering.ClusteringComponent" >

<!-- Declare an engine -->

<lst name="engine">

<str name="name">default</str>

<str name="carrot.algorithm">org.carrot2.clustering.lingo.LingoClusteringAlgorithm</str>

<!-- Engine-specific parameters -->

<str name="LingoClusteringAlgorithm.desiredClusterCountBase">20</str>

</lst>

</searchComponent>

<requestHandler name="/clustering"

startup="lazy"

enable="${solr.clustering.enabled:true}"

class="solr.SearchHandler">

<lst name="defaults">

<str name="echoParams">explicit</str>

<bool name="clustering">true</bool>

<str name="clustering.engine">default</str>

<bool name="clustering.results">true</bool>

<str name="carrot.title">category_s</str>

<str name="carrot.snippet">content</str>

<str name="carrot.produceSummary">true</str>

</lst>

<arr name="last-components">

<str>clustering</str>

</arr>

</requestHandler>

<searchComponent name="terms" class="solr.TermsComponent"/>

<!-- A request handler for demonstrating the terms component -->

<requestHandler name="/terms" class="solr.SearchHandler" startup="lazy">

<lst name="defaults">

<bool name="terms">true</bool>

<bool name="distrib">false</bool>

</lst>

<arr name="components">

<str>terms</str>

</arr>

</requestHandler>

<searchComponent name="elevator" class="solr.QueryElevationComponent" >

<!-- pick a fieldType to analyze queries -->

<str name="queryFieldType">string</str>

<str name="config-file">elevate.xml</str>

</searchComponent>

<!-- A request handler for demonstrating the elevator component -->

<requestHandler name="/elevate" class="solr.SearchHandler" startup="lazy">

<lst name="defaults">

<str name="echoParams">explicit</str>

<str name="df">text</str>

</lst>

<arr name="last-components">

<str>elevator</str>

</arr>

</requestHandler>

<searchComponent class="solr.HighlightComponent" name="highlight">

<highlighting>

<!-- Configure the standard fragmenter -->

<!-- This could most likely be commented out in the "default" case -->

<fragmenter name="gap"

default="true"

class="solr.highlight.GapFragmenter">

<lst name="defaults">

<int name="hl.fragsize">100</int>

</lst>

</fragmenter>

<!-- A regular-expression-based fragmenter

(for sentence extraction)

-->

<fragmenter name="regex"

class="solr.highlight.RegexFragmenter">

<lst name="defaults">

<!-- slightly smaller fragsizes work better because of slop -->

<int name="hl.fragsize">70</int>

<!-- allow 50% slop on fragment sizes -->

<float name="hl.regex.slop">0.5</float>

<!-- a basic sentence pattern -->

<str name="hl.regex.pattern">[-\w ,/\n\&quot;&apos;]{20,200}</str>

</lst>

</fragmenter>

<!-- Configure the standard formatter -->

<formatter name="html"

default="true"

class="solr.highlight.HtmlFormatter">

<lst name="defaults">

<str name="hl.simple.pre"><![CDATA[<em>]]></str>

<str name="hl.simple.post"><![CDATA[</em>]]></str>

</lst>

</formatter>

<!-- Configure the standard encoder -->

<encoder name="html"

class="solr.highlight.HtmlEncoder" />

<!-- Configure the standard fragListBuilder -->

<fragListBuilder name="simple"

class="solr.highlight.SimpleFragListBuilder"/>

<!-- Configure the single fragListBuilder -->

<fragListBuilder name="single"

class="solr.highlight.SingleFragListBuilder"/>

<!-- Configure the weighted fragListBuilder -->

<fragListBuilder name="weighted"

default="true"

class="solr.highlight.WeightedFragListBuilder"/>

<!-- default tag FragmentsBuilder -->

<fragmentsBuilder name="default"

default="true"

class="solr.highlight.ScoreOrderFragmentsBuilder">

</fragmentsBuilder>

<!-- multi-colored tag FragmentsBuilder -->

<fragmentsBuilder name="colored"

class="solr.highlight.ScoreOrderFragmentsBuilder">

<lst name="defaults">

<str name="hl.tag.pre"><![CDATA[

<b style="background:yellow">,<b style="background:lawgreen">,

<b style="background:aquamarine">,<b style="background:magenta">,

<b style="background:palegreen">,<b style="background:coral">,

<b style="background:wheat">,<b style="background:khaki">,

<b style="background:lime">,<b style="background:deepskyblue">]]></str>

<str name="hl.tag.post"><![CDATA[</b>]]></str>

</lst>

</fragmentsBuilder>

<boundaryScanner name="default"

default="true"

class="solr.highlight.SimpleBoundaryScanner">

<lst name="defaults">

<str name="hl.bs.maxScan">10</str>

<str name="hl.bs.chars">.,!? &#9;&#10;&#13;</str>

</lst>

</boundaryScanner>

<boundaryScanner name="breakIterator"

class="solr.highlight.BreakIteratorBoundaryScanner">

<lst name="defaults">

<!-- type should be one of CHARACTER, WORD(default), LINE and SENTENCE -->

<str name="hl.bs.type">WORD</str>

<!-- language and country are used when constructing Locale object. -->

<!-- And the Locale object will be used when getting instance of BreakIterator -->

<str name="hl.bs.language">en</str>

<str name="hl.bs.country">US</str>

</lst>

</boundaryScanner>

</highlighting>

</searchComponent>

<queryResponseWriter name="json" class="solr.JSONResponseWriter">

<str name="content-type">text/plain; charset=UTF-8</str>

</queryResponseWriter>

<!--

Custom response writers can be declared as needed...

-->

<queryResponseWriter name="velocity" class="solr.VelocityResponseWriter" startup="lazy"/>

<queryResponseWriter name="xslt" class="solr.XSLTResponseWriter">

<int name="xsltCacheLifetimeSeconds">5</int>

</queryResponseWriter>

<admin>

<defaultQuery>*:*</defaultQuery>

</admin>

</config>

   
3778 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ