±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËelasticsearch¼ìË÷ÔÀí¡¢ÓÅ»¯°¸Àý¡¢ÐÔÄܲâÊÔµÈÏà¹ØÄÚÈÝ¡£
±¾ÎÄÀ´×Ô²©¿ÍÔ°£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
Ò»¡¢Ç°ÑÔ
Êý¾Ýƽ̨Òѵü´úÈý¸ö°æ±¾£¬´ÓÍ·¿ªÊ¼Óöµ½ºÜ¶à³£¼ûµÄÄÑÌ⣬ÖÕÓÚÓÐÆ¬¶Îʱ¼äÕûÀíһЩÒÑÍêÉÆµÄÎĵµ£¬ÔÚ´Ë·ÖÏíÒÔ¹©ËùÐèÅóÓÑʵÏֲο¼£¬ÉÙ×ßЩÍä·£¬ÔÚ´ËÆª·ùÖÐÆ«ÖØÓÚESµÄÓÅ»¯£¬¹ØÓÚHBase£¬HadoopµÄÉè¼ÆÓÅ»¯¹À¼ÆÓкܶàÎÄÕ¿ÉÒԲο¼£¬²»ÔÙ׸Êö¡£
¶þ¡¢ÐèÇó˵Ã÷
ÏîÄ¿±³¾°£º
ÔÚÒ»ÒµÎñϵͳÖУ¬²¿·Ö±íÿÌìµÄÊý¾ÝÁ¿¹ýÒÚ£¬ÒѰ´Ìì·Ö±í£¬µ«ÒµÎñÉÏÊÜÏÞÓÚ°´Ìì²éѯ£¬²¢ÇÒDBÖÐÖ»Äܱ£Áô3¸öÔµÄÊý¾Ý(Ó²¼þ¸ßÅä)£¬·Ö¿â´ú¼Û½Ï¸ß¡£
¸Ä½ø°æ±¾Ä¿±ê£º
1. Êý¾ÝÄÜ¿çÔ²éѯ£¬²¢ÇÒÖ§³Ö1ÄêÒÔÉϵÄÀúÊ·Êý¾Ý²éѯÓëµ¼³ö¡£
2. °´Ìõ¼þµÄÊý¾Ý²éѯÃë¼¶·µ»Ø¡£
Èý¡¢ES ¼ìË÷ÔÀí
3.1 ¹ØÓÚESºÍLucene»ù´¡½á¹¹
̸µ½ÓÅ»¯£¬±ØÐëÄÜÁ˽â×é¼þµÄ»ù±¾ÔÀí£¬²ÅÈÝÒ×ÕÒµ½Æ¿¾±ËùÔÚ£¬ÒÔÃâ×ß¶àÖÖÍä·£¬ÏÈ´ÓESµÄ»ù´¡½á¹¹ËµÆð(ÈçÏÂͼ)£º

һЩ»ù±¾¸ÅÄî:
Cluster °üº¬¶à¸öNodeµÄ¼¯Èº
Node ¼¯Èº·þÎñµ¥Ôª
Index Ò»¸öESË÷Òý°üº¬Ò»¸ö»ò¶à¸öÎïÀí·ÖƬ£¬ËüÖ»ÊÇÕâЩ·ÖƬµÄÂß¼ÃüÃû¿Õ¼ä
Type Ò»¸öindexµÄ²»Í¬·ÖÀ࣬6.xºóÖ»ÄÜÅäÖÃÒ»¸ötype£¬ÒÔºó½«ÒƳý
Document ×î»ù´¡µÄ¿É±»Ë÷ÒýµÄÊý¾Ýµ¥Ôª£¬ÈçÒ»¸öJSON´®
Shards Ò»¸ö·ÖƬÊÇÒ»¸öµ×²ãµÄ¹¤×÷µ¥Ôª£¬Ëü½ö±£´æÈ«²¿Êý¾ÝÖеÄÒ»²¿·Ö£¬ËüÊÇÒ»¸öLucenceʵÀý
(Ò»¸öluceneË÷Òý×î´ó°üº¬2,147,483,519 (= Integer.MAX_VALUE
¨C 128)¸öÎĵµÊýÁ¿)
Replicas ·ÖƬ±¸·Ý£¬ÓÃÓÚ±£ÕÏÊý¾Ý°²È«Óë·Öµ£¼ìË÷ѹÁ¦
ESÒÀÀµÒ»¸öÖØÒªµÄ×é¼þLucene£¬¹ØÓÚÊý¾Ý½á¹¹µÄÓÅ»¯Í¨³£À´ËµÊǶÔLuceneµÄÓÅ»¯£¬ËüÊǼ¯ÈºµÄÒ»¸ö´æ´¢ÓÚ¼ìË÷¹¤×÷µ¥Ôª£¬½á¹¹ÈçÏÂͼ£º

ÔÚLuceneÖУ¬·ÖΪË÷Òý(¼Èë)Óë¼ìË÷(²éѯ)Á½²¿·Ö£¬Ë÷Òý²¿·Ö°üº¬ ·Ö´ÊÆ÷¡¢¹ýÂËÆ÷¡¢×Ö·ûÓ³ÉäÆ÷ µÈ£¬¼ìË÷²¿·Ö°üº¬
²éѯ½âÎöÆ÷ µÈ¡£
Ò»¸öLuceneË÷Òý°üº¬¶à¸ösegments£¬Ò»¸ösegment°üº¬¶à¸öÎĵµ£¬Ã¿¸öÎĵµ°üº¬¶à¸ö×ֶΣ¬Ã¿¸ö×ֶξ¹ý·Ö´ÊºóÐγÉÒ»¸ö»ò¶à¸öterm¡£
ͨ¹ýLuke¹¤¾ß²é¿´ESµÄluceneÎļþÈçÏ£¬Ö÷ÒªÔö¼ÓÁË_idºÍ_source×Ö¶Î:

3.2 LuceneË÷ÒýʵÏÖ
Lucene Ë÷ÒýÎļþ½á¹¹Ö÷ÒªµÄ·ÖΪ£º´Êµä¡¢µ¹ÅÅ±í¡¢ÕýÏòÎļþ¡¢DocValuesµÈ£¬ÈçÏÂͼ:


×¢£ºÕûÀíÀ´Ô´ÓÚlucene¹Ù·½:
Lucene Ëæ»úÈý´Î´ÅÅ̶ÁÈ¡±È½ÏºÄʱ¡£ÆäÖÐ.fdtÎļþ±£´æÊý¾ÝÖµËðºÄ¿Õ¼ä´ó£¬.timºÍ.docÔòÐèÒªSSD´æ´¢Ìá¸ßËæ»ú¶ÁдÐÔÄÜ¡£
ÁíÍâÒ»¸ö±È½ÏÏûºÄÐÔÄܵÄÊÇ´ò·ÖÁ÷³Ì£¬²»ÐèÒªÔò¿ÉÆÁ±Î¡£
¹ØÓÚDocValues£º
µ¹ÅÅË÷Òý½â¾ö´Ó´Ê¿ìËÙ¼ìË÷µ½ÏàÓ¦ÎĵµID, µ«Èç¹ûÐèÒª¶Ô½á¹û½øÐÐÅÅÐò¡¢·Ö×é¡¢¾ÛºÏµÈ²Ù×÷µÄʱºòÔòÐèÒª¸ù¾ÝÎĵµID¿ìËÙÕÒµ½¶ÔÓ¦µÄÖµ¡£
ͨ¹ýµ¹ÅÅË÷Òý´ú¼ÛÈ´ºÜ¸ß£ºÐèµü´úË÷ÒýÀïµÄÿ¸ö´ÊÏî²¢ÊÕ¼¯ÎĵµµÄÁÐÀïÃæ token¡£ÕâºÜÂý¶øÇÒÄÑÒÔÀ©Õ¹£ºËæ×Å´ÊÏîºÍÎĵµµÄÊýÁ¿Ôö¼Ó£¬Ö´ÐÐʱ¼äÒ²»áÔö¼Ó¡£
Solr docs¶Ô´ËµÄ½âÊÍÈçÏ£º
For other features that we now commonly associate
with search, such as sorting, faceting, and highlighting,
this approach is not very efficient. The faceting
engine, for example, must look up each term that appears
in each document that will make up the result set
and pull the document IDs in order to build the facet
list. In Solr, this is maintained in memory, and can
be slow to load (depending on the number of documents,
terms, etc.)
ÔÚlucene 4.0°æ±¾Ç°Í¨¹ýFieldCache£¬ÔÀíÊÇͨ¹ý°´ÁÐÄæ×ªµ¹ÅÅ±í½«£¨field value
->doc£©Ó³Éä±ä³É£¨doc -> field value£©Ó³É䣬ÎÊÌâΪÖð²½¹¹½¨Ê±¼ä³¤²¢ÇÒÏûºÄ´óÁ¿Äڴ棬ÈÝÒ×Ôì³ÉOOM¡£
DocValuesÊÇÒ»ÖÖÁд洢½á¹¹£¬ÄÜ¿ìËÙͨ¹ýÎĵµIDÕÒµ½Ïà¹ØÐèÒªÅÅÐòµÄ×ֶΡ£
ÔÚESÖУ¬Ä¬ÈÏ¿ªÆôËùÓÐ(³ýÁ˱ê¼ÇÐèanalyzedµÄ×Ö·û´®×Ö¶Î)×ֶεÄdoc values£¬Èç¹û²»ÐèÒª¶Ô´Ë×Ö¶Î×öÈκÎÅÅÐòµÈ¹¤×÷£¬Ôò¿É¹Ø±ÕÒÔ¼õÉÙ×ÊÔ´ÏûºÄ¡£
3.3 ¹ØÓÚESË÷ÒýÓë¼ìË÷·ÖƬ
ESÖÐÒ»¸öË÷ÒýÓÉÒ»¸ö»ò¶à¸öluceneË÷Òý¹¹³É£¬Ò»¸öluceneË÷ÒýÓÉÒ»¸ö»ò¶à¸ösegment¹¹³É£¬ÆäÖÐsegmentÊÇ×îСµÄ¼ìË÷Óò¡£
Êý¾Ý¾ßÌå±»´æ´¢µ½Äĸö·ÖƬÉÏ£º shard = hash(routing) % number_of_primary_shards
ĬÈÏÇé¿öÏ routing²ÎÊýÊÇÎĵµID (murmurhash3),¿Éͨ¹ý URLÖÐµÄ _routing
²ÎÊýÖ¸¶¨Êý¾Ý·Ö²¼ÔÚͬһ¸ö·ÖƬÖУ¬indexºÍsearchµÄʱºò¶¼ÐèÒªÒ»Ö²ÅÄÜÕÒµ½Êý¾Ý
Èç¹ûÄÜÃ÷È·¸ù¾Ý_routing½øÐÐÊý¾Ý·ÖÇø£¬Ôò¿É¼õÉÙ·ÖÆ¬µÄ¼ìË÷¹¤×÷£¬ÒÔÌá¸ßÐÔÄÜ¡£
ËÄ¡¢ÓÅ»¯°¸Àý
ÔÚÎÒÃǵݸÀýÖУ¬²éѯ×ֶζ¼Êǹ̶¨µÄ£¬²»ÌṩȫÎļìË÷¹¦ÄÜ£¬ÕâÒ²ÊǼ¸Ê®ÒÚÊý¾ÝÄÜÃë¼¶·µ»ØµÄÒ»¸ö´óǰÌ᣺
1¡¢ES½öÌṩ×ֶεļìË÷£¬½ö´æ´¢HBaseµÄRowkey²»´æ´¢Êµ¼ÊÊý¾Ý¡£
2¡¢Êµ¼ÊÊý¾Ý´æ´¢ÔÚHBaseÖУ¬Í¨¹ýRowkey²éѯ£¬ÈçÏÂͼ¡£
3¡¢Ìá¸ßË÷ÒýÓë¼ìË÷µÄÐÔÄܽ¨Ò飬¿É²Î¿¼¹Ù·½Îĵµ
һЩϸ½ÚÓÅ»¯Ïî¹Ù·½ÓëÆäËûµÄһЩÎÄÕ¶¼ÓÐÃèÊö£¬ÔÚ´ËÎÄÕÂÖнöÌá³öһЩ±¾°¸ÀýµÄÖØµãÓÅ»¯Ïî¡£

4.1 ÓÅ»¯Ë÷ÒýÐÔÄÜ
1¡¢ÅúÁ¿Ð´È룬¿´Ã¿ÌõÊý¾ÝÁ¿µÄ´óС£¬Ò»°ã¶¼ÊǼ¸°Ùµ½¼¸Ç§¡£
2¡¢¶àÏß³ÌдÈ룬дÈëÏß³ÌÊýÒ»°ãºÍ»úÆ÷ÊýÏ൱£¬¿ÉÒÔÅä¶àÖÖÇé¿ö£¬ÔÚ²âÊÔ»·¾³Í¨¹ýKibana¹Û²ìÐÔÄÜÇúÏß¡£
3¡¢Ôö¼ÓsegmentsµÄË¢ÐÂʱ¼ä£¬Í¨¹ýÉÏÃæµÄÔÀíÖªµÀ£¬segment×÷Ϊһ¸ö×îСµÄ¼ìË÷µ¥Ôª£¬±ÈÈçsegmentÓÐ50¸ö£¬Ä¿µÄÐèÒª²é10ÌõÊý¾Ý£¬µ«ÐèÒª´Ó50¸ösegment
·Ö±ð²éѯ10Ìõ£¬¹²500Ìõ¼Ç¼£¬ÔÙ½øÐÐÅÅÐò»òÕß·ÖÊý±È½Ïºó£¬½ØÈ¡×îÇ°ÃæµÄ10Ìõ£¬¶ªÆú490Ìõ¡£ÔÚÎÒÃǵݸÀýÖн«´Ë
¡°refresh_interval¡±: ¡°-1¡± £¬³ÌÐòÅúÁ¿Ð´ÈëÍê³Éºó
½øÐÐÊÖ¹¤Ë¢ÐÂ(µ÷ÓÃÏàÓ¦µÄAPI¼´¿É)¡£
4¡¢ÄÚ´æ·ÖÅä·½Ãæ£¬ºÜ¶àÎÄÕÂÒѾÌáµ½£¬¸øÏµÍ³50%µÄÄÚ´æ¸øLucene×öÎļþ»º´æ£¬ËüÈÎÎñºÜ·±ÖØ£¬ËùÒÔES½ÚµãµÄÄÚ´æÐèÒª±È½Ï¶à(±ÈÈçÿ¸ö½ÚµãÄÜÅäÖÃ64GÒÔÉÏ×îºÃ£©¡£
5¡¢´ÅÅÌ·½ÃæÅäÖÃSSD£¬»úеÅÌ×öÕóÁÐRAID5 RAID10ËäÈ»¿´ÉÏÈ¥ºÜ¿ì£¬µ«ÊÇËæ»úIO»¹ÊÇSSDºÃ¡£
6¡¢ ʹÓÃ×Ô¶¯Éú³ÉµÄID£¬ÔÚÎÒÃǵݸÀýÖÐʹÓÃ×Ô¶¨ÒåµÄKEY£¬Ò²¾ÍÊÇÓëHBaseµÄROW KEY£¬ÊÇΪÁËÄܸù¾Ýrowkeyɾ³ýºÍ¸üÐÂÊý¾Ý£¬ÐÔÄÜϽµ²»ÊǺÜÃ÷ÏÔ¡£
7¡¢¹ØÓڶκϲ¢£¬ºÏ²¢ÔÚºǫ́¶¨ÆÚÖ´ÐУ¬±È½Ï´óµÄsegmentÐèÒªºÜ³¤Ê±¼ä²ÅÄÜÍê³É£¬ÎªÁ˼õÉÙ¶ÔÆäËû²Ù×÷µÄÓ°Ïì(Èç¼ìË÷)£¬elasticsearch½øÐÐãÐÖµÏÞÖÆ£¬Ä¬ÈÏÊÇ20MB/s£¬
¿ÉÅäÖõIJÎÊý£º¡±indices.store.throttle.max_bytes_per_sec¡±
: ¡°200mb¡± £¨¸ù¾Ý´ÅÅÌÐÔÄܵ÷Õû£©
ºÏ²¢Ïß³ÌÊýĬÈÏÊÇ£ºMath.max(1, Math.min(4, Runtime.getRuntime(
).availableProcessors() / 2))£¬Èç¹ûÊÇ»úе´ÅÅÌ£¬¿ÉÒÔ¿¼ÂÇÉèÖÃΪ1£ºindex.merge.scheduler.max_thread_count:
1£¬
ÔÚÎÒÃǵݸÀýÖÐʹÓÃSSD£¬ÅäÖÃÁË6¸öºÏ²¢Ï̡߳£
4.2 ÓÅ»¯¼ìË÷ÐÔÄÜ
1¡¢¹Ø±Õ²»ÐèÒª×ֶεÄdoc values¡£
2¡¢¾¡Á¿Ê¹ÓÃkeywordÌæ´úһЩlong»òÕßintÖ®À࣬term²éѯ×ܱÈrange²éѯºÃ
(²Î¿¼lucene˵Ã÷ )¡£
3¡¢¹Ø±Õ²»ÐèÒª²éѯ×ֶεÄ_source¹¦ÄÜ£¬²»½«´Ë´æ´¢½öESÖУ¬ÒÔ½ÚÊ¡´ÅÅ̿ռ䡣
4¡¢ÆÀ·ÖÏûºÄ×ÊÔ´£¬Èç¹û²»ÐèÒª¿ÉʹÓÃfilter¹ýÂËÀ´´ïµ½¹Ø±ÕÆÀ·Ö¹¦ÄÜ£¬scoreÔòΪ0£¬Èç¹ûʹÓÃconstantScoreQueryÔòscoreΪ1¡£
5¡¢¹ØÓÚ·ÖÒ³£º
£¨1£©from + size:
ÿ·ÖƬ¼ìË÷½á¹ûÊý×î´óΪ from + size£¬¼ÙÉèfrom = 20, size = 20£¬Ôòÿ¸ö·ÖƬÐèÒª»ñÈ¡20
* 20 = 400ÌõÊý¾Ý£¬¶à¸ö·ÖƬµÄ½á¹ûÔÚе÷½ÚµãºÏ²¢(¼ÙÉèÇëÇóµÄ·ÖÅäÊýΪ5£¬Ôò½á¹ûÊý×î´óΪ 400*5
= 2000Ìõ) ÔÙÔÚÄÚ´æÖÐÅÅÐòºóÈ»ºó20Ìõ¸øÓû§¡£
ÕâÖÖ»úÖÆµ¼ÖÂÔ½Íùºó·ÖÒ³»ñÈ¡µÄ´ú¼ÛÔ½¸ß£¬´ïµ½50000Ìõ½«ÃæÁÙ³ÁÖØµÄ´ú¼Û£¬Ä¬ÈÏfrom + sizeĬÈÏÈçÏ£º
index.max_result_window £º10000
(2) search_after: ʹÓÃǰһ¸ö·ÖÒ³¼Ç¼µÄ×îºóÒ»ÌõÀ´¼ìË÷ÏÂÒ»¸ö·ÖÒ³¼Ç¼£¬ÔÚÎÒÃǵݸÀýÖУ¬Ê×ÏÈʹÓÃfrom+size£¬¼ìË÷³ö½á¹ûºóÔÙʹÓÃsearch_after£¬ÔÚÒ³ÃæÉÏÎÒÃÇÏÞÖÆÁËÓû§Ö»ÄÜÌø5Ò³£¬²»ÄÜÌøµ½×îºóÒ»Ò³¡£
(3) scroll ÓÃÓÚ´ó½á¹û¼¯²éѯ£¬È±ÏÝÊÇÐèҪά»¤scroll_id
6¡¢¹ØÓÚÅÅÐò£ºÎÒÃÇÔö¼ÓÒ»¸ölong×ֶΣ¬ËüÓÃÓڴ洢ʱ¼äºÍIDµÄ×éºÏ(ͨ¹ýÒÆÎ»¼´¿É)£¬ÕýÅÅÓëµ¹ÅÅÐÔÄÜÏà²î²»Ã÷ÏÔ¡£
7¡¢¹ØÓÚCPUÏûºÄ£¬¼ìË÷ʱÈç¹ûÐèÒª×öÅÅÐòÔòÐèÒª×ֶζԱȣ¬ÏûºÄCPU±È½Ï´ó£¬Èç¹ûÓпÉÄܾ¡Á¿·ÖÅä16coresÒÔÉϵÄCPU£¬¾ßÌå¿´ÒµÎñѹÁ¦¡£
8¡¢¹ØÓںϲ¢±»±ê¼Çɾ³ýµÄ¼Ç¼£¬ÎÒÃÇÉèÖÃΪ0±íʾÔںϲ¢µÄʱºòÒ»¶¨É¾³ý±»±ê¼ÇµÄ¼Ç¼£¬Ä¬ÈÏÓ¦¸ÃÊÇ´óÓÚ10%²Åɾ³ý£º¡±merge.policy.expunge_deletes_allowed¡±:
¡°0¡±¡£
{ "mappings":
{ "data": { "dynamic":
"false", "_source": {
"includes": ["XXX"] -- ½ö½«²éѯ½á¹ûËùÐèµÄÊý¾Ý´æ´¢½ö_sourceÖÐ
}, "properties": { "state":
{ "type": "keyword", --
ËäÈ»stateΪintÖµ£¬µ«Èç¹û²»ÐèÒª×ö·¶Î§²éѯ£¬¾¡Á¿Ê¹ÓÃkeyword£¬ÒòΪintÐèÒª±ÈkeywordÔö¼Ó¶îÍâµÄÏûºÄ¡£
"doc_values": false -- ¹Ø±Õ²»ÐèÒª×ֶεÄdoc values¹¦ÄÜ£¬½ö¶ÔÐèÒªÅÅÐò£¬»ã¾Û¹¦ÄܵÄ×ֶοªÆô¡£
}, "b": { "type":
"long" -- ʹÓÃÁË·¶Î§²éѯ×ֶΣ¬ÔòÐèÒªÓÃlong»òÕßintÖ®Àà
£¨¹¹½¨ÀàËÆKD-trees½á¹¹£©
}
}
}
}, "settings": {......}
} |
Îå¡¢ÐÔÄܲâÊÔ
ÓÅ»¯Ð§¹ûÆÀ¹À»ùÓÚ»ù×¼²âÊÔ£¬Èç¹ûûÓлù×¼²âÊÔÎÞ·¨Á˽âÊÇ·ñÓÐÐÔÄÜÌáÉý£¬ÔÚÕâËùÓеı䶯ǰ×öÒ»´Î²âÊÔ»á±È½ÏºÃ¡£ÔÚÎÒÃǵݸÀýÖУº
1¡¢µ¥½Úµã5ǧÍòµ½Ò»ÒÚµÄÊý¾ÝÁ¿²âÊÔ£¬¼ì²éµ¥µã³ÐÊÜÄÜÁ¦¡£
2¡¢¼¯Èº²âÊÔ1ÒÚ-30ÒÚµÄÊýÁ¿£¬´ÅÅÌIO/ÄÚ´æ/CPU/ÍøÂçIOÏûºÄÈçºÎ¡£
3¡¢Ëæ»ú²»Í¬×éºÏÌõ¼þµÄ¼ìË÷£¬ÔÚ¸÷¸öÊý¾ÝÁ¿Çé¿öϱíÏÖÈçºÎ¡£
4¡¢ÁíÍâSSDÓë»úеÅÌÔÚ²âÊÔÖÐÐÔÄܲî¾àÈçºÎ¡£
ÐÔÄܵIJâÊÔ×éºÏÓкܶ࣬ͨ³£Ò²ºÜ»¨Ê±¼ä£¬²»¹ý×÷ΪÆÀ²â±ê׼ʱ¼äÉϵÄͶÈëÓбØÒª£¬·ñÔòÉú²ú³öÏÖÐÔÄÜÎÊÌâºÜÄѶ¨Î»»ò²»ºÃ¸ÄÉÆ¡£
¶ÔÓÚESµÄÐÔÄÜÑо¿»¨Á˲»ÉÙʱ¼ä£¬×î¶àµÄ¹Ø×¢µã¾ÍÊÇluceneµÄÓÅ»¯£¬ÄÜÉîÈëÁ˽âluceneÔÀí¶ÔÓÅ»¯ÓкܴóµÄ°ïÖú¡£
Áù¡¢Éú²úЧ¹û
Ŀǰƽ̨Îȶ¨ÔËÐУ¬¼¸Ê®ÒÚµÄÊý¾Ý²éѯ100Ìõ¶¼ÔÚ3ÃëÄÚ·µ»Ø£¬Ç°ºó·Ò³ºÜ¿ì£¬Èç¹ûºóÐøÓÐÐÔÄÜÆ¿¾±£¬¿Éͨ¹ýÀ©Õ¹½Úµã·Öµ£Êý¾ÝѹÁ¦¡£ |