zoukankan      html  css  js  c++  java
  • 利用IKAnalyzer分词和索引维护

    1.默认标准分析器  所有分析器最终继承的类都是Analyzer

    1.1 编写AnalyzerTest类

     //默认标准分析器
            //1.创建一个Analyzer对象
            Analyzer analyzer=new StandardAnalyzer();
            //2.调用Analyzer对象的tokenStream方法获取TokenStream对象,此对象包含了所有分词结果
            TokenStream tokenStream=analyzer.tokenStream("","spring springmvc mysql 数据库 freamework mybatis 呵呵");
            //3.给tokenStyream对象设置一个指针,只恨在哪当前就在哪一个分词上
            CharTermAttribute charTermAttribute=tokenStream.addAttribute(CharTermAttribute.class);
            //4.调用tokenStream对象的reset方法,充值指针,不调用会报错
            tokenStream.reset();
            //5.利用while循环,拿到分词列表的结果  incrementToken方法返回值如果为false代表读取完毕  true代表没有读取完毕
            while (tokenStream.incrementToken()){
                System.out.println(charTermAttribute.toString());
            }
            //6.关闭
            tokenStream.close();
        }

    1.2 查看分词效果  如图可见所有数据都被分词了但是中文数据分成了一个字一个字的 所以我们可使用IKAnalyzer进行分词

    1.3 使用IKAnalyzer进行分词

    //使用IKAnalyzer分词
            Analyzer analyzer=new IKAnalyzer();
            //2.调用Analyzer对象的tokenStream方法获取TokenStream对象,此对象包含了所有分词结果
            TokenStream tokenStream=analyzer.tokenStream("","spring springmvc mysql 数据库 freamework mybatis 呵呵");
            //3.给tokenStyream对象设置一个指针,只恨在哪当前就在哪一个分词上
            CharTermAttribute charTermAttribute=tokenStream.addAttribute(CharTermAttribute.class);
            //4.调用tokenStream对象的reset方法,充值指针,不调用会报错
            tokenStream.reset();
            //5.利用while循环,拿到分词列表的结果  incrementToken方法返回值如果为false代表读取完毕  true代表没有读取完毕
            while (tokenStream.incrementToken()){
                System.out.println(charTermAttribute.toString());
            }
            //6.关闭
            tokenStream.close();
        }

    1.4 查看分词效果  与上图比对自行体会

    2.索引维护:添加、删除、修改

    2.1 添加索引

     //添加索引
        @Test
        public void createDocument() throws IOException {
    
    
            //1.创建IndexWriter对象 参数一:索引库位置   参数二: 指定配置
            IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:\Users\Administrator\Desktop\index").toPath()), new IndexWriterConfig(new IKAnalyzer()));
            //创建一个文档对象
            Document document=new Document();
            document.add(new TextField("fieldName","haha.text", Field.Store.YES));
            document.add(new StoredField("fieldPath","G://haha.text"));
            document.add(new LongPoint("fieldSize",123));
            document.add(new StoredField("fieldSize",123));
            document.add(new TextField("fieldName","ojdbc14和ikanalyzer的maven找不到的解决办法,手动发布oJdbc14到maven仓库,手动发布ikanalyzer到maven,同时本教程适用于所有jar包发布 下载 IKAnalyzer结合Lucene使用和单独使用例子 简单性能测试 11-26 阅读数 1890 IKAnalyzer是一个开源基于JAVA语言的 ",Field.Store.YES));
            //创建索引,将文档添加到索引库当中
            indexWriter.addDocument(document);
            //关闭
            indexWriter.close();
        }

    2.2 查看效果索引库中已有15个文档所以执行后又16个

    2.3 删除所有索引

      //删除所有索引
        @Test
        public void delDocument() throws IOException {
        //1.创建IndexWriter对象 参数一:索引库位置   参数二: 指定配置
                IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:\Users\Administrator\Desktop\index").toPath()), new IndexWriterConfig(new IKAnalyzer()));
        //删除索引
    
            indexWriter.deleteAll();
        //关闭
            indexWriter.close();
        }

    2.4 查看效果  当前已无索引

    2.5 根据域和关键词删除索引   删除前先把索引文档恢复成15个文档

     @Test
        public void delDocumentByTerm() throws IOException {
            //1.创建IndexWriter对象 参数一:索引库位置   参数二: 指定配置
            IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:\Users\Administrator\Desktop\index").toPath()), new IndexWriterConfig(new IKAnalyzer()));
           //定义一个删除条件,定义一个查询对象
            Query query=new TermQuery(new Term("fieldName","全文检索"));
    
            //删除索引
            indexWriter.deleteDocuments(query);
            //关闭
            indexWriter.close();
        }

    2.6 首先我们删除前查看带有全文检索的文档名称又几个  我么查询到带有全文检索的文档名称又两个

    2.7 执行删除  查询效果  现在文档数变为13

    2.8 修改索引   修改首先将匹配到的文档删除后再添加一个

    //修改索引,修改fieldName域中关键词匹配到全文索引的文档
        @Test
        public void updaDocument() throws IOException {
            //1.创建IndexWriter对象 参数一:索引库位置   参数二: 指定配置
            IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:\Users\Administrator\Desktop\index").toPath()), new IndexWriterConfig(new IKAnalyzer()));
            Document document=new Document();
            document.add(new TextField("fieldName","new.txt", Field.Store.YES));
            document.add(new StoredField("fieldPath","c://new.txt"));
            document.add(new LongPoint("fieldSize",456));
            document.add(new StoredField("fieldSize",456));
            document.add(new TextField("fieldContent","修改fieldName为全文检索的文档,进行文档替换,先删除掉fieldName为全文检索的两个文档,再添加一个fileName为new的新文档", Field.Store.YES));
            //修改  参数一为条件  参数二为修改的文档值
            indexWriter.updateDocument(new Term("fieldName","全文检索"),document);
            //关闭
            indexWriter.close();
        }

    2.9 查询效果  15个文档共有2个fielName带有全文检索所将两个删除后又添加一个为14个

    2.10 根据域和关键词查询

    private IndexSearcher indexSearcher;
        private IndexReader indexReader;
        @Before
        public void getSearcher() throws IOException {
            //1.创建Directory对象,指定索引库位置
            Directory directory= FSDirectory.open(new File("C:\Users\Administrator\Desktop\index").toPath());
            //2.创建IndexReader对象,读取索引库内容
            indexReader= DirectoryReader.open(directory);
            //3.创建IndexSearcher对象
            indexSearcher=new IndexSearcher(indexReader);
    
        }
    //根据域和关键词进行查询
        @Test
        public void TermQuery() throws IOException {
            //创建查询条件
            Query query=new TermQuery(new Term("fieldName","new"));
            //执行查询
            TopDocs topDocs=indexSearcher.search(query,10);
            System.out.println("返回的文档个数:"+topDocs.totalHits);
            //获取到文档集合
            ScoreDoc[] scoreDocs=topDocs.scoreDocs;
            for (ScoreDoc doc:scoreDocs){
                //获取到文档
                Document document=indexSearcher.doc(doc.doc);
                //获取到文档域中数据
                System.out.println("fieldName:"+document.get("fieldName"));
                System.out.println("fieldPath:"+document.get("fieldPath"));
                System.out.println("fieldSize:"+document.get("fieldSize"));
                System.out.println("fieldContent:"+document.get("fieldContent"));
                System.out.println("======================================================================");
            }
            //关闭
            indexReader.close();
        }

    2.11 查询效果

    2.12 匹配一行数据  这行数据会自动分词

    //匹配一行数据,这一行数据会自动进行分词
        @Test
            public void QueryParser() throws IOException, ParseException {
            //创建一个QueryParser对象 参数一:查询的域  参数二:使用哪种分析器
            QueryParser parser=new QueryParser("fieldContent",new IKAnalyzer());
            //设置匹配的数据条件
            Query query = parser.parse("Lucene是一个开源的基于Java的搜索库");
            //查询
            TopDocs topDocs = indexSearcher.search(query, 10);
            System.out.println("返回的文档个数:"+topDocs.totalHits);
    
            //获取到文档集合
            ScoreDoc [] scoreDocs=topDocs.scoreDocs;
            for (ScoreDoc doc:scoreDocs) {
                //获取到文档
                Document document = indexSearcher.doc(doc.doc);
                //获取到文档域中数据
                System.out.println("fieldName:"+document.get("fieldName"));
                System.out.println("fieldPath:"+document.get("fieldPath"));
                System.out.println("fieldSize:"+document.get("fieldSize"));
                System.out.println("fieldContent:"+document.get("fieldContent"));
                System.out.println("==============================================================");
            }
    
    
            //关闭
            indexReader.close();
        }

    2.13 查询效果

    //添加索引
    @Test
    public void createDocument() throws IOException {


    //1.创建IndexWriter对象 参数一:索引库位置 参数二: 指定配置
    IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:\Users\Administrator\Desktop\index").toPath()), new IndexWriterConfig(new IKAnalyzer()));
    //创建一个文档对象
    Document document=new Document();
    document.add(new TextField("fieldName","haha.text", Field.Store.YES));
    document.add(new StoredField("fieldPath","G://haha.text"));
    document.add(new LongPoint("fieldSize",123));
    document.add(new StoredField("fieldSize",123));
    document.add(new TextField("fieldName","ojdbc14ikanalyzermaven找不到的解决办,动发oJdbc14maven仓库,动发ikanalyzermaven,程适用于所有jar布 下 IKAnalyzerLucene使用和单独使用例子 简单性能测试 11-26 阅读数 1890 IKAnalyzer是一个开源基于JAVA言的 ",Field.Store.YES));
    //创建索引,将文档添加到索引库当中
    indexWriter.addDocument(document);
    //关闭
    indexWriter.close();
    }
  • 相关阅读:
    BNU 51002 BQG's Complexity Analysis
    BNU OJ 51003 BQG's Confusing Sequence
    BNU OJ 51000 BQG's Random String
    BNU OJ 50999 BQG's Approaching Deadline
    BNU OJ 50998 BQG's Messy Code
    BNU OJ 50997 BQG's Programming Contest
    CodeForces 609D Gadgets for dollars and pounds
    CodeForces 609C Load Balancing
    CodeForces 609B The Best Gift
    CodeForces 609A USB Flash Drives
  • 原文地址:https://www.cnblogs.com/szhhhh/p/12362479.html
Copyright © 2011-2022 走看看