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

  • 相关阅读:
    Web SSH 客户端Ajaxterm安装
    Ubuntu Manpage: ajaxterm
    Web工程师的工具箱 | 酷壳
    EF架构~二级域名中共享Session
    VS~通过IIS网站启用"域名"调试
    EF架构~豁出去了,为了IOC,为了扩展,改变以前的IRepository接口
    MVVM架构~knockoutjs系列之文本框数符长度动态统计功能
    JS~jwPlayer为js预留的回调方法大总结
    晒网站:应用诺贝尔奖得主罗斯匹配算法的交友网站,具有更符合用户大网撒鱼心理的新颖用户使用模式
    ZOJ 2334(Monkey King-左偏树第一题)
  • 原文地址:https://www.cnblogs.com/danxun/p/12363158.html
Copyright © 2011-2022 走看看