亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

基于lucene的案例開發:查詢語句創建PackQuery

2019-11-15 00:51:48
字體:
來源:轉載
供稿:網友
基于lucene的案例開發:查詢語句創建PackQuery

轉載請注明出處:http://blog.csdn.net/xiaojimanman/article/details/44656141

http://www.llwjy.com/blogdetail/162e5e70516d7ddfb6df8f77e6b13a2b.html

個人博客站已經上線了,網址 www.llwjy.com ~歡迎各位吐槽

-----------------------------------------------------------------------------------------------------------

在之前的《基于lucene的案例開發:Query查詢》這篇博客中對實際開發過程中比較常見的Query做了簡單的介紹,這里就介紹下具體的代碼實現。查看最新代碼點擊這里或訪問http://www.llwjy.com/source/com.lulei.lucene.query.PackQuery.html

view plaincopy to clipboardPRint?
  1. /**
  2. *@Description:創建查詢Query
  3. */
  4. packagecom.lulei.lucene.query;
  5. importjava.io.IOException;
  6. importjava.io.StringReader;
  7. importjava.util.ArrayList;
  8. importorg.apache.lucene.analysis.Analyzer;
  9. importorg.apache.lucene.analysis.TokenStream;
  10. importorg.apache.lucene.analysis.tokenattributes.CharTermAttribute;
  11. importorg.apache.lucene.index.Term;
  12. importorg.apache.lucene.queryparser.classic.MultiFieldQueryParser;
  13. importorg.apache.lucene.queryparser.classic.ParseException;
  14. importorg.apache.lucene.queryparser.classic.QueryParser;
  15. importorg.apache.lucene.search.BooleanClause.Occur;
  16. importorg.apache.lucene.search.BooleanQuery;
  17. importorg.apache.lucene.search.NumericRangeQuery;
  18. importorg.apache.lucene.search.PhraseQuery;
  19. importorg.apache.lucene.search.PrefixQuery;
  20. importorg.apache.lucene.search.Query;
  21. importorg.apache.lucene.search.TermQuery;
  22. importorg.apache.lucene.search.TermRangeQuery;
  23. importorg.apache.lucene.search.WildcardQuery;
  24. importorg.apache.lucene.util.Version;
  25. importcom.lulei.lucene.index.manager.IndexManager;
  26. publicclassPackQuery{
  27. //分詞器
  28. privateAnalyzeranalyzer;
  29. //使用索引中的分詞器
  30. publicPackQuery(StringindexName){
  31. analyzer=IndexManager.getIndexManager(indexName).getAnalyzer();
  32. }
  33. //使用自定義分詞器
  34. publicPackQuery(Analyzeranalyzer){
  35. this.analyzer=analyzer;
  36. }
  37. /**
  38. *@paramkey
  39. *@paramfields
  40. *@returnQuery
  41. *@throwsParseException
  42. *@Author:lulei
  43. *@Description:查詢字符串匹配多個查詢域
  44. */
  45. publicQuerygetMultiFieldQuery(Stringkey,String[]fields)throwsParseException{
  46. MultiFieldQueryParserparse=newMultiFieldQueryParser(Version.LUCENE_43,fields,analyzer);
  47. Queryquery=null;
  48. query=parse.parse(key);
  49. returnquery;
  50. }
  51. /**
  52. *@paramkey
  53. *@paramfield
  54. *@returnQuery
  55. *@throwsParseException
  56. *@Author:lulei
  57. *@Description:查詢字符串匹配單個查詢域
  58. */
  59. publicQuerygetOneFieldQuery(Stringkey,Stringfield)throwsParseException{
  60. if(key==null||key.length()<1){
  61. returnnull;
  62. }
  63. QueryParserparse=newQueryParser(Version.LUCENE_43,field,analyzer);
  64. Queryquery=null;
  65. query=parse.parse(key);
  66. returnquery;
  67. }
  68. /**
  69. *@paramkey
  70. *@paramfields
  71. *@paramoccur
  72. *@returnQuery
  73. *@throwsIOException
  74. *@Author:lulei
  75. *@Description:查詢字符串、多個查詢域以及查詢域在查詢語句中的關系
  76. */
  77. publicQuerygetBooleanQuery(Stringkey,String[]fields,Occur[]occur)throwsIOException{
  78. if(fields.length!=occur.length){
  79. System.out.println("fields.lengthisn'tequalsoccur.length,pleasecheckparams!");
  80. returnnull;
  81. }
  82. BooleanQueryquery=newBooleanQuery();
  83. TokenStreamtokenStream=analyzer.tokenStream("",newStringReader(key));
  84. ArrayList<String>analyzerKeys=newArrayList<String>();
  85. while(tokenStream.incrementToken()){
  86. CharTermAttributeterm=tokenStream.getAttribute(CharTermAttribute.class);
  87. analyzerKeys.add(term.toString());
  88. }
  89. for(inti=0;i<fields.length;i++){
  90. BooleanQueryqueryField=newBooleanQuery();
  91. for(StringanalyzerKey:analyzerKeys){
  92. TermQuerytermQuery=newTermQuery(newTerm(fields[i],analyzerKey));
  93. queryField.add(termQuery,Occur.SHOULD);
  94. }
  95. query.add(queryField,occur[i]);
  96. }
  97. returnquery;
  98. }
  99. /**
  100. *@paramquerys
  101. *@paramoccur
  102. *@returnQuery
  103. *@Author:lulei
  104. *@Description:組合多個查詢,之間的關系由occur確定
  105. */
  106. publicQuerygetBooleanQuery(ArrayList<Query>querys,ArrayList<Occur>occurs){
  107. if(querys.size()!=occurs.size()){
  108. System.out.println("querys.size()isn'tequalsoccurs.size(),pleasecheckparams!");
  109. returnnull;
  110. }
  111. BooleanQueryquery=newBooleanQuery();
  112. for(inti=0;i<querys.size();i++){
  113. query.add(querys.get(i),occurs.get(i));
  114. }
  115. returnquery;
  116. }
  117. /**
  118. *@paramfieldName
  119. *@paramvalue
  120. *@return
  121. *@Author:lulei
  122. *@Description:StringField屬性的搜索
  123. */
  124. publicQuerygetStringFieldQuery(Stringvalue,StringfieldName){
  125. Queryquery=null;
  126. query=newTermQuery(newTerm(fieldName,value));
  127. returnquery;
  128. }
  129. /**
  130. *@paramfields
  131. *@paramvalues
  132. *@return
  133. *@Author:lulei
  134. *@Description:多個StringField屬性的搜索
  135. */
  136. publicQuerygetStringFieldQuery(String[]values,String[]fields,Occuroccur){
  137. if(fields==null||values==null||fields.length!=values.length){
  138. returnnull;
  139. }
  140. ArrayList<Query>querys=newArrayList<Query>();
  141. ArrayList<Occur>occurs=newArrayList<Occur>();
  142. for(inti=0;i<fields.length;i++){
  143. querys.add(getStringFieldQuery(values[i],fields[i]));
  144. occurs.add(occur);
  145. }
  146. returngetBooleanQuery(querys,occurs);
  147. }
  148. /**
  149. *@paramkey
  150. *@paramfield
  151. *@paramlucene43
  152. *@return
  153. *@throwsParseException
  154. *@Author:lulei
  155. *@Description:查詢字符串和單個查詢域QueryParser是否使用4.3
  156. */
  157. publicQuerygetOneFieldQuery(Stringkey,Stringfield,booleanlucene43)throwsParseException{
  158. if(key==null||key.length()<1){
  159. returnnull;
  160. }
  161. if(lucene43){
  162. returngetOneFieldQuery(key,field);
  163. }
  164. @SuppressWarnings("deprecation")
  165. QueryParserparse=newQueryParser(Version.LUCENE_30,field,analyzer);
  166. Queryquery=null;
  167. query=parse.parse(key);
  168. returnquery;
  169. }
  170. /**
  171. *@paramkey
  172. *@paramfield
  173. *@Author:lulei
  174. *@Description:key開頭的查詢字符串,和單個域匹配
  175. */
  176. publicQuerygetStartQuery(Stringkey,Stringfield){
  177. if(key==null||key.length()<1){
  178. returnnull;
  179. }
  180. Queryquery=newPrefixQuery(newTerm(field,key));
  181. returnquery;
  182. }
  183. /**
  184. *@paramkey
  185. *@paramfields
  186. *@paramoccur
  187. *@Author:lulei
  188. *@Description:key開頭的查詢字符串,和多個域匹配,每個域之間的關系由occur確定
  189. */
  190. publicQuerygetStartQuery(Stringkey,String[]fields,Occuroccur){
  191. if(key==null||key.length()<1){
  192. returnnull;
  193. }
  194. ArrayList<Query>querys=newArrayList<Query>();
  195. ArrayList<Occur>occurs=newArrayList<Occur>();
  196. for(Stringfield:fields){
  197. querys.add(getStartQuery(key,field));
  198. occurs.add(occur);
  199. }
  200. returngetBooleanQuery(querys,occurs);
  201. }
  202. /**
  203. *@paramkey
  204. *@paramfields
  205. *@Author:lulei
  206. *@Description:key開頭的查詢字符串,和多個域匹配,每個域之間的關系Occur.SHOULD
  207. */
  208. publicQuerygetStartQuery(Stringkey,String[]fields){
  209. returngetStartQuery(key,fields,Occur.SHOULD);
  210. }
  211. /**
  212. *@paramkey
  213. *@paramfield
  214. *@paramslop
  215. *@return
  216. *@Author:lulei
  217. *@Description:自定每個詞元之間的最大距離
  218. */
  219. publicQuerygetPhraseQuery(Stringkey,Stringfield,intslop){
  220. if(key==null||key.length()<1){
  221. returnnull;
  222. }
  223. StringReaderreader=newStringReader(key);
  224. PhraseQueryquery=newPhraseQuery();
  225. query.setSlop(slop);
  226. try{
  227. TokenStreamtokenStream=this.analyzer.tokenStream(field,reader);
  228. tokenStream.reset();
  229. CharTermAttributeterm=tokenStream.getAttribute(CharTermAttribute.class);
  230. while(tokenStream.incrementToken()){
  231. query.add(newTerm(field,term.toString()));
  232. }
  233. reader.close();
  234. }catch(IOExceptione){
  235. e.printStackTrace();
  236. returnnull;
  237. }
  238. returnquery;
  239. }
  240. /**
  241. *@paramkey
  242. *@paramfields
  243. *@paramslop
  244. *@paramoccur
  245. *@return
  246. *@Author:lulei
  247. *@Description:自定每個詞元之間的最大距離,查詢多個域,每個域之間的關系由occur確定
  248. */
  249. publicQuerygetPhraseQuery(Stringkey,String[]fields,intslop,Occuroccur){
  250. if(key==null||key.length()<1){
  251. returnnull;
  252. }
  253. ArrayList<Query>querys=newArrayList<Query>();
  254. ArrayList<Occur>occurs=newArrayList<Occur>();
  255. for(Stringfield:fields){
  256. querys.add(getPhraseQuery(key,field,slop));
  257. occurs.add(occur);
  258. }
  259. returngetBooleanQuery(querys,occurs);
  260. }
  261. /**
  262. *@paramkey
  263. *@paramfields
  264. *@paramslop
  265. *@return
  266. *@Author:lulei
  267. *@Description:自定每個詞元之間的最大距離,查詢多個域,每個域之間的關系是Occur.SHOULD
  268. */
  269. publicQuerygetPhraseQuery(Stringkey,String[]fields,intslop){
  270. returngetPhraseQuery(key,fields,slop,Occur.SHOULD);
  271. }
  272. /**
  273. *@paramkey
  274. *@paramfield
  275. *@return
  276. *@Author:lulei
  277. *@Description:通配符檢索eg:getWildcardQuery("a*thor","field")
  278. */
  279. publicQuerygetWildcardQuery(Stringkey,Stringfield){
  280. if(key==null||key.length()<1){
  281. returnnull;
  282. }
  283. returnnewWildcardQuery(newTerm(field,key));
  284. }
  285. /**
  286. *@paramkey
  287. *@paramfields
  288. *@paramoccur
  289. *@return
  290. *@Author:lulei
  291. *@Description:通配符檢索,域之間的關系為occur
  292. */
  293. publicQuerygetWildcardQuery(Stringkey,String[]fields,Occuroccur){
  294. if(key==null||key.length()<1){
  295. returnnull;
  296. }
  297. ArrayList<Query>querys=newArrayList<Query>();
  298. ArrayList<Occur>occurs=newArrayList<Occur>();
  299. for(Stringfield:fields){
  300. querys.add(getWildcardQuery(key,field));
  301. occurs.add(occur);
  302. }
  303. returngetBooleanQuery(querys,occurs);
  304. }
  305. /**
  306. *@paramkey
  307. *@paramfields
  308. *@return
  309. *@Author:lulei
  310. *@Description:通配符檢索,域之間的關系為Occur.SHOULD
  311. */
  312. publicQuerygetWildcardQuery(Stringkey,String[]fields){
  313. returngetWildcardQuery(key,fields,Occur.SHOULD);
  314. }
  315. /**
  316. *@paramkeyStart
  317. *@paramkeyEnd
  318. *@paramfield
  319. *@paramincludeStart
  320. *@paramincludeEnd
  321. *@return
  322. *@Author:lulei
  323. *@Description:范圍搜索
  324. */
  325. publicQuerygetRangeQuery(StringkeyStart,StringkeyEnd,Stringfield,booleanincludeStart,booleanincludeEnd){
  326. returnTermRangeQuery.newStringRange(field,keyStart,keyEnd,includeStart,includeEnd);
  327. }
  328. /**
  329. *@parammin
  330. *@parammax
  331. *@paramfield
  332. *@paramincludeMin
  333. *@paramincludeMax
  334. *@return
  335. *@Author:lulei
  336. *@Description:范圍搜索
  337. */
  338. publicQuerygetRangeQuery(intmin,intmax,Stringfield,booleanincludeMin,booleanincludeMax){
  339. returnNumericRangeQuery.newIntRange(field,min,max,includeMin,includeMax);
  340. }
  341. /**
  342. *@parammin
  343. *@parammax
  344. *@paramfield
  345. *@paramincludeMin
  346. *@paramincludeMax
  347. *@return
  348. *@Author:lulei
  349. *@Description:范圍搜索
  350. */
  351. publicQuerygetRangeQuery(floatmin,floatmax,Stringfield,booleanincludeMin,booleanincludeMax){
  352. returnNumericRangeQuery.newFloatRange(field,min,max,includeMin,includeMax);
  353. }
  354. /**
  355. *@parammin
  356. *@parammax
  357. *@paramfield
  358. *@paramincludeMin
  359. *@paramincludeMax
  360. *@return
  361. *@Author:lulei
  362. *@Description:范圍搜索
  363. */
  364. publicQuerygetRangeQuery(doublemin,doublemax,Stringfield,booleanincludeMin,booleanincludeMax){
  365. returnNumericRangeQuery.newDoubleRange(field,min,max,includeMin,includeMax);
  366. }
  367. publicstaticvoidmain(String[]args)throwsIOException{
  368. }
  369. }

PackQuery類的構造方法,可以手動指定分詞器也可以使用索引的分詞器。個人建議,在項目中使用索引中的分詞器,這樣就不會因為分詞器的不同造成不知名的錯誤。

----------------------------------------------------------------------------------------------------

ps:最近發現其他網站可能會對博客轉載,上面并沒有源鏈接,如想查看更多關于 基于lucene的案例開發 請點擊這里。或訪問網址http://blog.csdn.net/xiaojimanman/article/category/2841877


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情视频网址| 欧美精品国产精品日韩精品| 国产成人av网| 国产精品盗摄久久久| 日韩av一区二区在线观看| 国产va免费精品高清在线| 亚洲福利视频网站| 久久久精品国产| 日韩欧美成人免费视频| 国产精品视频区| 国产精品伦子伦免费视频| 亚洲人a成www在线影院| xvideos国产精品| 日韩最新中文字幕电影免费看| 日韩电影中文字幕在线观看| 日韩人在线观看| 91精品国产91久久久| 国产精品69久久| 91久久精品国产91性色| 中文字幕一精品亚洲无线一区| 亚洲第一国产精品| 中文字幕日韩免费视频| 大量国产精品视频| 一区二区三区视频观看| 高潮白浆女日韩av免费看| 国外色69视频在线观看| 成人欧美一区二区三区黑人| 久久电影一区二区| 国产精品无av码在线观看| 亚洲黄色片网站| 久久成人亚洲精品| 久久91亚洲精品中文字幕奶水| 日本不卡视频在线播放| 亚洲免费福利视频| 亚洲精品自拍偷拍| 久久久久久999| 日韩在线中文字| 久久国产精品久久精品| 欧美精品做受xxx性少妇| 国产精品第3页| 久久天天躁狠狠躁夜夜爽蜜月| 欧美日本高清视频| 亚洲free性xxxx护士hd| 亚洲成在人线av| 亚洲精品有码在线| 欧美巨乳美女视频| 国产专区欧美专区| 国产日韩欧美在线| 日韩性xxxx爱| 91精品国产91久久久久福利| 欧美影院在线播放| 久久久久久久电影一区| 在线国产精品视频| 97精品视频在线观看| 国产97在线|日韩| 45www国产精品网站| 欧美大码xxxx| 精品香蕉一区二区三区| 亚洲国产成人91精品| 亚洲全黄一级网站| 久久夜精品va视频免费观看| www.亚洲男人天堂| 亚洲aⅴ日韩av电影在线观看| 欧洲亚洲女同hd| www.亚洲男人天堂| 日韩av色综合| 久久久国产精品免费| 高清欧美性猛交xxxx黑人猛交| 亚洲精品美女久久久久| 欧美成人免费观看| 久久亚洲精品网站| 日韩精品一区二区三区第95| 亚洲福利视频免费观看| 欧美视频在线免费| 日本高清久久天堂| 国产午夜精品一区二区三区| 日韩电影免费在线观看| 久久久亚洲网站| 91久久中文字幕| 欧美另类极品videosbest最新版本| 欧美日韩国产精品一区二区不卡中文| 国产日韩欧美在线观看| 91精品国产高清久久久久久91| 久久久国产一区二区| 国产91亚洲精品| 色综合天天狠天天透天天伊人| 国产精品视频最多的网站| 亚洲人成电影网站色…| 91国内精品久久| 日本久久久a级免费| 激情亚洲一区二区三区四区| 国产精品国产三级国产专播精品人| 日韩电影中文字幕| 国产91免费看片| 国产婷婷色综合av蜜臀av| 亚洲www永久成人夜色| 亚洲精品电影网站| 久久99精品国产99久久6尤物| 国产ts一区二区| 九色成人免费视频| 成人免费福利在线| 78m国产成人精品视频| 2019最新中文字幕| 久久久噜噜噜久久久| 亚洲精品福利在线| 中文字幕亚洲欧美日韩高清| 色爱av美腿丝袜综合粉嫩av| 中文字幕日韩综合av| 成人性生交大片免费观看嘿嘿视频| 欧美放荡办公室videos4k| 欧美成在线视频| 久久夜精品va视频免费观看| 国产精品免费福利| 国产精品高精视频免费| 91色在线视频| 国产精品扒开腿做爽爽爽视频| 欧美激情一区二区三区成人| 亚洲欧美日韩网| 日本韩国欧美精品大片卡二| 日韩av在线免费看| 国产suv精品一区二区三区88区| 亚洲欧美精品在线| 久久精品国产一区| 亚洲男人天堂手机在线| 日本久久久久久| 欧美在线激情网| 91精品国产高清自在线| 国产精品一区二区电影| 国产精品久久久久久久久久久新郎| 国产精品嫩草影院久久久| 欧美另类暴力丝袜| 福利一区视频在线观看| 亚洲人永久免费| 91精品国产自产91精品| 久久亚洲综合国产精品99麻豆精品福利| 欧美—级a级欧美特级ar全黄| 日韩一区二区av| 91视频国产一区| 在线播放精品一区二区三区| 久久综合伊人77777蜜臀| 韩国国内大量揄拍精品视频| 国产精品日韩一区| 成人欧美一区二区三区在线湿哒哒| 国产精品视频免费在线观看| 尤物99国产成人精品视频| 日韩av理论片| 亚洲精品电影网站| 亚洲爱爱爱爱爱| 国产精品日韩欧美综合| 日本精品一区二区三区在线播放视频| 国产在线高清精品| 欧美风情在线观看| 久久精品国产久精国产思思| 亚洲男子天堂网| 亚洲免费小视频| 国产免费久久av| 成人亚洲综合色就1024| 欧美刺激性大交免费视频| 欧美三级欧美成人高清www| 热re99久久精品国产66热| 国产啪精品视频网站| 欧美富婆性猛交| 97国产精品久久| 在线播放日韩专区|