利用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();
}
原文地址:https://www.cnblogs.com/szhhhh/p/12362479.html