Lucene开源全文检索引擎快速入门

版权声明:技术交流群:758191639 作者支付宝18696232390喜欢的可以打钱! https://blog.csdn.net/u014131617/article/details/86135589

Lucene是一个用Java开发的开源全文检索引擎,官网是:http://lucene.apache.org/ ,Lucene不是一个完整的全文索引应用(与之对应的是solr),而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能,更多介绍大家自行搜索。

下载

在这里插入图片描述

也就是这几个:
在这里插入图片描述

其中IKAnalyzer2012_FF.jar是一个国人写的中文分词工具,Lucene自带的分词对中文支持不好。注意,这个jar包网上比较乱,随便从网上下载的话可能不兼容,因为跟具体的Lucene版本有关,初学者建议直接用我demo里面整理好的jar包:https://github.com/liuxianan/lucene-demo/tree/master/WebContent/WEB-INF/lib

工具类

package com.test.util;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;


/**
 * 文件操作工具类
 * 
 */
public class FileUtil
{
	private static Logger2 log = LoggerFactory2.getLogger(FileUtil.class);

	/**
	 * 获取文件的后缀,包括前面的点,如“.jpg”,并自动转小写
	 * @param path
	 * @return
	 */
	public static String getExt(String path)
	{
		int idx = path.lastIndexOf(".");
		if (idx < 0)
			return "";
		return path.substring(idx).toLowerCase();
	}

	/**
	 * 递归删除文件或文件夹
	 * @param file
	 * @return 返回是否删除成功,如果文件本身不存在,也返回true
	 */
	public static boolean delete(File file)
	{
		boolean flag = true;// 如果文件本来就不存在那么默认就是true
		if (file.isFile())
			flag &= file.delete();
		else if (file.isDirectory())
		{
			for (File f : file.listFiles())
				flag &= delete(f);
			flag &= file.delete();
		}
		return flag;
	}

	/**
	 * 复制单个文件
	 * @param src 待复制的文件名
	 * @param dest 目标文件名
	 * @param override 如果目标文件存在,是否覆盖
	 * @return 如果复制成功返回true,否则返回false
	 */
	public static boolean copy(String src, String dest, boolean override)
	{
		File srcFile = new File(src);
		if (!srcFile.exists()) // 判断源文件是否存在
		{
			log.error("源文件不存在:{}", src);
			return false;
		}
		else if (!srcFile.isFile())
		{
			log.error("源文件不是一个文件:{}", src);
			return false;
		}
		File destFile = new File(dest); // 判断目标文件是否存在
		if (destFile.exists())
		{
			if (override) // 如果目标文件存在并允许覆盖
				destFile.delete();// 删除已经存在的目标文件,无论目标文件是目录还是单个文件
			else
			{
				log.error("已存在同名文件且不允许覆盖:{}", dest);
				return false;
			}
		}
		else
		{
			if (!destFile.getParentFile().exists()) // 如果目标文件所在目录不存在,则创建目录
			{
				if (!destFile.getParentFile().mkdirs())
				{
					log.error("输出文件夹不存在且自动创建失败:{}", dest);
					return false;// 复制文件失败:创建目标文件所在目录失败
				}
			}
		}
		// 复制文件
		int byteread = 0; // 读取的字节数
		InputStream in = null;
		OutputStream out = null;
		try
		{
			in = new FileInputStream(srcFile);
			out = new FileOutputStream(destFile);
			byte[] buffer = new byte[1024];
			while ((byteread = in.read(buffer)) != -1)
				out.write(buffer, 0, byteread);
			return true;
		}
		catch (Exception e)
		{
			log.error("复制文件失败:", e);
			return false;
		}
		finally
		{
			try
			{
				if (out != null)
					out.close();
				if (in != null)
					in.close();
			}
			catch (Exception e)
			{
				log.error("尝试关闭流时失败:", e);
				e.printStackTrace();
			}
		}
	}

	/**
	 * 复制单个文件,存在则覆盖
	 * @param src
	 * @param dest
	 * @return
	 */
	public static boolean copy(String src, String dest)
	{
		return copy(src, dest, true);
	}

	/**
	 * 剪切文件
	 * @param src
	 * @param dest
	 * @return
	 */
	public static boolean cut(String src, String dest)
	{
		return new File(src).renameTo(new File(dest));
	}

	/**
	 * 重命名文件
	 * @param src
	 * @param newName
	 * @return
	 */
	public static boolean rename(File src, String newName)
	{
		return src.renameTo(new File(src.getParent() + "\\" + newName));
	}

	/**
	 * 重命名文件
	 * @param src
	 * @param newName
	 * @return
	 */
	public static boolean rename(String src, String newName)
	{
		File file = new File(src);
		return rename(file, newName);
	}

	/**
	 * 从文件中读取内容
	 * @param filePath
	 * @return
	 */
	public static String readFile(String filePath, String encoding)
	{
		log.debug("开始读取文件:{}", filePath);
		try
		{
			FileInputStream fis = new FileInputStream(filePath);
			BufferedReader br = new BufferedReader(new InputStreamReader(fis, encoding));
			String s = "";
			StringBuffer sb = new StringBuffer();
			while ((s = br.readLine()) != null)
				sb.append(s+"\n");
			br.close();
			return sb.toString();
		}
		catch (Exception e)
		{
			log.error("读取文件失败:", e);
			return null;
		}
	}

	/**
	 * 以默认的utf-8编码读取文件
	 * @param filePath
	 * @return
	 */
	public static String readFile(String filePath)
	{
		return readFile(filePath, "utf-8");
	}

	/**
	 * 写入文件
	 * @param filePath
	 * @param text
	 * @param encoding
	 * @return
	 */
	public static boolean writeFile(String filePath, String text, String encoding)
	{
		try
		{
			FileOutputStream fos = new FileOutputStream(filePath);
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, encoding));
			bw.append(text);
			bw.close();
			return true;
		}
		catch (Exception e)
		{
			log.error("写入文件失败:", e);
			return false;
		}
	}

	/**
	 * 写入文件,默认utf-8编码
	 * @param filePath
	 * @param text
	 * @return
	 */
	public static boolean writeFile(String filePath, String text)
	{
		return writeFile(filePath, text, "utf-8");
	}
	
	/**
	 * 遍历执行者
	 * @author LXA
	 */
	public interface TraverseExecuter
	{
		/**
		 * 遍历某个文件夹时需要内部需要执行的方法
		 * @param filePath 文件路径
		 * @param fileName 文件名
		 */
		public void execute(String filePath, String fileName);
	}
	
	/**
	 * 遍历某个文件夹执行一段操作
	 * @param filePath 文件夹路径
	 * @param fileNameFilter 筛选器,为null时不筛选
	 * @param executer 需要调用的方法
	 */
	public static void traverse(String filePath, FilenameFilter fileNameFilter, TraverseExecuter executer)
	{
		try
		{
			File root = new File(filePath);
			for(File file : root.listFiles(fileNameFilter))
			{
				String path = file.getAbsolutePath();
				if(file.isFile())
					executer.execute(path, file.getName());
				else if(file.isDirectory())
					traverse(path, fileNameFilter, executer);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	
	/**
	 * 列出某个路径下的所有文件,包括子文件夹,如果本身就是文件,那么返回自身
	 * @param filePath 需要遍历的文件路径
	 * @param fileNameFilter 文件名过滤器
	 * @return 文件集合
	 */
	public static List<File> listAllFiles(String filePath, FilenameFilter fileNameFilter)
	{
		List<File> files= new ArrayList<File>();
		try
		{
			File root = new File(filePath);
			if(!root.exists()) return files;
			if(root.isFile()) files.add(root);
			else
			{
				for(File file : root.listFiles(fileNameFilter))
				{
					if(file.isFile()) files.add(file);
					else if(file.isDirectory())
					{
						files.addAll(listAllFiles(file.getAbsolutePath(), fileNameFilter));
					}
				}
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		return files;
	}
	
	/**
	 * 列出某个路径下的所有文件,包括子文件夹,如果本身就是文件,那么返回自身
	 * @param filePath 需要遍历的文件路径
	 * @return 文件集合
	 */
	public static List<File> listAllFiles(String filePath)
	{
		return listAllFiles(filePath, null);
	}
	
	/**
	 * 遍历某个文件夹执行一段操作
	 * @param filePath 文件夹路径
	 * @param executer 需要调用的方法
	 */
	public static void traverse(String filePath, TraverseExecuter executer)
	{
		traverse(filePath, null, executer);
	}
	
	/**
	 * 遍历某个路径,删除其中的空文件夹
	 * @param filePath
	 */
	public static void deleteEmptyFolder(File file)
	{
		File[] files = file.listFiles();
		if(files == null || files.length == 0)
		{
			delete(file);
			log.info("以下文件夹为空,已删除:"+file.getAbsolutePath());
		}
		for(File f : files)
		{
			if(f.isDirectory())
				deleteEmptyFolder(f);
		}
	}
	
	/**
	 * 遍历某个路径,删除其中的空文件夹
	 * @param filePath
	 */
	public static void deleteEmptyFolder(String filePath)
	{
		deleteEmptyFolder(new File(filePath));
	}

	/**
	 * 从一个输入流写入到输出流
	 * @param is 输入流
	 * @param os 输出流
	 * @param closeInput 是否关闭输入流
	 * @param closeOutput 是否关闭输出流
	 * @throws IOException
	 */
	public static void writeIO(InputStream is, OutputStream os, Boolean closeInput, Boolean closeOutput) throws IOException
	{
		byte[] buf = new byte[1024];
		int len = -1;
		while ((len = is.read(buf)) != -1)
			os.write(buf, 0, len);
		if(closeInput)
		{
			if(is != null )
				is.close();
		}
		if(closeOutput)
		{
			if( os != null )
			{
				os.flush();
				os.close();
			}
		}
	}
	
	/**
	 * 从一个输入流写入到输出流
	 * @param is 输入流
	 * @param os 输出流
	 * @throws IOException
	 */
	public static void writeIO(InputStream is, OutputStream os) throws IOException
	{
		writeIO(is, os, false, false);
	}
	
	public static void exportHtmlTest(String filePath,String text) throws IOException
	{
		FileOutputStream fos = new FileOutputStream(filePath);
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"));
		
		

		bw.append("<!DOCTYPE html><html><head><title>Title of the document</title></head><body>");
		
		
		bw.append(text);
		
		bw.append("</body></html>");
		
		bw.close();
	}
	

}


/**
 * 为了避免过多jar包引用以及某些不需要日记记录的场合,内部写一个最简单的log工具类<br>
 * 如果复制到其他地方的时候不想带着几个log4j的jar包,可以放开本段注释<br>
 * 然后把头部的Logger和LoggerFactory都加上一个2<br>
 * 注意同一包下Logger2和LoggerFactory2不能重复<br>
 * @author LXA
 */
class Logger2
{
	public void debug(String info, Object... args)
	{
		for(int i=0; i<args.length; i++) 
			info = info.replaceFirst("\\{\\}", args[i].toString());
		System.out.println(info);
	}
	
	public void error(String info, Throwable throwable)
	{
		System.err.println(info);
		throwable.printStackTrace();
	}
	public void error(String info, String aaa)
	{
		System.err.println(info);
	}
	public void error(String info)
	{
		System.err.println(info);
	}
	public void info(String info)
	{
		System.out.println(info);
	}
}
class LoggerFactory2
{
	public static <T> Logger2 getLogger(Class<T> cls)
	{
		return new Logger2();
	}
}

demo

package com.test;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.search.highlight.SimpleSpanFragmenter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer;

import com.test.util.FileUtil;

/**
 * 基于Lucene5.5.4的文件搜索demo
 */
public class FileSearchDemo
{
	public static final String INDEX_PATH = "D:\\lucene"; // 存放Lucene索引文件的位置
	public static final String SCAN_PATH = "D:\\text"; // 需要被扫描的位置,测试的时候记得多在这下面放一些文件
	public static List<String> text_list = new ArrayList<>();
	
	/**
	 * 创建索引
	 */
	public void creatIndex()
	{
		IndexWriter indexWriter = null;
		try
		{
			Directory directory = FSDirectory.open(FileSystems.getDefault().getPath(INDEX_PATH));
			//Analyzer analyzer = new StandardAnalyzer();
			Analyzer analyzer = new IKAnalyzer(true);
			IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
			indexWriter = new IndexWriter(directory, indexWriterConfig);
			indexWriter.deleteAll();// 清除以前的index
			// 获取被扫描目录下的所有文件,包括子目录
			List<File> files = FileUtil.listAllFiles(SCAN_PATH);
			for(int i=0; i<files.size(); i++)
			{
				Document document = new Document();
				File file = files.get(i);
				document.add(new Field("content", FileUtil.readFile(file.getAbsolutePath()), TextField.TYPE_STORED));
				document.add(new Field("fileName", file.getName(), TextField.TYPE_STORED));
				document.add(new Field("filePath", file.getAbsolutePath(), TextField.TYPE_STORED));
				document.add(new Field("updateTime", file.lastModified()+"", TextField.TYPE_STORED));
				indexWriter.addDocument(document);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				if(indexWriter != null) indexWriter.close();
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 搜索
	 */
	public void search(String keyWord)
	{
		DirectoryReader directoryReader = null;
		try
		{
			// 1、创建Directory
			Directory directory = FSDirectory.open(FileSystems.getDefault().getPath(INDEX_PATH));
			// 2、创建IndexReader
			directoryReader = DirectoryReader.open(directory);
			// 3、根据IndexReader创建IndexSearch
			IndexSearcher indexSearcher = new IndexSearcher(directoryReader);
			// 4、创建搜索的Query
			// Analyzer analyzer = new StandardAnalyzer();
			Analyzer analyzer = new IKAnalyzer(true); // 使用IK分词
			
			// 简单的查询,创建Query表示搜索域为content包含keyWord的文档
			//Query query = new QueryParser("content", analyzer).parse(keyWord);
			
			String[] fields = {"fileName", "content"}; // 要搜索的字段,一般搜索时都不会只搜索一个字段
			// 字段之间的与或非关系,MUST表示and,MUST_NOT表示not,SHOULD表示or,有几个fields就必须有几个clauses
			BooleanClause.Occur[] clauses = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};
			// MultiFieldQueryParser表示多个域解析, 同时可以解析含空格的字符串,如果我们搜索"上海 中国" 
			Query multiFieldQuery = MultiFieldQueryParser.parse(keyWord, fields, clauses, analyzer);
			
			// 5、根据searcher搜索并且返回TopDocs
			TopDocs topDocs = indexSearcher.search(multiFieldQuery, 100); // 搜索前100条结果
			System.out.println("共找到匹配处:" + topDocs.totalHits); // totalHits和scoreDocs.length的区别还没搞明白
			text_list.add(String.valueOf("共找到匹配处:" + topDocs.totalHits));
			// 6、根据TopDocs获取ScoreDoc对象
			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
			System.out.println("共找到匹配文档数:" + scoreDocs.length);
			text_list.add(String.valueOf("共找到匹配文档数:" + scoreDocs.length));
			QueryScorer scorer = new QueryScorer(multiFieldQuery, "content");
			// 自定义高亮代码
			SimpleHTMLFormatter htmlFormatter = new SimpleHTMLFormatter("<H1 style=\"backgroud:red\">", "</H1>");
			Highlighter highlighter = new Highlighter(htmlFormatter, scorer);
			highlighter.setTextFragmenter(new SimpleSpanFragmenter(scorer));
			for (ScoreDoc scoreDoc : scoreDocs)
			{
				// 7、根据searcher和ScoreDoc对象获取具体的Document对象
				Document document = indexSearcher.doc(scoreDoc.doc);
				//TokenStream tokenStream = new SimpleAnalyzer().tokenStream("content", new StringReader(content));
				//TokenSources.getTokenStream("content", tvFields, content, analyzer, 100);
				//TokenStream tokenStream = TokenSources.getAnyTokenStream(indexSearcher.getIndexReader(), scoreDoc.doc, "content", document, analyzer);
				//System.out.println(highlighter.getBestFragment(tokenStream, content));
				System.out.println("-----------------------------------------");
				System.out.println(document.get("fileName") + ":" + document.get("filePath"));
				text_list.add(document.get("fileName") + ":" + document.get("filePath"));
				System.out.println(highlighter.getBestFragment(analyzer, "content", document.get("content")));
				text_list.add(highlighter.getBestFragment(analyzer, "content", document.get("content")));
				System.out.println("");
				text_list.add("----");
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				if(directoryReader != null) directoryReader.close();
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}

	public static void main(String args[])
	{
		while(true) {
		FileSearchDemo demo = new FileSearchDemo();
		demo.creatIndex();
		Scanner input = new Scanner(System.in);
		System.out.println("请输入你要搜索的数据");
		demo.search(input.nextLine());
		String value = "";
		for(int i = 0; i<text_list.size();i++) {
			value += text_list.get(i);
		}
		
		
		try {
			FileUtil.exportHtmlTest("D://test.html",value.toString() );
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	}
}

准备一个文本

在这里插入图片描述

第一编 总则
第一章 刑法的任务、基本原则和适用范围
第一条 立法宗旨
为了惩罚犯罪,保护人民,根据宪法,结合我国同犯罪作斗争的具体 经验及实际情况,制定本法。
第二条 本法任务
中华人民共和国刑法的任务,是用刑罚同一切犯罪行为作斗争,以保卫国家安全,保卫人民民主专政的政权和社会主义制度,保护国有财产和劳动群众集体所有的财产,保护公民私人所有的财产,保护公民的人身权利、民主权利和其他权利,维护社会秩序、经济秩序,保障社会主义建设事业的顺利进行。
第三条 罪刑法定
法律明文规定为犯罪行为的,依照法律定罪处刑;法律没有明文规定为犯罪行为的,不得定罪处刑。
第四条 适用刑法人人平等
对任何人犯罪,在适用法律上一律平等。不允许任何人有超越法律的特权。
第五条 罪责刑相适应
刑罚的轻重,应当与犯罪分子所犯罪行和承担的刑事责任相适应。
第六条 属地管辖权
凡在中华人民共和国领域内犯罪的,除法律有特别规定的以外,都适用本法。 凡在中华人民共和国船舶或者航空器内犯罪的,也适用本法。 犯罪的行为或者结果有一项发生在中华人民共和国领域内的,就认为是在中华人民共和国领域内犯罪。
第七条 属人管辖权
中华人民共和国公民在中华人民共和国领域外犯本法规定之罪的,适用本法,但是按本法规定的最高刑为三年以下有期徒刑的,可以不予追究。 中华人民共和国国家工作人员和军人在中华人民共和国领域外犯本法规定之罪的,适用本法。
第八条 保护管辖权
外国人在中华人民共和国领域外对中华人民共和国国家或者公民犯罪,而按本法规定的最低刑为三年以上有期徒刑的,可以适用本法,但是按照犯罪地的法律不受处罚的除外。
第九条 普遍管辖权
对于中华人民共和国缔结或者参加的国际条约所规定的罪行,中华人民共和国在所承担条约义务的范围内行使刑事管辖权的,适用本法。
第十条 对外国刑事判决的消极承认
凡在中华人民共和国领域外犯罪,依照本法应当负刑事责任的,虽然经过外国审判,仍然可以依照本法追究,但是在外国已经受过刑罚处罚的,可以免除或者减轻处罚。
第十一条 外交代表刑事管辖豁免
享有外交特权和豁免权的外国人的刑事责任,通过外交途径解决。
第十二条 刑法溯及力
中华人民共和国成立以后本法施行以前的行为,如果当时的法律不认为是犯罪的,适用当时的法律;如果当时的法律认为是犯罪的,依照本法总则第四章第八节的规定应当追诉的,按照当时的法律追究刑事责任,但是如果本法不认为是犯罪或者处刑较轻的,适用本法。 本法施行以前,依照当时的法律已经作出的生效判决,继续有效。
第二章 犯罪
第十三条 犯罪概念
一切危害国家主权、领土完整和安全,分裂国家、颠覆人民民主专政的政权和推翻社会主义制度,破坏社会秩序和经济秩序,侵犯国有财产或者劳动群众集体所有的财产,侵犯公民私人所有的财产,侵犯公民的人身权利、民主权利和其他权利,以及其他危害社会的行为,依照法律应当受刑罚处罚的,都是犯罪,但是情节显著轻微危害不大的,不认为是犯罪。
第十四条 故意犯罪
明知自己的行为会发生危害社会的结果,并且希望或者放任这种结果发生,因而构成犯罪的,是故意犯罪。 故意犯罪,应当负刑事责任。
第十五条 过失犯罪
应当预见自己的行为可能发生危害社会的结果,因为疏忽大意而没有预见,或者已经预见而轻信能够避免,以致发生这种结果的,是过失犯罪。 过失犯罪,法律有规定的才负刑事责任。
第十六条 不可抗力和意外事件
行为在客观上虽然造成了损害结果,但是不是出于故意或者过失,而是由于不能抗拒或者不能预见的原因所引起的,不是犯罪。
第十七条 刑事责任年龄
已满十六周岁的人犯罪,应当负刑事责任。 已满十四周岁不满十六周岁的人,犯故意杀人、故意伤害致人重伤或者死亡、强奸、抢劫、贩卖毒品、放火、爆炸、投放危险物质罪的,应当负刑事责任。 已满十四周岁不满十八周岁的人犯罪,应当从轻或者减轻处罚。 因不满十六周岁不予刑事处罚的,责令他的家长或者监护人加以管教;在必要的时候,也可以由政府收容教养。 第十七条之一 已满七十五周岁的人故意犯罪的,可以从轻或者减轻处罚;过失犯罪的,应当从轻或者减轻处罚。
第十八条 特殊人员的刑事责任能力
精神病人在不能辨认或者不能控制自己行为的时候造成危害结果,经法定程序鉴定确认的,不负刑事责任,但是应当责令他的家属或者监护人严加看管和医疗;在必要的时候,由政府强制医疗。 间歇性的精神病人在精神正常的时候犯罪,应当负刑事责任。 尚未完全丧失辨认或者控制自己行为能力的精神病人犯罪的,应当负刑事责任,但是可以从轻或者减轻处罚。 醉酒的人犯罪,应当负刑事责任。
第十九条 又聋又哑的人或盲人犯罪的刑事责任
又聋又哑的人或者盲人犯罪,可以从轻、减轻或者免除处罚。
第二十条 正当防卫
为了使国家、公共利益、本人或者他人的人身、财产和其他权利免受正在进行的不法侵害,而采取的制止不法侵害的行为,对不法侵害人造成损害的,属于正当防卫,不负刑事责任。 正当防卫明显超过必要限度造成重大损害的,应当负刑事责任,但是应当减轻或者免除处罚。 对正在进行行凶、杀人、抢劫、强奸、绑架以及其他严重危及人身安全的暴力犯罪,采取防卫行为,造成不法侵害人伤亡的,不属于防卫过当,不负刑事责任。
第二十一条 紧急避险
为了使国家、公共利益、本人或者他人的人身、财产和其他权利免受正在发生的危险,不得已采取的紧急避险行为,造成损害的,不负刑事责任。 紧急避险超过必要限度造成不应有的损害的,应当负刑事责任,但是应当减轻或者免除处罚。 第一款中关于避免本人危险的规定,不适用于职务上、业务上负有特定责任的人。
第二十二条 犯罪预备
为了犯罪,准备工具、制造条件的,是犯罪预备。 对于预备犯,可以比照既遂犯从轻、减轻处罚或者免除处罚。
第二十三条 犯罪未遂
已经着手实行犯罪,由于犯罪分子意志以外的原因而未得逞的,是犯罪未遂。 对于未遂犯,可以比照既遂犯从轻或者减轻处罚。
第二十四条 犯罪中止
在犯罪过程中,自动放弃犯罪或者自动有效地防止犯罪结果发生的,是犯罪中止。 对于中止犯,没有造成损害的,应当免除处罚;造成损害的,应当减轻处罚。
第二十五条 共同犯罪的概念
共同犯罪是指二人以上共同故意犯罪。 二人以上共同过失犯罪,不以共同犯罪论处;应当负刑事责任的,按照他们所犯的罪分别处罚。
第二十六条 主犯
组织、领导犯罪集团进行犯罪活动的或者在共同犯罪中起主要作用的,是主犯。 三人以上为共同实施犯罪而组成的较为固定的犯罪组织,是犯罪集团。 对组织、领导犯罪集团的首要分子,按照集团所犯的全部罪行处罚。 对于第三款规定以外的主犯,应当按照其所参与的或者组织、指挥的全部犯罪处罚。
第二十七条 从犯
在共同犯罪中起次要或者辅助作用的,是从犯。 对于从犯,应当从轻、减轻处罚或者免除处罚。
第二十八条 胁从犯
对于被胁迫参加犯罪的,应当按照他的犯罪情节减轻处罚或者免除处罚。
第二十九条 教唆犯
教唆他人犯罪的,应当按照他在共同犯罪中所起的作用处罚。教唆不满十八周岁的人犯罪的,应当从重处罚。 如果被教唆的人没有犯被教唆的罪,对于教唆犯,可以从轻或者减轻处罚。
第三十条 单位负刑事责任的范围
公司、企业、事业单位、机关、团体实施的危害社会的行为,法律规定为单位犯罪的,应当负刑事责任。
第三十一条 单位犯罪的处罚原则
单位犯罪的,对单位判处罚金,并对其直接负责的主管人员和其他直接责任人员判处刑罚。本法分则和其他法律另有规定的,依照规定。
第三章 刑罚
第三十二条 主刑和附加刑
刑罚分为主刑和附加刑。
第三十三条 主刑种类
主刑的种类如下: (一)管制; (二)拘役; (三)有期徒刑; (四)无期徒刑; (五)死刑。
第三十四条 附加刑种类
附加刑的种类如下: (一)罚金; (二)剥夺政治权利; (三)没收财产。 附加刑也可以独立适用。
第三十五条 驱逐出境
对于犯罪的外国人,可以独立适用或者附加适用驱逐出境。
第三十六条 赔偿经济损失与民事优先原则
由于犯罪行为而使被害人遭受经济损失的,对犯罪分子除依法给予刑事处罚外,并应根据情况判处赔偿经济损失。 承担民事赔偿责任的犯罪分子,同时被判处罚金,其财产不足以全部支付的,或者被判处没收财产的,应当先承担对被害人的民事赔偿责任。
第三十七条 非刑罚性处置措施
对于犯罪情节轻微不需要判处刑罚的,可以免予刑事处罚,但是可以根据案件的不同情况,予以训诫或者责令具结悔过、赔礼道歉、赔偿损失,或者由主管部门予以行政处罚或者行政处分。 第三十七条之一 因利用职业便利实施犯罪,或者实施违背职业要求的特定义务的犯罪被判处刑罚的,人民法院可以根据犯罪情况和预防再犯罪的需要,禁止其自刑罚执行完毕之日或者假释之日起从事相关职业,期限为三年至五年。 被禁止从事相关职业的人违反人民法院依照前款规定作出的决定的,由公安机关依法给予处罚;情节严重的,依照本法第三百一十三条的规定定罪处罚。 其他法律、行政法规对其从事相关职业另有禁止或者限制性规定的,从其规定。
第三十八条 管制的期限与执行机关
管制的期限,为三个月以上二年以下。 判处管制,可以根据犯罪情况,同时禁止犯罪分子在执行期间从事特定活动,进入特定区域、场所,接触特定的人。 对判处管制的犯罪分子,依法实行社区矫正。 违反第二款规定的禁止令的,由公安机关依照《中华人民共和国治安管理处罚法》的规定处罚。
第三十九条 被管制罪犯的义务与权利
被判处管制的犯罪分子,在执行期间,应当遵守下列规定: (一)遵守法律、行政法规,服从监督; (二)未经执行机关批准,不得行使言论、出版、集会、结社、游行、示威自由的权利; (三)按照执行机关规定报告自己的活动情况; (四)遵守执行机关关于会客的规定; (五)离开所居住的市、县或者迁居,应当报经执行机关批准。 对于被判处管制的犯罪分子,在劳动中应当同工同酬。
第四十条 管制期满解除
被判处管制的犯罪分子,管制期满,执行机关应即向本人和其所在单位或者居住地的群众宣布解除管制。
第四十一条 管制刑期的计算和折抵
管制的刑期,从判决执行之日起计算;判决执行以前先行羁押的,羁押一日折抵刑期二日。
第四十二条 拘役的期限
拘役的期限,为一个月以上六个月以下。
第四十三条 拘役的执行
被判处拘役的犯罪分子,由公安机关就近执行。 在执行期间,被判处拘役的犯罪分子每月可以回家一天至两天;参加劳动的,可以酌量发给报酬。
第四十四条 拘役刑期的计算和折抵
拘役的刑期,从判决执行之日起计算;判决执行以前先行羁押的,羁押一日折抵刑期一日。
第四十五条 有期徒刑的期限
有期徒刑的期限,除本法第五十条、第六十九条规定外,为六个月以上十五年以下。
第四十六条 有期徒刑与无期徒刑的执行
被判处有期徒刑、无期徒刑的犯罪分子,在监狱或者其他执行场所执行;凡有劳动能力的,都应当参加劳动,接受教育和改造。
第四十七条 有期徒刑刑期的计算与折抵
有期徒刑的刑期,从判决执行之日起计算;判决执行以前先行羁押的,羁押一日折抵刑期一日。
第四十八条 死刑、死缓的适用对象及核准程序
死刑只适用于罪行极其严重的犯罪分子。对于应当判处死刑的犯罪分子,如果不是必须立即执行的,可以判处死刑同时宣告缓期二年执行。 死刑除依法由最高人民法院判决的以外,都应当报请最高人民法院核准。死刑缓期执行的,可以由高级人民法院判决或者核准。
第四十九条 死刑适用对象的限制
犯罪的时候不满十八周岁的人和审判的时候怀孕的妇女,不适用死刑。 审判的时候已满七十五周岁的人,不适用死刑,但以特别残忍手段致人死亡的除外。
第五十条 死缓变更
判处死刑缓期执行的,在死刑缓期执行期间,如果没有故意犯罪,二年期满以后,减为无期徒刑;如果确有重大立功表现,二年期满以后,减为二十五年有期徒刑;如果故意犯罪,情节恶劣的,报请最高人民法院核准后执行死刑;对于故意犯罪未执行死刑的,死刑缓期执行的期间重新计算,并报最高人民法院备案。 对被判处死刑缓期执行的累犯以及因故意杀人、强奸、抢劫、绑架、放火、爆炸、投放危险物质或者有组织的暴力性犯罪被判处死刑缓期执行的犯罪分子,人民法院根据犯罪情节等情况可以同时决定对其限制减刑。
第五十一条 死缓期间及减为有期徒刑的刑期计算
死刑缓期执行的期间,从判决确定之日起计算。死刑缓期执行减为有期徒刑的刑期,从死刑缓期执行期满之日起计算。
第五十二条 罚金数额的裁量
判处罚金,应当根据犯罪情节决定罚金数额。
第五十三条 罚金的缴纳
罚金在判决指定的期限内一次或者分期缴纳。期满不缴纳的,强制缴纳。对于不能全部缴纳罚金的,人民法院在任何时候发现被执行人有可以执行的财产,应当随时追缴。 由于遭遇不能抗拒的灾祸等原因缴纳确实有困难的,经人民法院裁定,可以延期缴纳、酌情减少或者免除。
第五十四条 剥夺政治权利的含义
剥夺政治权利是剥夺下列权利: (一)选举权和被选举权; (二)言论、出版、集会、结社、游行、示威自由的权利; (三)担任国家机关职务的权利; (四)担任国有公司、企业、事业单位和人民团体领导职务的权利。
第五十五条 剥夺政治权利的期限
剥夺政治权利的期限,除本法第五十七条规定外,为一年以上五年以下。 判处管制附加剥夺政治权利的,剥夺政治权利的期限与管制的期限相等,同时执行。
第五十六条 剥夺政治权利的附加、独立适用
对于危害国家安全的犯罪分子应当附加剥夺政治权利;对于故意杀人、强奸、放火、爆炸、投毒、抢劫等严重破坏社会秩序的犯罪分子,可以附加剥夺政治权利。 独立适用剥夺政治权利的,依照本法分则的规定。
第五十七条 对死刑、无期徒刑罪犯剥夺政治权利的适用
对于被判处死刑、无期徒刑的犯罪分子,应当剥夺政治权利终身。 在死刑缓期执行减为有期徒刑或者无期徒刑减为有期徒刑的时候,应当把附加剥夺政治权利的期限改为三年以上十年以下。
第五十八条 剥夺政治权利的刑期计算、效力与执行
附加剥夺政治权利的刑期,从徒刑、拘役执行完毕之日或者从假释之日起计算;剥夺政治权利的效力当然施用于主刑执行期间。 被剥夺政治权利的犯罪分子,在执行期间,应当遵守法律、行政法规和国务院公安部门有关监督管理的规定,服从监督;不得行使本法第五十四条规定的各项权利。
第五十九条 没收财产的范围
没收财产是没收犯罪分子个人所有财产的一部或者全部。没收全部财产的,应当对犯罪分子个人及其扶养的家属保留必需的生活费用。 在判处没收财产的时候,不得没收属于犯罪分子家属所有或者应有的财产。
第六十条 以没收的财产偿还债务
没收财产以前犯罪分子所负的正当债务,需要以没收的财产偿还的,经债权人请求,应当偿还。
第四章 刑罚的具体运用
第六十一条 量刑的一般原则
对于犯罪分子决定刑罚的时候,应当根据犯罪的事实、犯罪的性质、情节和对于社会的危害程度,依照本法的有关规定判处。
第六十二条 从重处罚与从轻处罚
犯罪分子具有本法规定的从重处罚、从轻处罚情节的,应当在法定刑的限度以内判处刑罚。
第六十三条 减轻处罚
犯罪分子具有本法规定的减轻处罚情节的,应当在法定刑以下判处刑罚;本法规定有数个量刑幅度的,应当在法定量刑幅度的下一个量刑幅度内判处刑罚。 犯罪分子虽然不具有本法规定的减轻处罚情节,但是根据案件的特殊情况,经最高人民法院核准,也可以在法定刑以下判处刑罚。
第六十四条 犯罪物品的处理
犯罪分子违法所得的一切财物,应当予以追缴或者责令退赔;对被害人的合法财产,应当及时返还;违禁品和供犯罪所用的本人财物,应当予以没收。没收的财物和罚金,一律上缴国库,不得挪用和自行处理。
第六十五条 一般累犯
被判处有期徒刑以上刑罚的犯罪分子,刑罚执行完毕或者赦免以后,在五年以内再犯应当判处有期徒刑以上刑罚之罪的,是累犯,应当从重处罚,但是过失犯罪和不满十八周岁的人犯罪的除外。 前款规定的期限,对于被假释的犯罪分子,从假释期满之日起计算。
第六十六条 特别累犯
危害国家安全犯罪、恐怖活动犯罪、黑社会性质的组织犯罪的犯罪分子,在刑罚执行完毕或者赦免以后,在任何时候再犯上述任一类罪的,都以累犯论处。
第六十七条 自首
犯罪以后自动投案,如实供述自己的罪行的,是自首。对于自首的犯罪分子,可以从轻或者减轻处罚。其中,犯罪较轻的,可以免除处罚。 被采取强制措施的犯罪嫌疑人、被告人和正在服刑的罪犯,如实供述司法机关还未掌握的本人其他罪行的,以自首论。 犯罪嫌疑人虽不具有前两款规定的自首情节,但是如实供述自己罪行的,可以从轻处罚;因其如实供述自己罪行,避免特别严重后果发生的,可以减轻处罚。
第六十八条 立功
犯罪分子有揭发他人犯罪行为,查证属实的,或者提供重要线索,从而得以侦破其他案件等立功表现的,可以从轻或者减轻处罚;有重大立功表现的,可以减轻或者免除处罚。
第六十九条 数罪并罚的一般原则
判决宣告以前一人犯数罪的,除判处死刑和无期徒刑的以外,应当在总和刑期以下、数刑中最高刑期以上,酌情决定执行的刑期,但是管制最高不能超过三年,拘役最高不能超过一年,有期徒刑总和刑期不满三十五年的,最高不能超过二十年,总和刑期在三十五年以上的,最高不能超过二十五年。 数罪中有判处有期徒刑和拘役的,执行有期徒刑。数罪中有判处有期徒刑和管制,或者拘役和管制的,有期徒刑、拘役执行完毕后,管制仍须执行。 数罪中有判处附加刑的,附加刑仍须执行,其中附加刑种类相同的,合并执行,种类不同的,分别执行。
第七十条 判决宣告后发现漏罪的并罚
判决宣告以后,刑罚执行完毕以前,发现被判刑的犯罪分子在判决宣告以前还有其他罪没有判决的,应当对新发现的罪作出判决,把前后两个判决所判处的刑罚,依照本法第六十九条的规定,决定执行的刑罚。已经执行的刑期,应当计算在新判决决定的刑期以内。
第七十一条 判决宣告后又犯新罪的并罚
判决宣告以后,刑罚执行完毕以前,被判刑的犯罪分子又犯罪的,应当对新犯的罪作出判决,把前罪没有执行的刑罚和后罪所判处的刑罚,依照本法第六十九条的规定,决定执行的刑罚。
第七十二条 适用条件
对于被判处拘役、三年以下有期徒刑的犯罪分子,同时符合下列条件的,可以宣告缓刑,对其中不满十八周岁的人、怀孕的妇女和已满七十五周岁的人,应当宣告缓刑: (一)犯罪情节较轻; (二)有悔罪表现; (三)没有再犯罪的危险; (四)宣告缓刑对所居住社区没有重大不良影响。 宣告缓刑,可以根据犯罪情况,同时禁止犯罪分子在缓刑考验期限内从事特定活动,进入特定区域、场所,接触特定的人。 被宣告缓刑的犯罪分子,如果被判处附加刑,附加刑仍须执行。
第七十三条 考验期限
拘役的缓刑考验期限为原判刑期以上一年以下,但是不能少于二个月。 有期徒刑的缓刑考验期限为原判刑期以上五年以下,但是不能少于一年。 缓刑考验期限,从判决确定之日起计算。
第七十四条 累犯不适用缓刑
对于累犯和犯罪集团的首要分子,不适用缓刑。
第七十五条 缓刑犯应遵守的规定
被宣告缓刑的犯罪分子,应当遵守下列规定: (一)遵守法律、行政法规,服从监督; (二)按照考察机关的规定报告自己的活动情况; (三)遵守考察机关关于会客的规定; (四)离开所居住的市、县或者迁居,应当报经考察机关批准。
第七十六条 缓刑的考验及其积极后果
对宣告缓刑的犯罪分子,在缓刑考验期限内,依法实行社区矫正,如果没有本法第七十七条规定的情形,缓刑考验期满,原判的刑罚就不再执行,并公开予以宣告。
第七十七条 缓刑的撤销及其处理
被宣告缓刑的犯罪分子,在缓刑考验期限内犯新罪或者发现判决宣告以前还有其他罪没有判决的,应当撤销缓刑,对新犯的罪或者新发现的罪作出判决,把前罪和后罪所判处的刑罚,依照本法第六十九条的规定,决定执行的刑罚。 被宣告缓刑的犯罪分子,在缓刑考验期限内,违反法律、行政法规或者国务院有关部门关于缓刑的监督管理规定,或者违反人民法院判决中的禁止令,情节严重的,应当撤销缓刑,执行原判刑罚。
第七十八条 减刑条件与限度
被判处管制、拘役、有期徒刑、无期徒刑的犯罪分子,在执行期间,如果认真遵守监规,接受教育改造,确有悔改表现的,或者有立功表现的,可以减刑;有下列重大立功表现之一的,应当减刑: (一)阻止他人重大犯罪活动的; (二)检举监狱内外重大犯罪活动,经查证属实的; (三)有发明创造或者重大技术革新的; (四)在日常生产、生活中舍己救人的; (五)在抗御自然灾害或者排除重大事故中,有突出表现的; (六)对国家和社会有其他重大贡献的。 减刑以后实际执行的刑期不能少于下列期限: (一)判处管制、拘役、有期徒刑的,不能少于原判刑期的二分之一; (二)判处无期徒刑的,不能少于十三年; (三)人民法院依照本法第五十条第二款规定限制减刑的死刑缓期执行的犯罪分子,缓期执行期满后依法减为无期徒刑的,不能少于二十五年,缓期执行期满后依法减为二十五年有期徒刑的,不能少于二十年。
第七十九条 减刑程序
对于犯罪分子的减刑,由执行机关向中级以上人民法院提出减刑建议书。人民法院应当组成合议庭进行审理,对确有悔改或者立功事实的,裁定予以减刑。非经法定程序不得减刑。
第八十条 无期徒刑减刑的刑期计算
无期徒刑减为有期徒刑的刑期,从裁定减刑之日起计算。
第八十一条 假释的适用条件
被判处有期徒刑的犯罪分子,执行原判刑期二分之一以上,被判处无期徒刑的犯罪分子,实际执行十三年以上,如果认真遵守监规,接受教育改造,确有悔改表现,没有再犯罪的危险的,可以假释。如果有特殊情况,经最高人民法院核准,可以不受上述执行刑期的限制。 对累犯以及因故意杀人、强奸、抢劫、绑架、放火、爆炸、投放危险物质或者有组织的暴力性犯罪被判处十年以上有期徒刑、无期徒刑的犯罪分子,不得假释。 对犯罪分子决定假释时,应当考虑其假释后对所居住社区的影响。
第八十二条 假释的程序
对于犯罪分子的假释,依照本法第七十九条规定的程序进行。非经法定程序不得假释。
第八十三条 假释的考验期限
有期徒刑的假释考验期限,为没有执行完毕的刑期;无期徒刑的假释考验期限为十年。 假释考验期限,从假释之日起计算。
第八十四条 假释犯应遵守的规定
被宣告假释的犯罪分子,应当遵守下列规定: (一)遵守法律、行政法规,服从监督; (二)按照监督机关的规定报告自己的活动情况; (三)遵守监督机关关于会客的规定; (四)离开所居住的市、县或者迁居,应当报经监督机关批准。
第八十五条 假释考验及其积极后果
对假释的犯罪分子,在假释考验期限内,依法实行社区矫正,如果没有本法第八十六条规定的情形,假释考验期满,就认为原判刑罚已经执行完毕,并公开予以宣告。
第八十六条 假释的撤销及其处理
被假释的犯罪分子,在假释考验期限内犯新罪,应当撤销假释,依照本法第七十一条的规定实行数罪并罚。 在假释考验期限内,发现被假释的犯罪分子在判决宣告以前还有其他罪没有判决的,应当撤销假释,依照本法第七十条的规定实行数罪并罚。 被假释的犯罪分子,在假释考验期限内,有违反法律、行政法规或者国务院有关部门关于假释的监督管理规定的行为,尚未构成新的犯罪的,应当依照法定程序撤销假释,收监执行未执行完毕的刑罚。
第八十七条 追诉时效期限
犯罪经过下列期限不再追诉: (一)法定最高刑为不满五年有期徒刑的,经过五年; (二)法定最高刑为五年以上不满十年有期徒刑的,经过十年; (三)法定最高刑为十年以上有期徒刑的,经过十五年; (四)法定最高刑为无期徒刑、死刑的,经过二十年。如果二十年以后认为必须追诉的,须报请最高人民检察院核准。
第八十八条 追诉期限的延长
在人民检察院、公安机关、国家安全机关立案侦查或者在人民法院受理案件以后,逃避侦查或者审判的,不受追诉期限的限制。 被害人在追诉期限内提出控告,人民法院、人民检察院、公安机关应当立案而不予立案的,不受追诉期限的限制。
第八十九条 追诉期限的计算与中断
追诉期限从犯罪之日起计算;犯罪行为有连续或者继续状态的,从犯罪行为终了之日起计算。 在追诉期限以内又犯罪的,前罪追诉的期限从犯后罪之日起计算。

启动起来

在这里插入图片描述
在这里插入图片描述

打开页面

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u014131617/article/details/86135589
今日推荐