zoukankan      html  css  js  c++  java
  • 1.1Lucene全文检索使用方法

    Lucene全文检索

    需要导入的包

    lucene-core.jar 核心包
    lucene-queryparser.jar
    IK-Analyzer-1.0-SNAPSHOT.jar 自定义分词器所用的包

    创建索引

    	public void CreateIndex() throws Exception {
            //1、创建一个Director对象,指定索引库保存的位置。
            //把索引库保存在内存中
            //Directory directory = new RAMDirectory();
            //把索引库保存在磁盘
            Directory directory = FSDirectory.open(new File(IndexPath).toPath());
            //2、基于Directory对象创建一个IndexWriter对象
            //使用默认配置分词
    		//IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig());
            //使用IKAnalyzer来进行分词
            IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(new IKAnalyzer()));
    
            //3、读取磁盘上的文件,对应每个文件创建一个文档对象。
            File dir = new File(searchPath);
            File[] files = dir.listFiles();
            for (File file : files) {
                //取文件名
                String filename = file.getName();
                //文件的路径
                String filePath = file.getPath();
                //文件的内容
                String fileContent = FileUtils.readFileToString(file, "utf-8");
                //文件的大小
                long fileSize = FileUtils.sizeOf(file);
                //创建Field
                //参数1:域的名称,参数2:域的内容,参数3:是否存储
                Field fieldName = new TextField("name", filename, Field.Store.YES);
                Field fieldPath = new TextField("path", filePath, Field.Store.YES);
                Field fieldContent = new TextField("content", fileContent, Field.Store.YES);
                Field fieldSize = new TextField("size", fileSize + "", Field.Store.YES);
                //创建文档对象
                Document document = new Document();
                //向文档对象中添加域
                document.add(fieldName);
                document.add(fieldPath);
                document.add(fieldContent);
                document.add(fieldSize);
                //5、把文档对象写入索引库
                indexWriter.addDocument(document);
            }
            //6、关闭indexWriter对象
            indexWriter.close();
        }
    

    获取

       	public void searchIndex() throws Exception {
            //1、创建一个Director对象,指定索引库的位置
            Directory directory = FSDirectory.open(new File(IndexPath).toPath());
            //2、创建一个IndexReader对象
            IndexReader indexReader = DirectoryReader.open(directory);
            //3、创建一个IndexSearcher对象,构造方法中的参数indexReader对象。
            IndexSearcher indexSearcher = new IndexSearcher(indexReader);
            //4、创建一个Query对象,TermQuery
            Query query = new TermQuery(new Term("content", "spring"));
            //5、执行查询,得到一个TopDocs对象
            //参数1:查询对象 参数2:查询结果返回的最大记录数
            TopDocs topDocs = indexSearcher.search(query, 10);
            //6、取查询结果的总记录数
            System.out.println("查询总记录数:" + topDocs.totalHits);
            //7、取文档列表
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            //8、打印文档中的内容
            for (ScoreDoc doc : scoreDocs) {
                //取文档id
                int docId = doc.doc;
                //根据id取文档对象
                Document document = indexSearcher.doc(docId);
                System.out.println(document.get("name"));
                System.out.println(document.get("path"));
                System.out.println(document.get("size"));
                //ystem.out.println(document.get("content"));
                System.out.println("-----------------寂寞的分割线");
            }
            //9、关闭IndexReader对象
            indexReader.close();
        }
    

    测试分词器

    xml配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
    <properties>  
    	<comment>IK Analyzer 扩展配置</comment>
    	<!--用户可以在这里配置自己的扩展字典 -->
    	<entry key="ext_dict">hotword.dic;</entry>
    	
    	<!--用户可以在这里配置自己的扩展停止词字典-->
    	<entry key="ext_stopwords">stopword.dic;</entry>
    </properties>
    

    分词器配置

     
     public void testTokenStream() throws Exception {
            //1)创建一个Analyzer对象,StandardAnalyzer对象
    //        Analyzer analyzer = new StandardAnalyzer();
            Analyzer analyzer = new IKAnalyzer();
            //2)使用分析器对象的tokenStream方法获得一个TokenStream对象
            TokenStream tokenStream = analyzer.tokenStream("", "2017年12月14日 - 传智播客Lucene概述公安局Lucene是一款高性能的、可扩展的信息检索(IR)工具库。信息检索是指文档搜索、文档内信息搜索或者文档相关的元数据搜索等操作。");
            //3)向TokenStream对象中设置一个引用,相当于数一个指针
            CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
            //4)调用TokenStream对象的rest方法。如果不调用抛异常
            tokenStream.reset();
            //5)使用while循环遍历TokenStream对象
            while (tokenStream.incrementToken()) {
                System.out.println(charTermAttribute.toString());
            }
            //6)关闭TokenStream对象
            tokenStream.close();
        }
    
    Field域的分析,分词,存储权限
    Field fieldName = new TextField("name", filename, Field.Store.YES);
    

    Field域权限

  • 相关阅读:
    LeetCode Find Duplicate File in System
    LeetCode 681. Next Closest Time
    LeetCode 678. Valid Parenthesis String
    LeetCode 616. Add Bold Tag in String
    LeetCode 639. Decode Ways II
    LeetCode 536. Construct Binary Tree from String
    LeetCode 539. Minimum Time Difference
    LeetCode 635. Design Log Storage System
    LeetCode Split Concatenated Strings
    LeetCode 696. Count Binary Substrings
  • 原文地址:https://www.cnblogs.com/idcode/p/14551434.html
Copyright © 2011-2022 走看看