zoukankan      html  css  js  c++  java
  • 索引维护:添加,删除,修改与维护


     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();

  • 相关阅读:
    LeetCode 24. Swap Nodes in Pairs (两两交换链表中的节点)
    LeetCode 1041. Robot Bounded In Circle (困于环中的机器人)
    LeetCode 1037. Valid Boomerang (有效的回旋镖)
    LeetCode 1108. Defanging an IP Address (IP 地址无效化)
    LeetCode 704. Binary Search (二分查找)
    LeetCode 744. Find Smallest Letter Greater Than Target (寻找比目标字母大的最小字母)
    LeetCode 852. Peak Index in a Mountain Array (山脉数组的峰顶索引)
    LeetCode 817. Linked List Components (链表组件)
    LeetCode 1019. Next Greater Node In Linked List (链表中的下一个更大节点)
    29. Divide Two Integers
  • 原文地址:https://www.cnblogs.com/danxun/p/12363158.html
Copyright © 2011-2022 走看看