±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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"><b></str>
<str name="hl.simple.post"></b></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\"']{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">.,!? 	 </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> |