zoukankan      html  css  js  c++  java
  • 全文检索Lucene框架---索引维护

    一、索引库的添加

    1、Field域的属性

      是否分析:是否对域的内容进行分词处理。前提是我们要对域的内容进行查询。

      是否索引:将Field分析后的词或整个Field值进行索引,只有索引方可搜索到。

        比如:商品名称、商品简介分析后进行索引,订单号、身份证号不用分析但也要索引,这些将来都要作为查询条件。

      是否存储:将Field值存储在文档中,存储在文档中的Field才可以从Document中获取

        比如:商品名称、订单号,凡是将来要从Document中获取的Field都要存储。

      是否存储的标准:是否要将内容展示给用户

    Field

    数据类型

    Analyzed

    是否分析

    Indexed

    是否索引

    Stored

    是否存储

    说明

    StringField(FieldName, FieldValue,Store.YES))

    字符串

    N

    Y

    Y或N

    这个Field用来构建一个字符串Field,但是不会进行分析,会将整个串存储在索引中,比如(订单号,姓名等)

    是否存储在文档中用Store.YESStore.NO决定

    LongPoint(String name, long... point)

    Long

    Y

    Y

    N

    可以使用LongPoint、IntPoint等类型存储数值类型的数据。让数值类型可以进行索引。但是不能存储数据,如果想存储数据还需要使用StoredField

    StoredField(FieldName, FieldValue) 

    重载方法,支持多种类型

    N

    N

    Y

    这个Field用来构建不同类型Field

    不分析,不索引,但要Field存储在文档中

    TextField(FieldName, FieldValue, Store.NO)

    TextField(FieldName, reader)

     

    字符串

    Y

    Y

    Y或N

    如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略.

    2、添加文档代码实现

      ①、添加前效果

        

      ②、代码实现

    package com.zn;
    
    import org.apache.lucene.document.*;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.store.FSDirectory;
    import org.junit.jupiter.api.Test;
    import org.wltea.analyzer.lucene.IKAnalyzer;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * 索引维护
     */
    public class DocumentTest {
    
        /**
         * 索引添加
         */
        @Test
        public void creatDocument() throws IOException {
            //创建IndexWriter对象   参数一:索引库位置    参数二:指定配置
            IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("E:\accp\Y2\进阶内容\Lucene\Lucene\Index").toPath()),
                    new IndexWriterConfig(new IKAnalyzer()));
            //创建一个文档对象
            Document document=new Document();
            document.add(new TextField("fieldName","AddDocument.txt", Field.Store.YES));
            document.add(new StoredField("fieldPath","C://AddDocument.txt"));
            document.add(new LongPoint("fieldSize",123));
            document.add(new StoredField("fieldSize",123));
            document.add(new TextField("fieldContent","新添加的文档的内容", Field.Store.YES));
            //创建索引,将文档添加到索引库当中
            indexWriter.addDocument(document);
            //关闭
            indexWriter.close();
        }
    }

      ③、添加后效果

        

        

    二、索引库的删除

    1、全部删除

      将索引目录的索引信息全部删除,直接彻底删除,无法恢复。此方法慎用!!

      ①、删除前效果

        

      ②、代码实现

    package com.zn;
    
    import org.apache.lucene.document.*;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.store.FSDirectory;
    import org.junit.jupiter.api.Test;
    import org.wltea.analyzer.lucene.IKAnalyzer;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * 索引维护
     */
    public class DocumentTest {
        /**
         * 索引删除:删除全部
         */
        @Test
        public void deleteAllDocument() throws IOException {
            //创建IndexWriter对象   参数一:索引库位置    参数二:指定配置
            IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("E:\accp\Y2\进阶内容\Lucene\Lucene\Index").toPath()),
                    new IndexWriterConfig(new IKAnalyzer()));
            //删除索引
            indexWriter.deleteAll();
            //关闭
            indexWriter.close();
        }
    }

      ③、执行后效果

        

    2、根据域或关键词删除

      ①、删除前效果

        

      ②、代码实现 

    package com.zn;
    
    import org.apache.lucene.document.*;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.search.TermQuery;
    import org.apache.lucene.store.FSDirectory;
    import org.junit.jupiter.api.Test;
    import org.wltea.analyzer.lucene.IKAnalyzer;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * 索引维护
     */
    public class DocumentTest {
    
        /**
         * 索引删除:根据域或关键词删除
         */
        @Test
        public void deleteByFieldAndTermDocument() throws IOException {
            //创建IndexWriter对象   参数一:索引库位置    参数二:指定配置
            IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("E:\accp\Y2\进阶内容\Lucene\Lucene\Index").toPath()),
                    new IndexWriterConfig(new IKAnalyzer()));
            //定义一个删除条件,定义一个查询对象
            Query query=new TermQuery(new Term("fieldName","AddDocument.txt"));
            //删除
            indexWriter.deleteDocuments(query);
            //关闭
            indexWriter.close();
        }
    }

      ③、删除后效果

        

    三、索引库的修改

      原理就是先删除后添加。

    1、修改前效果

      

    2、代码实现

    package com.zn;
    
    import org.apache.lucene.document.*;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.search.TermQuery;
    import org.apache.lucene.store.FSDirectory;
    import org.junit.jupiter.api.Test;
    import org.wltea.analyzer.lucene.IKAnalyzer;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * 索引维护
     */
    public class DocumentTest {
    
        /**
         * 索引修改:先删除再修改
         */
        @Test
        public void updateDocument() throws IOException {
            //创建IndexWriter对象   参数一:索引库位置    参数二:指定配置
            IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("E:\accp\Y2\进阶内容\Lucene\Lucene\Index").toPath()),
                    new IndexWriterConfig(new IKAnalyzer()));
            //创建一个文档对象
            Document document=new Document();
            document.add(new TextField("fieldName","UpdateDocument.txt", Field.Store.YES));
            document.add(new StoredField("fieldPath","C://UpdateDocument.txt"));
            document.add(new LongPoint("fieldSize",456));
            document.add(new StoredField("fieldSize",456));
            document.add(new TextField("fieldContent","修改fieldName为AddDocument的文档,进行文档替换", Field.Store.YES));
    
            //修改
            indexWriter.updateDocument(new Term("fieldName","AddDocument.txt"),document);
            //关闭
            indexWriter.close();
        }
    }

    3、修改后效果

      

  • 相关阅读:
    【转】Android之四大组件、六大布局、五大存储
    Android O 8.0 奥利奥
    安卓7.1新特性
    那些年我们踩过的坑,SQL 中的空值陷阱!
    8年经验面试官详解 Java 面试秘诀
    Github 第三方授权登录教程
    40个超有趣的Linux命令行彩蛋和游戏
    Synchronized锁在Spring事务管理下,为啥还线程不安全?
    Windows Server 2008 R2文件服务器升级到Windows Server 2016
    牛客练习赛61
  • 原文地址:https://www.cnblogs.com/Zzzzn/p/12362188.html
Copyright © 2011-2022 走看看