A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© longxf_sjz 中级黑马   /  2019-9-14 23:58  /  826 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一 概述
   结构化数据    格式和长度固定,比如数据库表
   非结构化数据  格式和长度不固定,比如word
   全文检索      针对非结构化数据,采用先建立索引,然后再索引的基础上进行查询
   java全文检索技术lucene  全文检索的工具包
   应用场景:针对大数据量的情况下,对数据的模糊查询或者自然语言的检索。
二 创建索引
        1 获取原始文档  爬虫Nutch jsoup
        2 创建文档对象   document 相当于表中一条记录   field 属于document 相当于表中的字段   field中存储内容
                filed的属性判断原则:
                是否需要分词 需要在也页面进行查询的大部分都需要进行分词,除了一些拥有特殊业务含义,分割后会失去原有含义的不需要进行分词。比如订单编号,身份证号。
                是否需要索引 需要在页面进行查询的就需要进行索引
                是否需要存储 需要在页面显示的就需要存储
        3 分析文档
                对存放在field中的内容进行分析,得到term列表。
                过程:对原始文档提取单词、将字母转为小写、去除标点符号、去除停用词
        4 创建索引
       对term列表进行索引,每个term执行文档的id列表。  
三 查询索引
        1 查询接口
        2 创建查询
        3 执行查询
        4 渲染结果
四 IK分词器
    ik分词器即支持中文也支持英文。
        使用方法:
        第一步:把jar包添加到工程中
        第二步:把配置文件和扩展词典和停用词词典添加到classpath下
        注意:mydict.dic和ext_stopword.dic文件的格式为UTF-8,注意是无BOM 的UTF-8 编码。
        分词器的应用时机:        创建索引时和查询索引时针对查询内容先进行分词。
五 代码实现
[Java] 纯文本查看 复制代码
//创建索引
	public void createIndex()throws Exception{
		IndexWriter indexWriter = getIndexWriter();
		File sourceFile = new File("E:\\项目二\\lucene\\day06\\资料\\searchsource");
		for (File file :sourceFile.listFiles() ) {
			String fileName = file.getName();
			String filePath = file.getPath();
			long size = FileUtils.sizeOf(file);
			String fileContent = FileUtils.readFileToString(file);
			Document document = new Document();
			TextField fileNameField = new TextField("name", fileName, Store.YES);
			StoredField pathField = new StoredField("path", filePath);
			LongField sizeField = new LongField("size", size, Store.YES);
			TextField contentFeild = new TextField("content",fileContent,Store.NO);
			
			document.add(fileNameField);
			document.add(pathField);
			document.add(sizeField);
			document.add(contentFeild);
			indexWriter.addDocument(document);
		}
		indexWriter.close();
	}
	
	//查询索引
	public void queryIndex() throws Exception{
		Directory directory = FSDirectory.open(new File("E:\\index"));
		IndexReader indexReader = DirectoryReader.open(directory);
		IndexSearcher indexSearcher = new IndexSearcher(indexReader);
		//term查询相当于等值查询
		Query query = new TermQuery(new Term("name", "lucene"));
		TopDocs topDocs = indexSearcher.search(query , 10);
		for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
			int id = scoreDoc.doc;
			Document document = indexSearcher.doc(id);
			System.out.println(document.getField("name"));
			System.out.println(document.getField("path"));
			System.out.println(document.getField("content"));
			System.out.println(document.getField("size"));
		}
		
		indexReader.close();
	}
	
	// 添加文档
	public void addDocument() throws Exception {
		IndexWriter indexWriter = this.getIndexWriter();
		Document document = new Document();
		TextField fileNameField = new TextField("name", "测试文档.txt", Store.YES);
		StoredField pathField = new StoredField("path", "c:\\temp");
		LongField sizeField = new LongField("size", 1111, Store.YES);
		document.add(fileNameField);
		document.add(pathField);
		document.add(sizeField);
		indexWriter.addDocument(document);
		indexWriter.close();
	}
	
	// 根据query删除文档
	public void deleteByQuery()throws Exception {
		IndexWriter indexWriter = this.getIndexWriter();
		Query query = new TermQuery(new Term("name","测试"));
		
		indexWriter.deleteDocuments(query);
		indexWriter.close();
	}
	
	// 删除全部文档
	public void deleteAll()throws Exception {
		IndexWriter indexWriter = this.getIndexWriter();
		
		indexWriter.deleteAll();
		indexWriter.close();
	}
	
	//更新文档
	//先删除,然后再添加
	public void update() throws Exception{
		IndexWriter indexWriter = this.getIndexWriter();
		Term term = new Term("name","spring");
		Document doc = new Document();
		TextField fileNameField = new TextField("name", "测试文档111.txt", Store.YES);
		StoredField pathField = new StoredField("path", "c:\\temp");
		LongField sizeField = new LongField("size", 1111, Store.YES);
		doc.add(fileNameField);
		doc.add(pathField);
		doc.add(sizeField);
		indexWriter.updateDocument(term, doc);
		indexWriter.close();
	}
	
	//创建索引写入器
	private IndexWriter getIndexWriter() throws IOException {
		//指定索引库存放路径 ,可以存放在内存也可以存放在硬盘,一般存放在硬盘上。
		Directory directory = FSDirectory.open(new File("E:\\index"));
		//创建ik分词器 ik分词器即支持中文也支持英文 
		Analyzer analyzer = new IKAnalyzer();
		IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
		//创建索引写入器
		IndexWriter indexWriter = new IndexWriter(directory, config);
		return indexWriter;
	}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马