• 索引维护:添加,删除,修改与维护



     Field域属性分类
    添加文档的时候,我们文档当中包含多个域,那么域的类型是我们自定义的,上个案例使用的TextField域,那么这个域他会自动分词,然后存储
    我们要根据数据类型和数据的用途合理的选择合适的域
    Field类:
    StringField(fieldName,fieldValue,Stroe.YES/NO) 存储的数据类型为字符串,包含索引,是否存储根据Stroe定义,不会经过分析器
    StroeField(fieldName,fieldValue) 支持多种数据类型,不分析,不建立索引,默认保存到索引库当中
    LongPoint(name,value) 会进行分析,会创建索引,但是不会保存到索引库当中
    TextField(fieldName,fieldValue,Stroe.YES/NO) 会分析,会创建索引,是否保存取决Stroe



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


     索引修改:原理-先删除在添加
    /**
    * 索引修改,修改fieldName域中关键词匹配到全文检索的文档
    * @throws IOException
    */
    @Test
    public void updateDocument() throws IOException {
    //创建IndexWriter对象 参数一:索引库位置 参数二:指定配置
    IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:\Users\FLC\Desktop\授课内容\授课资料\Y2170\Luncen\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.4.1 删除全部:慎用
    @Test
    public void deleteAllDocument() throws IOException {
    //创建IndexWriter对象 参数一:索引库位置 参数二:指定配置
    IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:\Users\FLC\Desktop\授课内容\授课资料\Y2170\Luncen\Index").toPath()),
    new IndexWriterConfig(new IKAnalyzer()));

    //删除索引
    indexWriter.deleteAll();
    //关闭
    indexWriter.close();
    }

    2.4.2 根据域和关键词删除
    /**
    * 根据域和关键词进行删除
    * @throws IOException
    */
    @Test
    public void deleteByFieldAndTermDocument() throws IOException {
    //创建IndexWriter对象 参数一:索引库位置 参数二:指定配置
    IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("C:\Users\FLC\Desktop\授课内容\授课资料\Y2170\Luncen\Index").toPath()),
    new IndexWriterConfig(new IKAnalyzer()));

    //定义一个删除条件,定义一个查询对象
    Query query=new TermQuery(new Term("fieldName","全文检索"));
    //删除
    indexWriter.deleteDocuments(query);

    //关闭
    indexWriter.close();
    }



    查询索引
    Query子类:
    TermQuery:根据域和关键词进行搜索

    /**
    * termQuery根据域和关键词进行搜索
    * @throws IOException
    */
    @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();
    }

    RangeQuery:范围搜索
    前提:创建文档时保存范围
    document.add(new LongPoint("fieldSize",456));
    document.add(new StoredField("fieldSize",456));

    /**
    * RangeQuery范围搜素
    * @throws IOException
    */
    @Test
    public void RangeQuery() throws IOException {
    //设置范围搜索的条件 参数一范围所在的域
    Query query=LongPoint.newRangeQuery("fieldSize",0,50);
    //查询
    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();
    }

    QueryParser:匹配一行数据,这一行数据会自动进行分词
    查询:Lucene是一个开源的基于Java的搜索库 Lucene 一个 开源 基于......
    使用方案:
    1.导入依赖,如果当前没有QueryParser依赖则需要导入依赖
    <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-queryparser -->
    <dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-queryparser</artifactId>
    <version>7.4.0</version>
    </dependency>
    2.测试编码:
    /**
    * queryparser搜素,会将搜索条件分词
    * @throws IOException
    */
    @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();

  • 相关阅读:
    统计字符串中每个字母出现的次数
    三次握手和四次挥手
    select后面不能包含group by 后面没有的列
    常用adb命令
    replace和replaceAll的区别
    java统计一个字符串中某个字串出现的次数
    大厂如何解决分布式事务
    ADB 用法大全
    PBN飞越转弯Flyover衔接TF、CF航段保护区组图
    PBN旁切转弯保护区组图
  • 原文地址:https://www.cnblogs.com/danxun/p/12363158.html
Copyright © 2020-2023  润新知