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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-8-30 21:20 编辑

【石家庄校区】就业班_JAVAEE_Lucene

一 概述
   结构化数据    格式和长度固定,比如数据库表
   非结构化数据  格式和长度不固定,比如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();
        }

        
        //查询索引
      
[Java] 纯文本查看 复制代码
 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();
        }
        

        // 添加文档
      
[Java] 纯文本查看 复制代码
 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删除文档
        
[Java] 纯文本查看 复制代码
public void deleteByQuery()throws Exception {
                IndexWriter indexWriter = this.getIndexWriter();
                Query query = new TermQuery(new Term("name","测试"));
                
                indexWriter.deleteDocuments(query);
                indexWriter.close();
        }

        
        // 删除全部文档
      
[Java] 纯文本查看 复制代码
 public void deleteAll()throws Exception {
                IndexWriter indexWriter = this.getIndexWriter();
                
                indexWriter.deleteAll();
                indexWriter.close();
        }

        
        //更新文档
        //先删除,然后再添加
      
[AppleScript] 纯文本查看 复制代码
 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();
        }
        

        //创建索引写入器
        
[Java] 纯文本查看 复制代码
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 个回复

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