摘要:之前做去轉(zhuǎn)盤網(wǎng)的時(shí)候,我已經(jīng)公開了非全文搜索的代碼,需要的朋友希望能夠前去閱讀我的博客。如果有什么疑問可以加群如果群滿了就麻煩去趟去轉(zhuǎn)盤找下最新的群加了即可,謝謝您的閱讀。
之前做去轉(zhuǎn)盤網(wǎng)的時(shí)候,我已經(jīng)公開了非全文搜索的代碼,需要的朋友希望能夠前去閱讀我的博客。本文主要討論如何進(jìn)行全文搜索,由于本人花了很長時(shí)間設(shè)計(jì)了新作:觀點(diǎn),觀點(diǎn)對全文搜索的要求還是很高的,所以我又花了不少時(shí)間研究全文搜索,你可以先體驗(yàn)下:點(diǎn)我搜索。廢話也不多說了,直接上代碼:
public MaparticleSearchAlgorithms(SearchCondition condition,IndexSearcher searcher) throws ParseException, IOException{ Map map =new HashMap (); String[] filedsList=condition.getFiledsList(); String keyWord=condition.getKeyWord(); int currentPage=condition.getCurrentPage(); int pageSize=condition.getPageSize(); String sortField=condition.getSortField(); boolean isASC=condition.isDESC(); String sDate=condition.getsDate(); String eDate=condition.geteDate(); String classify=condition.getClassify(); //過濾終結(jié)字符 keyWord=escapeExprSpecialWord(keyWord); BooleanQuery q1 = new BooleanQuery(); BooleanQuery q2 = new BooleanQuery(); BooleanQuery booleanQuery = new BooleanQuery(); //boolean查詢 if(classify!=null&&(classify.equals("guanzhi")||classify.equals("opinion")||classify.equals("write"))){ String typeId="1";//默認(rèn)言論 if(classify.equals("guanzhi")){ typeId="2"; } if(classify.equals("opinion")){ typeId="3"; } Query termQuery = new TermQuery(new Term("typeId",typeId)); q1.add(termQuery,BooleanClause.Occur.MUST); } if(sDate!=null&&eDate!=null){//是否范圍查詢由這兩個(gè)參數(shù)決定 Query rangeQuery = new TermRangeQuery("writingTime", new BytesRef(sDate), new BytesRef(eDate),true, true); q1.add(rangeQuery,BooleanClause.Occur.MUST); } Sort sort = new Sort(); // 排序 sort.setSort(SortField.FIELD_SCORE); if(sortField!=null){ sort.setSort(new SortField(sortField, SortField.Type.STRING, isASC)); } int start = (currentPage - 1) * pageSize; int hm = start + pageSize; TopFieldCollector res = TopFieldCollector.create(sort,hm,false, false, false, false); //完全匹配查詢 Term t0=new Term(filedsList[1],keyWord); TermQuery termQuery = new TermQuery(t0);//兩種高度匹配的查詢 q2.add(termQuery,BooleanClause.Occur.SHOULD); //前綴匹配 Term t1=new Term(filedsList[1],keyWord); PrefixQuery prefixQuery=new PrefixQuery(t1); q2.add(prefixQuery,BooleanClause.Occur.SHOULD); //短語,相似度匹配,適用于分詞的內(nèi)容 for(int i=0;i 0){ booleanQuery.add(q1,BooleanClause.Occur.MUST); } if(q2!=null && q2.toString().length()>0){ booleanQuery.add(q2,BooleanClause.Occur.MUST); } searcher.search(booleanQuery, res); long amount = res.getTotalHits(); TopDocs tds = res.topDocs(start, pageSize); map.put("amount",amount); map.put("tds",tds); map.put("query",booleanQuery); return map; }
注意下:上面代碼的搜索條件(SearchCondition )是觀點(diǎn)網(wǎng)的具體需求,您可以按照您自己的搜索條件做改動(dòng),這里也很難適配所有讀者。
public MapsearchArticle(SearchCondition condition) throws Exception{ Map map =new HashMap (); List list=new ArrayList (); DirectoryReader reader=condition.getReader(); String URL=condition.getURL(); boolean isHighligth=condition.isHighlight(); String keyWord=condition.getKeyWord(); IndexSearcher searcher=getSearcher(reader,URL); try{ Map output=articleSearchAlgorithms(condition,searcher); if(output==null){ map.put("amount",0L); map.put("source",null); return map; } map.put("amount", output.get("amount")); TopDocs tds = (TopDocs) output.get("tds"); ScoreDoc[] sd = tds.scoreDocs; Query query =(Query) output.get("query"); for (int i = 0; i < sd.length; i++) { Document doc = searcher.doc(sd[i].doc); String id = doc.get("id"); /**********************start*************************需要處理的放一塊兒********************/ String temp=doc.get("title"); String title =temp; //默認(rèn)不高亮 if(isHighligth){ //高亮文章標(biāo)題 Highlighter highlighterTitle = new Highlighter(simpleHTMLFormatter, new QueryScorer(query)); highlighterTitle.setTextFragmenter(new SimpleFragmenter(40)); // 字長度 TokenStream ts = analyzer.tokenStream("title", new StringReader(temp)); title= highlighterTitle.getBestFragment(ts,temp); if(title==null){ title=temp.replace(keyWord,""+keyWord+"");//高亮處理插件bug,加這句話避免 } } String temp1=HtmlEnDecode.htmlEncode(doc.get("content")); String content=temp1;//使用自己封裝的方法來轉(zhuǎn)義 if(isHighligth){ //做高亮處理,content Highlighter highlighterContent = new Highlighter(simpleHTMLFormatter, new QueryScorer(query)); highlighterContent.setTextFragmenter(new SimpleFragmenter(Constant.HIGHLIGHT_CONTENT_LENGTH)); // 字長度 //temp1=StringEscapeUtils.escapeHtml(temp1);//將漢字轉(zhuǎn)義導(dǎo)致高亮失效 TokenStream ts1 = analyzer.tokenStream("content", new StringReader(temp1)); content = highlighterContent.getBestFragment(ts1,temp1); if(content==null){ content=temp1.replace(keyWord,""+keyWord+"");//高亮處理插件bug,加這句話避免 //假設(shè)遇上這種情況做處理,其他的高亮器會自動(dòng)截圖 content=subContent(content);//截取處理 content=HtmlEnDecode.htmldecode(content);//html解碼 content=SubStringHTML.sub(content,Constant.HIGHLIGHT_CONTENT_LENGTH); } } /*---------------------------------------不斷變動(dòng)的數(shù)據(jù)放一塊兒----------------------------*/ Write write=writeDao.getArticle(Long.parseLong(id)); if(write!=null){ write.setTitle(title); write.setContent(content); Date writingTime=write.getWritingTime(); String timeGap=DateUtil.dateGap(writingTime);//timeGap write.setTimeGap(timeGap); list.add(write); } } }catch(Exception e){ e.printStackTrace(); } map.put("source",list); return map; }
注意上面,這是具體的搜索代碼,不同的應(yīng)用場景有不同的需求,請您按照自己的需求封裝對象,查詢數(shù)據(jù)庫等,代碼毫無保留,絕對可用。
如果有什么疑問可以加qq群:284205104 如果群滿了就麻煩去趟去轉(zhuǎn)盤找下最新的群加了即可,謝謝您的閱讀。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70851.html
摘要:倒排索引是基于詞的搜索。關(guān)于倒排索引要學(xué)習(xí)搜索引擎,就需要了解倒排索引,要更加深刻地理解倒排索引,就要先了解什么是正排索引表。由于不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引。 Lucene是什么? Lucene是apache軟件基金會4 jakarta項(xiàng)目組的一個(gè)子項(xiàng)目,是一個(gè)開放源代碼的全文檢索引擎工具包,但它不是一個(gè)完整的全文檢索引擎,而是一個(gè)全文檢索引...
摘要:就其本身而言,是當(dāng)前以及最近幾年最受歡迎的免費(fèi)信息檢索程序庫。這樣完全和數(shù)據(jù)庫進(jìn)行了隔離。當(dāng)一個(gè)文檔出現(xiàn)在了搜索結(jié)果中,這就意味著該文檔與用戶給定的查詢語句是相匹配的。 showImg(https://segmentfault.com/img/bVbuifx?w=258&h=258);公眾號閱讀https://mp.weixin.qq.com/s/M3... Lucene [TOC] ...
閱讀 2541·2021-10-09 09:44
閱讀 644·2019-08-30 15:44
閱讀 3004·2019-08-29 18:46
閱讀 1139·2019-08-29 18:38
閱讀 563·2019-08-26 10:44
閱讀 2436·2019-08-23 16:07
閱讀 1098·2019-08-23 15:38
閱讀 4104·2019-08-23 14:02