lucene入门(二)

上篇文章给出了如何创建索引的例子,在这里我将介绍全文检索的第二大部分:索引的搜索操作。

索引搜索其实也就是一个先读索引然后在查索引的操作,理解了会很快的使用了,个人认为要多实践。

直接上代码了(这是我个人写的一个小demo,后面会给出源码):

	private static Directory getDirectory() throws IOException{
		return FSDirectory.open(Paths.get(SysConstant.LUCENE_INDEX_DIR));
	}
	
	private static DirectoryReader getDirectoryReader() throws IOException{
		return DirectoryReader.open(getDirectory());
	}
	
	private static IndexSearcher getSercher() throws IOException{
		return new IndexSearcher(getDirectoryReader());
	}
	/**
     * @Title: serch  
     * @Description: 普通的索引搜索方法
     * @param @param type:搜索类型
     * @param @param key:搜索关键词
     * @param @throws ParseException
     * @param @throws IOException
     * @param @throws ClassNotFoundException
     * @param @throws InstantiationException
     * @param @throws IllegalAccessException    参数  
     * @return List<Map<String,Object>>    返回类型  
     * @throws
	 */
	public static List<Map<String,Object>> serch(String type,String key) throws ParseException, IOException, ClassNotFoundException, InstantiationException, IllegalAccessException{
		List<Map<String,Object>> objs = new ArrayList<Map<String,Object>>();
		QueryParser parser = new QueryParser(type, new StandardAnalyzer());
		Query query = parser.parse(key);
		TopDocs results = getSercher().search(query, 10 * 600);
	    ScoreDoc[] hits = results.scoreDocs;
	    for(ScoreDoc hit : hits){
	    	Document doc = getSercher().doc(hit.doc);
	    	objs.add(LuceneDocToBean.DocToBean(doc,new TxtTable()));
	    }
	    return objs;
	}
	/**
     * @Title: searchHigher  
     * @Description: 高亮搜索方法
     * @param @param type:搜索类型
     * @param @param key:搜索关键词
     * @param @throws ParseException
     * @param @throws IOException
     * @param @throws InvalidTokenOffsetsException
     * @param @throws ClassNotFoundException
     * @param @throws InstantiationException
     * @param @throws IllegalAccessException    参数  
     * @return List<HigerSerchBean>    返回类型  
     * @throws
	 */
	 public static List<HigerSerchBean> searchHigher(String type, String key) throws ParseException, IOException, InvalidTokenOffsetsException, ClassNotFoundException, InstantiationException, IllegalAccessException {
	 	List<HigerSerchBean> list = new ArrayList<HigerSerchBean>();
	 	SmartChineseAnalyzer analyzer=new SmartChineseAnalyzer();
        QueryParser parser=new QueryParser(type,analyzer);
        Query query=parser.parse(key);
        
        TopDocs hits=getSercher().search(query, 10 * 600);
        QueryScorer scorer=new QueryScorer(query);
        Fragmenter fragmenter=new SimpleSpanFragmenter(scorer);
        SimpleHTMLFormatter simpleHTMLFormatter=new SimpleHTMLFormatter("<b><font color='red'>","</font></b>");
        Highlighter highlighter=new Highlighter(simpleHTMLFormatter, scorer);
        highlighter.setTextFragmenter(fragmenter);
        for(ScoreDoc scoreDoc:hits.scoreDocs){
        	HigerSerchBean bean = new HigerSerchBean();
            Document doc=getSercher().doc(scoreDoc.doc);
            String value = doc.get(type);
            String higer = "";
            if(value!=null){
                higer = highlighter.getBestFragment(new StandardAnalyzer(), type, value);
            }
            bean.setHigherSerchHtml(higer);
            bean.setMap(LuceneDocToBean.DocToBean(doc, new TxtTable()));
            list.add(bean);
        }
        return list;
    }
	 /**
      * @Title: wildcardQuery  
      * @Description: 通配符搜索
      * @param @param key:搜索关键词
      * @param @param type:搜索类型
      * @param @param pagenow
      * @param @param pageSize
      * @param @return
      * @param @throws Exception    参数  
      * @return List<Map<String,Object>>    返回类型  
      * @throws
	  */
	public static PageBean<Map<String,Object>> wildcardQuery(String key, String type, Integer pagenow, Integer pageSize)throws Exception{
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		Term t=new Term(type,key);
		Query query=new WildcardQuery(t);
		int total = (int)getSercher().search(query, SysConstant.LUCENE_PAGESIZE_ALL).totalHits;
		if(1 == pagenow){			
			TopDocs hits0=getSercher().search(query, pageSize);
			for(ScoreDoc scoreDoc:hits0.scoreDocs){
				Document doc=getSercher().doc(scoreDoc.doc);
				list.add(LuceneDocToBean.DocToBean(doc, new TxtTable()));
			}
		}else if(pagenow > 1){			
			TopDocs hits0=getSercher().search(query, pageSize*(pagenow-1));
			TopDocs hits1=getSercher().searchAfter(hits0.scoreDocs[hits0.scoreDocs.length-1], query, 10);
			for(ScoreDoc scoreDoc:hits1.scoreDocs){
				Document doc=getSercher().doc(scoreDoc.doc);
				list.add(LuceneDocToBean.DocToBean(doc, new TxtTable()));
			}
		}
		PageBean<Map<String,Object>> pageinfo = new PageBean<Map<String,Object>>(pagenow, pageSize, list ,total);
		return pageinfo;
	}

 注意的是,我这里的代码仅仅是为了提供参考的,其中有很多的是我自己封装的方法,主要是需要了解搜索索引的过程最重要,代码我会在后续给出。

posted @ 2018-05-31 15:09  古巷青砖  阅读(161)  评论(0编辑  收藏  举报