全文检索Lucene框架---索引维护

一、索引库的添加

1、Field域的属性

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

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

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

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

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

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

Field

数据类型

Analyzed

是否分析

Indexed

扫描二维码关注公众号,回复: 9399546 查看本文章

是否索引

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、修改后效果

  

猜你喜欢

转载自www.cnblogs.com/Zzzzn/p/12362188.html
今日推荐