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();
    }
  • 相关阅读:
    注意事项 软件连接的数据库是设置输出的数据库,弄错会造成数据库不一致
    归并排序
    快速排序
    冒泡排序
    插入排序
    上次遗留下来的XMLUtil的问题
    关于子网掩码
    java.lang.InstantiationException
    java.lang.ExceptionInInitializerError
    关于HashMap中的负载因子
  • 原文地址:https://www.cnblogs.com/szhhhh/p/12362479.html
Copyright © 2011-2022 走看看