lucene&solr全文检索_5索引的维护

增加新内容的时候,或者删除的时候我们需要对索引进行增删改查来进行索引的维护。

先上代码:

package come.me.lucene;
//索引维护
import java.io.File;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.queryparser.flexible.standard.nodes.NumericRangeQueryNode;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.jupiter.api.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class LuceneManager {
    public IndexWriter getIndexWriter() throws Exception{
        Directory directory =FSDirectory.open(new File("D:\\temp\\index"));//创建document对象
        Analyzer analyzer=new StandardAnalyzer();//官方推荐标准分析器
        IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);//第一个变量为用的lucene版本号,第二个为分析器对象
        return new IndexWriter(directory,config);

    }

    @Test
    public void addDocument() throws Exception {
        //索引库存放路径
        Directory directory = FSDirectory.open(new File("D:\\temp\\0108\\index"));

        IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, new IKAnalyzer());
        //创建一个indexwriter对象
        IndexWriter indexWriter = new IndexWriter(directory, config);
        //创建一个Document对象
        Document document = new Document();
        //向document对象中添加域。
        //不同的document可以有不同的域,同一个document可以有相同的域。
        document.add(new TextField("filename", "新添加的文档", Store.YES));
        document.add(new TextField("content", "新添加的文档的内容", Store.NO));
        document.add(new TextField("content", "新添加的文档的内容第二个content", Store.YES));
        document.add(new TextField("content1", "新添加的文档的内容要能看到", Store.YES));
        //添加文档到索引库
        indexWriter.addDocument(document);
        //关闭indexwriter
        indexWriter.close();

    }

    //索引全部删除
    @Test
    void testDeleteAll() throws Exception {
        IndexWriter indexwriter =getIndexWriter();
        indexwriter.deleteAll();
        indexwriter.close();
    }
    //根据条件删除
    @Test
    void testDelete() throws Exception {
        IndexWriter indexwriter =getIndexWriter();
        Query query=new TermQuery(new Term("fileName","apache"));
        indexwriter.deleteDocuments(query);
        indexwriter.close();
    }
    //修改索引
    @Test
    void testUpdate() throws Exception {
        IndexWriter indexwriter =getIndexWriter();
        Document doc=new Document();
        doc.add(new TextField("fileN","jsjs",Store.YES));
        //先删除lucene再加上doc的内容
        indexwriter.updateDocument(new Term("fileName","lucene"),doc,new IKAnalyzer());
    }

    public IndexSearcher getIndexSearcher() throws Exception{
//        第一步:创建一个Directory对象,也就是索引库存放的位置。
        Directory directory =FSDirectory.open(new File("D:\\temp\\index"));
//        第二步:创建一个indexReader对象,需要指定Directory对象。
        IndexReader indexreader=DirectoryReader.open(directory);
//        第三步:创建一个indexsearcher对象,需要指定IndexReader对象
        return new IndexSearcher(indexreader);
    }

    public void print(IndexSearcher indexSearcher,Query query) throws Exception {
        TopDocs topDocs = indexSearcher.search(query,20);
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc : scoreDocs) {
            int doc = scoreDoc.doc;
            Document doc2 = indexSearcher.doc(doc);
            //文件名称
            System.out.println("文件名称");
            String fileName=doc2.get("fileName");
            System.out.println(fileName);
            //文件内容
            System.out.println("文件内容");
            String fileContent=doc2.get("fileContent");
            System.out.println(fileContent);
            //文件路径
            System.out.println("文件路径");
            String filePath=doc2.get("filePath");
            System.out.println(filePath);
            //文件大小
            System.out.println("文件大小");
            String fileSize=doc2.get("fileSize");
            System.out.println(fileSize);
            System.out.println("-------------------");
        }
    }

    //查询所有
    @Test
    void testMatchAllDocsQuery() throws Exception {
        IndexSearcher indexSearcher = getIndexSearcher();
        Query query=new MatchAllDocsQuery();
        print(indexSearcher,query);
        //关闭资源
        indexSearcher.getIndexReader().close();
    }

    //按数值范围查找
    @Test
    void testNumericRangeQuery() throws Exception {
        IndexSearcher indexSearcher = getIndexSearcher();
        Query query = NumericRangeQuery.newLongRange("size", 1l, 1000l, true, true);
        print(indexSearcher,query);
        //关闭资源
        indexSearcher.getIndexReader().close();
    }

    //组合查询
    @Test
    void testBooleanQuery() throws Exception {
        IndexSearcher indexSearcher = getIndexSearcher();
        BooleanQuery booleanqurey =new BooleanQuery();
        Query q1=new TermQuery(new Term("fileName","apache"));
        Query q2=new TermQuery(new Term("fileName","lucene"));
        booleanqurey.add(q1, Occur.MUST);//must对应and,must not 对应not,should对应or
        booleanqurey.add(q2, Occur.SHOULD);//本例子为必须有q1但是有没有q2都可以
        //关闭资源
        indexSearcher.getIndexReader().close();
    }

    //条件解析的对象查询
    @Test
    void testQueryParser() throws Exception {
        IndexSearcher indexSearcher = getIndexSearcher();
        QueryParser queryparser =new QueryParser("fileName",new IKAnalyzer());//第一个参数为默认查询的域名
        Query query = queryparser.parse("fileContent:lucene");//如果在此输入的域名与默认域名冲突,则默认域名会失效,如果搜索的内容为一段话则会被分析器分析之后再查询,例如what is your 则包含what或者your的都要
        print(indexSearcher, query);
        //关闭资源
        indexSearcher.getIndexReader().close();
    }

    //多个默认域查询
    @Test
    void testMultiFieldQueryParser() throws Exception {
        IndexSearcher indexSearcher = getIndexSearcher();
        String[] fields= {"fileName","fileContent"};
        MultiFieldQueryParser MFqueryparser =new MultiFieldQueryParser(fields,new IKAnalyzer());//第一个参数为数组名
        Query query = MFqueryparser.parse("lucene");
        print(indexSearcher, query);
        //关闭资源
        indexSearcher.getIndexReader().close();
    }
}

    1.索引的添加  

      步骤:

      向索引库中添加document对象。

      第一步:先创建一个indexwriter对象

      第二步:创建一个document对象

      第三步:把document对象写入索引库

      第四步:关闭indexwriter。

    2.索引的删除

      (1:删除全部

       (2:根据条件删除

    3.索引的修改

    4.索引的查询:

    

      对要搜索的信息创建Query查询对象,Lucene会根据Query查询对象生成最终的查询语法,类似关系数据库Sql语法一样Lucene也有自己的查询语法,比如:“name:lucene”表示查询Field的name为“lucene”的文档信息。

    1)查询所有

    2)精准查询已经在上个博客中介绍

    3)数值范围查询

    4)组合条件查询

    5)用于语法查询

    6)多个默认域查询

注意:可在每个方法中输出query来查看查询的语法:

1、基础的查询语法,关键词查询:

域名+“:”+搜索的关键字

例如:content:java

2、范围查询

域名+“:”+[最小值 TO 最大值]

例如:size:[1 TO 1000]

范围查询在lucene中支持数值类型,不支持字符串类型。在solr中支持字符串类型。

3、组合条件查询

1)+条件1 +条件2:两个条件之间是并且的关系and

例如:+filename:apache +content:apache

2)+条件1 条件2:必须满足第一个条件,应该满足第二个条件

例如:+filename:apache content:apache

3)条件1 条件2:两个条件满足其一即可。

例如:filename:apache content:apache

4)-条件1 条件2:必须不满足条件1,要满足条件2

例如:-filename:apache content:apache


Occur.MUST 查询条件必须满足,相当于and


+(加号)


Occur.SHOULD 查询条件可选,相当于or


空(不用符号)


Occur.MUST_NOT 查询条件不能满足,相当于not非


-(减号)

第二种写法:

条件1 AND 条件2

条件1 OR 条件2

条件1 NOT 条件2

原文地址:https://www.cnblogs.com/tkg1314/p/12250412.html

时间: 2024-09-30 09:40:06

lucene&solr全文检索_5索引的维护的相关文章

lucene&solr全文检索_3查询索引

创建完索引之后,我们需要查询. 百度的查询接口及结果如图所示: 具体步骤已经在上个博客中写到,直接上代码:(由于是一个完整的程序,我把创建索引的代码也post上) package come.me.lucene; import static org.junit.jupiter.api.Assertions.*; import java.io.File; import org.apache.commons.io.FileUtils; import org.apache.lucene.analysis

lucene&solr全文检索_4改进

在之前的程序中我们发现分词不太准确,因此我们可以使用支持中文分词. 分析器的执行过程: 从一个reader字符流开始,创建一个基于reader的tokenizer分词器,经过三个tokenfilter(第一个大写变小写,第二个用回车替换空格,去掉不需要的a,the,and,逗号等)生成tokens.要看分析器的分析效果只需要看tokenstream中的内容就可以了,每个分析器都有一个方法tokenstream,返回一个tokenstream对象. lucene自带中文分析器: standardA

lucene&solr全文检索_7solr后台界面的介绍

接着上个博客,用浏览器打开solr之后的界面: Dashboard:仪表盘,显示了该solr实例开始运行的时间.版本.系统资源,jvm等信息 Logging:solr的运行日志,如果出现问题会告诉你什么问题. Core Admin:solr core 的管理界面.solr core是solr 的一个独立运行实例单位,他可以对外提供索引和搜索服务,一个solr工程可以运行多个solrcore,一个core对应一个索引目录. 可以手动添加solr core: 步骤: 1.复制collection1改

solr全文检索实现原理

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http Get操作提出查找请求,并得到XML/Json格式的返回结果.采用Java5开发,基于Lucene. Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部

Lucene/Solr搜索引擎开发系列 - 第1章 Solr安装与部署(Jetty篇)

一.为何开博客写<Lucene/Solr搜索引擎开发系列>     本人毕业于2011年,2011-2014的三年时间里,在深圳前50强企业工作,从事工业控制领域的机器视觉方向,主要使用语言为C/C++:现就职于一家大型国企所属电子商务公司,主要使用语言为Java,负责公司新一代搜索引擎的开发工作,故开此系列来总结自己在Lucene/Solr上的学习历程,同时,也希望能给予对搜索引擎开发有兴趣的朋友一些帮助和启发. 二.Lucene和Solr简要介绍     Lucene是apache软件基金

Lucene/Solr 搜索引擎开发 第1章

一.本章思维导图   二.Solr的安装和部署 1.介绍Lucene和Solr分别是什么的?     Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言).Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎.    

Lucene/Solr开发经验

1.开篇语2.概述3.渊源4.初识Solr5.Solr的安装6.Solr分词顺序7.Solr中文应用的一个实例8.Solr的检索运算符 [开篇语]按照惯例应该写一篇技术文章了,这次结合Lucene/Solr来分享一下开发经验. Lucene是一个使用Java语言写的全文检索开发包(API),利用它可以实现强大的检索功能,它的详细介绍大家可以去Google上搜索一下,本文重点放在Solr相关的讨论上. [概述]目前国内研究Solr的人不多,而且大多是因为项目开发需要.Solr师承Lucene,为

Solr全文检索框架

概述: 什么是Solr? Solr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务.Solr可以独立运行在Jetty.tomcat.webLogic.webShell等这些Servlet容器中. 全文检索服务(也叫做全文搜索):  服务    是War包. ES框架 也是基于Lucene,Lucene(是工具包   jar) 服务器:   Tomcat  Jetty(内嵌服务器)  免费的(私企) WebLogic(Oracle)政府    Oracle

Lucene/Solr学习笔记(一)

solr简介 Solr是一个开源的,企业级搜索服务器.Solr可以理解为Lucene的服务器化产品.它使用java编写,遵循http协议和xml协议,使用多种数据格式(如json,xml)传递数据. 但她不是对Lucene的一次简单封装,Solr的大多数特征都与Lucene不同.Solr 和 Lucene 的界限经常是模糊的.以下是Solr的主要特性: 通过HTTP请求来     建立索引和搜索索引 拥有数个缓存 来 加快搜索速度 一个基于web的管理员控制台 运行时做性能统计,包括缓存 命中/