亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

compass spring hibernate 集成

系統 1739 0

  1. 我們在使用lucene管理document時,難免有些復雜,并且在做增量索引的時候會比較繁瑣,現介紹compass如下:??
  2. compass對lucene的使用就如同Hibernate和對jdbc的使用。??
  3. Compass的使用步驟:??
  4. Hibernate的實現步驟是:??
  5. 1 》??設計實體??
  6. 2 》??配置映射元數據?(xml?/?注解—Hibernate3才推出來的)??
  7. 3 》??利用Hibernate的api完成對實體的CURD??
  8. 我們目前使用compass的操作步驟就與Hibernate的基本一樣的:??
  9. Hibernate的第二步是映射到數據庫,而compass是映射到收索引擎里面去。??
  10. 1 》??設計收索實體?–?就?是一個普通的javabean??
  11. 你要寫這么一個實體,定義一些屬性,好比產品的id、名稱??
  12. 2 》??配置映射元數據?–?針對收索引擎映射-我們采用主注解的方式??
  13. 我們使用 @Searchable ?標注映射為收索實體,映射到Lucene中的document??
  14. 假設是采用注解的形式,我們就需要在實體和屬性上面加上一些注解??
  15. @Entity ?(映射到數據庫中的表)???
  16. @Searchable ??–>?這個注解把該類聲明為搜索實體,映射到lucene中的document??
  17. Public? class ?Product{??
  18. ??????????? @Id ?(Hibernate用來表示實體的標識屬性)??
  19. ??????????? @SearchableId ?(compass標注為標識屬性)??
  20. ???????????Private?Integer?id;??
  21. ??????????? @Column ()??
  22. ??????????? @SearchableProperty ??à??映射搜索屬性??
  23. ???????????Private?String?name;??
  24. }??
  25. ???
  26. 3 >利用compass?api完成對實體的添/刪/查操作??
  27. ??hibernate.cfg.xml?/?compass.cfg.xml?放在類路徑下??
  28. hibernate:?SessionFactory?sessionFactory?=? new ?Configuration().configure().buildSessionFactory();??
  29. Compass:???Compass?compass?=? new ?CompassConfiguration().configure().buildCompass();??
  30. ??SessionFactory?==?Compass???
  31. ???
  32. hibernate:?Session?session?=?sessionFactory.openSession();??
  33. compass:???CompassSession?session?=?compass.openSession();??
  34. ???????????Session?=?CompassSession??
  35. ???
  36. Hibernate:??session.beginTransaction();??
  37. compass:????session.beginTransaction();??
  38. ???
  39. Hibernate:??session.save(product)/persist();??
  40. compass:????session.save(product)/create();??
  41. ???
  42. Hibernate:??session.getTransaction().commit();??
  43. compass:????session.getTransaction().commit();??
  44. ???
  45. ??session.close();??
  46. ??sessionFactory.close();??
  47. ???
  48. ?????????學習一下compass映射注解:常用的就 5 個??
  49. ????????? @Searchable ? //告訴compass,將該類映射到lucene的Document ??
  50. ?????????注意注解如果標注在屬性上只能標注在get方法上面??
  51. ????????? @SearchableId ? //compass要求每個搜索實體類都要具有一個標識屬性,這點和Hibernate相似 ??
  52. ????????? @SearchableProperty (index=Index.NOT_ANALYZED?,store=Store.YES) //?store的默認值為Store.YES ??
  53. 類別id不需要分詞,蛋需要索引并存儲??
  54. Index。UN_TOKENIZED?不對該field進行分詞,但是要索引,該屬性已過時,建議產用NOT__ANALYZED替換??
  55. Index.TOKENIZED:先分詞后索引。該屬性已過時,建議采用ANALYZED替換??
  56. Inde.NOT_ANALYZED?不分詞,但建立索引??
  57. Index.ANALYZED?分詞并且建立索引??
  58. ???
  59. @SearchableId ?Property(boost= 2 ) //boost的默認值為1,用戶設置屬性在索引中的重要性 ??
  60. 如下:??
  61. @Searchable ? //告訴compass,將該類映射到Lucene的Document ??
  62. public ? class ?Product?{??
  63. ????????? private ?Integer?id;??
  64. ????????? private ?String?name;??
  65. ????????? private ?String?content;??
  66. ????????? private ?Float?price;??
  67. ????????? private ?String?note;??
  68. ????????? private ?Integer?position;??
  69. ????????? private ?Integer?typeid;??
  70. ???????????
  71. ????????? public ?Product(){}??
  72. ???????????
  73. ????????? public ?Product(Integer?id)?{??
  74. ??????????????????? this .id?=?id;??
  75. ?????????}??
  76. ???
  77. ????????? public ?Product(Integer?id,?String?name,?String?content,?Float?price,String?note,Integer?typeid,Integer?position)?{??
  78. ??????????????????? this .id?=?id;??
  79. ??????????????????? this .name?=?name;??
  80. ??????????????????? this .content?=?content;??
  81. ??????????????????? this .price?=?price;??
  82. ??????????????????? this .note?=?note;??
  83. ??????????????????? this .typeid?=?typeid;??
  84. ??????????????????? this .position?=?position;??
  85. ?????????}??
  86. ???????????
  87. ????????? @SearchableId ? //compass要求每個搜索實體類都要具有一個標識屬性,這點和Hibernate相似 ??
  88. ????????? public ?Integer?getId()?{??
  89. ??????????????????? return ?id;??
  90. ?????????}??
  91. ????????? public ? void ?setId(Integer?id)?{??
  92. ??????????????????? this .id?=?id;??
  93. ?????????}??
  94. ????????? //類別id不需要分詞,但需要索引并儲存 ??
  95. ????????? //Index.UN_TOKENIZED:不對該Field進行分詞,但是要索引.該屬性已過時,建議采用NOT_ANALYZED替換 ??
  96. ???? //Index.TOKENIZED:先分詞后索引。該屬性已過時,建議采用ANALYZED替換 ??
  97. ????????? //Index.NOT_ANALYZED:不分詞,但建立索引 ??
  98. ????????? //Index.ANALYZED?:分詞并且建立索引 ??
  99. ???????????
  100. ????????? @SearchableComponent ? //關聯的符合索引,專門用來標注復合類型 ??
  101. ?????????那么被標注的這個屬性對應的類,我們也要標注一下為收索實體,但是這個搜索實體他不是單獨存在的,他只是最為產品搜索實體的一部分??
  102. @Searchable (root= false )??
  103. @SearchableProperty (index=Index.NO?,store=Store.YES)??
  104. ?????????我們對他的主鍵不需要索引只需要存儲??
  105. ?????????當你存在雙向關系的時候,并且需要引用會對應的實體,反指引用??
  106. ????????? @SearchableReference ??
  107. ???
  108. @SearchableProperty (index=Index.NOT_ANALYZED,?store=Store.YES) //store的默認值為Store.YES ??
  109. ????????? public ?Integer?getTypeid()?{??
  110. ??????????????????? return ?typeid;??
  111. ?????????}??
  112. ???
  113. ????????? public ? void ?setTypeid(Integer?typeid)?{??
  114. ??????????????????? this .typeid?=?typeid;??
  115. ?????????}??
  116. ???
  117. ????????? @SearchableProperty (boost= 2 ) //boost的默認值為1,用于設置屬性在索引中的重要性 ??
  118. ????????? public ?String?getName()?{??
  119. ??????????????????? return ?name;??
  120. ?????????}??
  121. ????????? public ? void ?setName(String?name)?{??
  122. ??????????????????? this .name?=?name;??
  123. ?????????}??
  124. ???
  125. ????????? @SearchableProperty ??
  126. ????????? public ?String?getContent()?{??
  127. ??????????????????? return ?content;??
  128. ?????????}??
  129. ????????? public ? void ?setContent(String?content)?{??
  130. ??????????????????? this .content?=?content;??
  131. ?????????}??
  132. ????????? //價格不需要進行搜索,但需要存儲,如果沒有存儲,就需要從數據庫中獲取價格了 ??
  133. ????????? @SearchableProperty (index=Index.NO) //store的默認值為Store.YES ??
  134. ????????? public ?Float?getPrice()?{??
  135. ??????????????????? return ?price;??
  136. ?????????}??
  137. ????????? public ? void ?setPrice(Float?price)?{??
  138. ??????????????????? this .price?=?price;??
  139. ?????????}??
  140. ????????? @SearchableProperty (store=Store.YES)??
  141. ????????? public ?String?getNote()?{??
  142. ??????????????????? return ?note;??
  143. ?????????}??
  144. ???
  145. ????????? public ? void ?setNote(String?note)?{??
  146. ??????????????????? this .note?=?note;??
  147. ?????????}??
  148. ????????? @SearchableProperty (index=Index.NOT_ANALYZED,?store=Store.YES) //store的默認值為Store.YES ??
  149. ????????? public ?Integer?getPosition()?{??
  150. ??????????????????? return ?position;??
  151. ?????????}??
  152. ???
  153. ????????? public ? void ?setPosition(Integer?position)?{??
  154. ??????????????????? this .position?=?position;??
  155. ?????????}??
  156. ???????????
  157. ???????????
  158. }??
  159. ???
  160. ???
  161. 我們不集成spring的編程配置和使用方式如下:??
  162. import ?java.util.ArrayList;??
  163. import ?java.util.List;??
  164. ???
  165. import ?org.compass.annotations.config.CompassAnnotationsConfiguration;??
  166. import ?org.compass.core.Compass;??
  167. import ?org.compass.core.CompassException;??
  168. import ?org.compass.core.CompassHits;??
  169. import ?org.compass.core.CompassQueryBuilder;??
  170. import ?org.compass.core.CompassSession;??
  171. import ?org.compass.core.CompassTransaction;??
  172. import ?org.compass.core.CompassQuery.SortDirection;??
  173. import ?org.compass.core.CompassQuery.SortPropertyType;??
  174. import ?org.compass.core.config.CompassEnvironment;??
  175. ???
  176. import ?cn.itcast.bean.Product;??
  177. import ?cn.itcast.bean.QueryResult;??
  178. import ?cn.itcast.compass.service.ProductSearch;??
  179. ???
  180. public ? class ?ProductSearchBean? implements ?ProductSearch?{??
  181. ????????? private ?Compass?compass?=? null ; //-->SessionFactory ??
  182. ???????????
  183. ????????? public ?ProductSearchBean(){??
  184. ???????????????????? try ?{??
  185. ????????????????????????????? //編程式配置 ??
  186. ????????????????????????????compass?=? new ?CompassAnnotationsConfiguration()??
  187. ????????????????????????????.setSetting(CompassEnvironment.CONNECTION,? "[url=file://indexfile]file://indexfile[/url]" )??
  188. ???????????????????????????? //.setSetting(CompassEnvironment.CONNECTION,?"ram://index")//在內存中建立索引 ??
  189. ????????????????????????????.setSetting( "compass.engine.highlighter.default.formatter.simple.pre" , "<font?color='red'>" )??
  190. ????????????????????????????.setSetting( "compass.engine.highlighter.default.formatter.simple.post" , "</font>" )??
  191. ????????????????????????????.addScan( "cn.itcast.bean" ).buildCompass();??
  192. ???????????????????}? catch ?(Exception?e)?{??
  193. ????????????????????????????e.printStackTrace();??
  194. ???????????????????}??
  195. ?????????}??
  196. ???????????
  197. ????????? //compass支持增量索引,社會上很多公司,他們的產品都沒有實現增量索引,1>lucene版本比較低,不支持增量索引,2>要增量索引,技術要求稍微有點高 ??
  198. ????????? //(晚上?2-3,定時器,把索引文件刪除,重新生成索引)實時性不強,在索引文件更新的時候,用戶是訪問不了的 ??
  199. ????????? public ? void ?buildIndex(){??
  200. ???????????????????CompassSession?session?=? null ;??
  201. ???????????????????CompassTransaction?tx?=? null ;??
  202. ??????????????????? try ?{??
  203. ????????????????????????????session?=?compass.openSession();??
  204. ????????????????????????????tx?=?session.beginTransaction();????????
  205. ????????????????????????????Product?p1?=? new ?Product( 12 , "c瑜珈球" , "非常好的瑜珈球" ,12f,? "www" ,? 2 ,? 12 );??
  206. ????????????????????????????session.create(p1);??
  207. ????????????????????????????Product?p2?=? new ?Product( 35 , "b瑜珈球" , "天花板瑜珈球,good" ,42f,? "mmm" , 2 , 9 );??
  208. ????????????????????????????session.create(p2);??
  209. ????????????????????????????Product?p3?=? new ?Product( 8 , "a藍球瑜珈球" , "藍球小子" ,125f,? "ppp" , 5 , 8 );?????????????????????????????
  210. ????????????????????????????session.create(p3);??
  211. ????????????????????????????tx.commit();??
  212. ???????????????????}? catch ?(CompassException?e)?{??
  213. ????????????????????????????e.printStackTrace();??
  214. ????????????????????????????tx.rollback();??
  215. ???????????????????} finally {??
  216. ???????????????????????????? if (session!= null ?&&?!session.isClosed())?session.close();??
  217. ???????????????????}??
  218. ?????????}??
  219. ???
  220. ????????? public ? void ?deleteIndex(Product?product)?{??
  221. ???????????????????CompassSession?session?=? null ;??
  222. ???????????????????CompassTransaction?tx?=? null ;??
  223. ??????????????????? try ?{??
  224. ????????????????????????????session?=?compass.openSession();??
  225. ????????????????????????????tx?=?session.beginTransaction();??
  226. ???????????????????????session.delete(product);??
  227. ???????????????????????tx.commit();??
  228. ???????????????????}? catch ?(CompassException?e)?{??
  229. ????????????????????????????e.printStackTrace();??
  230. ????????????????????????????tx.rollback();??
  231. ???????????????????} finally {??
  232. ???????????????????????????? if (session!= null ?&&?!session.isClosed())?session.close();??
  233. ???????????????????}??
  234. ?????????}??
  235. ???
  236. ????????? public ? void ?updateIndex(Product?product)?{??
  237. ???????????????????CompassSession?session?=? null ;??
  238. ???????????????????CompassTransaction?tx?=? null ;??
  239. ??????????????????? try ?{??
  240. ??????????????????????session?=?compass.openSession();??
  241. ??????????????????????tx?=?session.beginTransaction();??
  242. ??????????????????????session.delete(product);??
  243. ??????????????????????session.save(product);??
  244. ??????????????????????tx.commit();??
  245. ???????????????????}? catch ?(CompassException?e)?{??
  246. ????????????????????????????e.printStackTrace();??
  247. ????????????????????????????tx.rollback();??
  248. ???????????????????} finally {??
  249. ???????????????????????????? if (session!= null ?&&?!session.isClosed())?session.close();??
  250. ???????????????????}??
  251. ?????????}??
  252. ???
  253. ????????? public ? void ?destroy(){??
  254. ???????????????????compass.close();??
  255. ?????????}??
  256. ???????????
  257. ????????? public ?QueryResult<Product>?search(String?keyword,? int ?firstIndex,? int ?maxResult)?{??
  258. ???????????????????QueryResult<Product>?qr?=? new ?QueryResult<Product>();??
  259. ???????????????????CompassSession?session?=? null ;??
  260. ???????????????????CompassTransaction?tx?=? null ;??
  261. ??????????????????? try ?{??
  262. ?????????????????????????????session?=?compass.openSession();??
  263. ?????????????????????????????tx?=?session.beginTransaction();??
  264. ???????????????????????????? //對所有索引Field進行搜索,你也可以指定對某個Field搜索,如:"name:jack",如果想指定多個字段可以用空格和"+"隔開如"name:jack?+content:xxx" ??
  265. ?????????????????????????????CompassHits?hits?=?session.find(keyword);?????????????
  266. ?????????????????????????????List<Product>?products?=? new ?ArrayList<Product>();??
  267. ????????????????????????????? int ?length?=?firstIndex+?maxResult;??
  268. ????????????????????????????? if (length>hits.length())?length?=?hits.length();????????????????????????????
  269. ????????????????????????????? for ( int ?i=firstIndex;?i<length;?i++){??
  270. ??????????????????????????????????????Product?product?=?(Product)hits.data(i);??
  271. ??????????????????????????????????????product.setContent(hits.highlighter(i).fragment( "content" ));??
  272. ??????????????????????????????????????products.add(product);??
  273. ?????????????????????????????}??
  274. ?????????????????????????????qr.setResultlist(products);??
  275. ?????????????????????????????qr.setTotalrecord(hits.length());??
  276. ?????????????????????????????hits.close();??
  277. ???????????????????}? catch ?(CompassException?e)?{??
  278. ????????????????????????????e.printStackTrace();??
  279. ????????????????????????????tx.rollback();??
  280. ???????????????????} finally {??
  281. ???????????????????????????? if (session!= null ?&&?!session.isClosed())?session.close();??
  282. ???????????????????}??
  283. ??????????????????? return ?qr;??
  284. ?????????}??
  285. ???????????
  286. ????????? public ?QueryResult<Product>?search(String?keyword,?Integer?typeid,? int ?firstIndex,? int ?maxResult)?{??
  287. ???????????????????QueryResult<Product>?qr?=? new ?QueryResult<Product>();??
  288. ???????????????????CompassSession?session?=? null ;??
  289. ???????????????????CompassTransaction?tx?=? null ;??
  290. ??????????????????? try ?{??
  291. ?????????????????????????????session?=?compass.openSession();??
  292. ?????????????????????????????tx?=?session.beginTransaction();??
  293. ????????????????????????????? //查詢指定類別的匹配記錄,并按position降序排序 ??
  294. ?????????????????????????????CompassQueryBuilder?queryBuilder?=?session.queryBuilder();??
  295. ?????????????????????????????CompassHits?hits?=?queryBuilder.bool()??
  296. ????????????????????????????????????.addMust(queryBuilder.spanEq( "typeid" ,?typeid))??
  297. ????????????????????????????????????.addMust(queryBuilder.queryString(keyword).toQuery())??
  298. ??????????????????????????????????.toQuery().addSort( "position" ,?SortPropertyType.FLOAT,?SortDirection.REVERSE)??
  299. ??????????????????????????????????.hits(); //sql:?typeid=1?and?(xxxx?like??)?order?by?positoin?desc ??
  300. ???????????????????????????????
  301. ?????????????????????????????List<Product>?products?=? new ?ArrayList<Product>();??
  302. ????????????????????????????? int ?length?=?firstIndex+?maxResult;??
  303. ????????????????????????????? if (length>hits.length())?length?=?hits.length();????????????????????????????
  304. ????????????????????????????? for ( int ?i=firstIndex;?i<length;?i++){??
  305. ??????????????????????????????????????Product?product?=?(Product)hits.data(i);??
  306. ??????????????????????????????????????product.setContent(hits.highlighter(i).fragment( "content" ));??
  307. ??????????????????????????????????????products.add(product);??
  308. ?????????????????????????????}??
  309. ?????????????????????????????qr.setResultlist(products);??
  310. ?????????????????????????????qr.setTotalrecord(hits.length());??
  311. ?????????????????????????????hits.close();??
  312. ???????????????????}? catch ?(CompassException?e)?{??
  313. ????????????????????????????e.printStackTrace();??
  314. ????????????????????????????tx.rollback();??
  315. ???????????????????} finally {??
  316. ???????????????????????????? if (session!= null ?&&?!session.isClosed())?session.close();??
  317. ???????????????????}??
  318. ??????????????????? return ?qr;??
  319. ?????????}??
  320. }??


???????? //compass支持增量索引,社會上很多公司,他們的產品都沒有實現增量索引,1>lucene版本比較低,不支持增量索引,2>要增量索引,技術要求稍微有點高
???????? //(晚上 2-3,定時器,把索引文件刪除,重新生成索引)實時性不強,在索引文件更新的時候,用戶是訪問不了的

以上基本都為講解,下面是具體的開發步驟:
步驟一:
導jar:compass的兩個文件,疑問logging文件一般我們已經存在了,lucene的六個文件
步驟二:
配置映射元數據:
設計實體,我們實體已經存在了,所以不用設計了,直接加注解
我們映射產品:
首先我們要加上搜索id
然后我們要分析一下那些是需要搜索的,哪些是不需要搜索的,但是需要顯示在搜索結果中的。如果不需要顯示也不需要索引就不管他
???????? 第三步:
???????? 我們對索引進行填、刪、查
???????? 我們對產品進行保存的時候,我們就應該把索引也保持進去。
???????? 方式一:我們可以重寫我們servicebean的保持方法。添加一個保存到索引里面去的方法。這樣我們就存在一個問題,兩個保存,有一個保存失敗了,另一個保存就無法執行。就導致了數據不同,無法保證兩種保存在同一個事物中
???????? 方式二:把compass集成到spring中,讓他使用spring的事物管理功能。
在我們的spring中添加代碼如下:

Java代碼 ? 收藏代碼
  1. <bean?id= "compass" ? class = "org.compass.spring.LocalCompassBean" >??
  2. ?????<property?name= "classMappings" >??
  3. ?????????<list>??
  4. ????????????<value>cn.itcast.bean.product.ProductInfo</value>??
  5. ????????????<value>cn.itcast.bean.product.Brand</value>??
  6. ????????????<value>cn.itcast.bean.product.ProductStyle</value>??
  7. ????????????<value>cn.itcast.bean.product.ProductType</value>??
  8. ?????????</list>??
  9. ?????</property>??
  10. ?????<property?name= "compassSettings" >??
  11. ?????????<props>??
  12. ????????????<prop?key= "compass.engine.analyzer.default.type" >net.paoding.analysis.analyzer.PaodingAnalyzer</prop>??
  13. ????????????<prop?key= "compass.engine.connection" >file: //d:/index</prop> ??
  14. ????????????<!--?在內存中建立索引??
  15. ????????????<prop?key= "compass.engine.connection" >ram: //index</prop> ??
  16. ????????????-->??
  17. ????????????<prop?key= "compass.engine.highlighter.default.formatter.simple.pre" ><![CDATA[<font?color= 'red' >]]></prop>??
  18. ????????????<prop?key= "compass.engine.highlighter.default.formatter.simple.post" ><![CDATA[</font>]]></prop>??
  19. ????????????<prop?key= "compass.transaction.factory" >org.compass.spring.transaction.SpringSyncTransactionFactory</prop>??
  20. ?????????</props>??
  21. ?????</property>??
  22. ?????<property?name= "transactionManager" ?ref= "transactionManager" ?/>??
  23. ??</bean>??

?

?

引自:http://osacar.iteye.com/blog/1050977 多謝

compass spring hibernate 集成


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧洲一级黄色片 | 一本一本久久α久久精品66 | 久在线观看 | 亚洲最大激情网 | 好吊色青青青国产欧美日韩 | 91亚洲免费 | 国产成人久久蜜一区二区 | 狠狠操大逼 | 国产欧美一区二区久久 | 国产亚洲综合在线 | 99精品国产成人a∨免费看 | 中文乱码精品一区二区三区 | 亚洲欧美日本在线观看 | 四虎影视在线观看2413 | 亚洲综合伊人色一区 | 曰韩一级片| 九九热在线精品视频 | www.亚洲视频.com | 婷婷伊人五月 | 日本一级毛片中文字幕 | 黄色69| 日韩精品一区二区三区 在线观看 | 久久精品国产亚洲欧美 | 精品一区二区久久久久久久网精 | 久久精品国产福利国产秒 | 被黑人做的白浆直流在线播放 | 国产精品成人一区二区不卡 | 欧美色激情 | 日韩美a一级毛片 | 天天操夜夜操美女 | 久久亚洲综合伊人 | 久久免费视频观看 | 欧美操操| 亚洲精品色综合久久久 | 欧美一级毛片一级 | 人人狠狠综合久久亚洲88 | 韩国精品videosex性韩国 | 亚洲视频在线观看免费视频 | 久久最稳定资源站在线 | 毛片免费的 | 91视频网址入口 |