搜索引擎Lucene-01

第一步,引入JAR包

 <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-core</artifactId>
            <version>7.3.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-common -->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-common</artifactId>
            <version>7.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queryparser</artifactId>
            <version>7.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-highlighter</artifactId>
            <version>7.3.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

第二步,生撸代码

package com.tmall.springbootdemo.common.search.lucene;

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;
import org.apache.lucene.document.StoredField;
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.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import java.nio.file.Paths;


public class LuceneDemo1 {
     

    /**
     * 创建索引库,并写入文档
     * @throws Exception
     */
    public static void index()throws Exception{
     
        //索引存放目录
        String indexPath = "/Users/pauljiang/Desktop/goodgoodstudy/spring-boot-demo/src/main/resources/lucene/index";

        // 创建使用的分词器
        Analyzer analyzer = new StandardAnalyzer();

        // 存放到文件系统中
        Directory dir = FSDirectory.open(Paths.get(indexPath));

        // 索引配置对象
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);

        // 设置索引库的打开模式:新建、追加、新建或追加
        indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);

        // 创建索引写对象
        IndexWriter indexWriter = new IndexWriter(dir,indexWriterConfig);

        // 创建document
        Document doc = new Document();

        // 往document中添加 商品id字段
        doc.add(new StoredField("prodId", "p0001"));

        // 往document中添加 商品名称字段
        doc.add(new TextField("name", "ThinkPad", Field.Store.YES));

        // 将文档添加到索引
        indexWriter.addDocument(doc);

        // 刷新
        indexWriter.flush();

        // 提交
        indexWriter.commit();

        // 关闭 会提交
        indexWriter.close();
        dir.close();
    }


    /**
     * 检索文档
     */
    public static void search(String indexDir,String q)throws Exception{
     
        // 得到读取索引文件的路径
        Directory dir = FSDirectory.open(Paths.get(indexDir));
        // 通过dir得到的路径下的所有的文件
        IndexReader reader = DirectoryReader.open(dir);
        // 建立索引查询器
        IndexSearcher searcher = new IndexSearcher(reader);
        // 实例化分析器
        Analyzer analyzer = new StandardAnalyzer();
        /*
         * 建立查询解析器:第一个参数是要查询的字段; 第二个参数是分析器Analyzer
         */
        QueryParser parser = new QueryParser("name", analyzer);
        // 根据传进来的参数查找
        Query query = parser.parse(q);
        /*
         * 第一个参数是通过传过来的参数来查找得到的query; 第二个参数是要出查询的行数
         */
        TopDocs hits = searcher.search(query,10);
        // 遍历hits.scoreDocs,得到scoreDoc
        /*
         * ScoreDoc:得分文档,即得到文档 scoreDocs:代表的是topDocs这个文档数组
         *
         */
        for (ScoreDoc hit : hits.scoreDocs) {
     
            Document document = searcher.doc(hit.doc);
            System.out.println("prodId:" + document.get("prodId"));
            System.out.println("name:" + document.get("name"));
            System.out.println("文档得分:" + hit.score);
            // 关闭reader
            reader.close();
        }
    }


    /**
     * 删除索引库
     * @param indexPath
     * @throws Exception
     */
    public static void deleteIndex(String indexPath)throws Exception{
     
        // 存放到文件系统中
        Directory dir = FSDirectory.open(Paths.get(indexPath));
        // 创建使用的分词器
        Analyzer analyzer = new StandardAnalyzer();
        // 索引配置对象
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
        // 创建索引写对象
        IndexWriter indexWriter = new IndexWriter(dir,indexWriterConfig);
        //删除全部索引
        indexWriter.deleteAll();
        //关闭索引库
        indexWriter.close();

    }

}

三、简单说明

IndexWriter
写索引,是索引过程的核心组件,这个类负责创建新索引或者打开已有索引,以及向索引中添加、删除或更新被索引文档的信息。可以提供针对索引文件的写入操作,但不能读取或搜索。IndexWriter不能直接索引文本,需要Analyzer将文本分割成独立的单词。

Directory
描述了Lucene索引的存放位置,它是一个抽象类,它的子类负责具体指定索引的存储路径,利用FSDirectory.open方法获取真实文件在文件系统的存储路径,然后将它们依次传递给IndexWriter类的构造方法。

Analyzer
Analyzer是IndexWriter的构造方法指定的,它负责从被索引文本文件中提取词汇单元,并剔除剩下的无用信息。非纯文本文件需要转为文本文档。Analyzer是一个抽象类,Lucene提供了几个类实现它。有的用于跳过停用词(stop words,指一些常用但不能帮助区分文档的词,如a、an、the、in和on等);有的用于把词汇单元转换成小写形式,以使搜索过程可以忽略大小写差别。分析器的分析对象是文档,该文档包含一些分离的能被索引的域

Document
文档对象代表一些域(field)的集合。文档的域代表文档和文档相关的一些元数据。

Field
索引中的每个文档都包含一个或多个不同名称的域即Field类,每个域都有一个域名和对应的域值,以及一组选项来精确控制Lucene索引操作各个阈值。文档可能拥有不止一个同名的域,在这种情况下,域的值就按照索引操作顺序添加进去。在搜索时,所有域的文本就好像连接在一起,作为一个文本域来处理。

IndexSearcher
用于搜索由IndexWriter类创建的索引(以只读方式打开索引):它公开了几个搜索方法,是连接索引的中心环节。需要利用Directory实例来掌控前期创建的索引,然后才能提供大量的搜索方法,其中一些方法在它的抽象父类Searcher中实现。最简单的搜索方式是将单个Query对象和int topN计数作为该方法的参数,并返回一个TopDocs对象。

Term
搜索功能的基本单元,包含一对字符串元素:域名和单词(或域文本值)。Term对象还与索引操作有关。搜索过程中可以创建Term对象,并和TermQuery对象一起使用 要寻找contents域中包含单词lucene的前10个文档,并按照降序排列这10个文档。

TermQuery
TermQuery对象是从抽象父类Query派生而来,可以在声明左侧使用Query类型。

·Query
Lucene包含许多具体的Query(查询 )子类,包括TermQuery、BooleanQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、TermRangeQuery、NumericRangeQuery、FilteredQuery和SpanQuery。Query是它们共同的抽象父类。其中setBoost(float)方法给某个子查询赋予相对其他子查询对评分更高的权重。

·TermQuery
Lucene提供最基本的查询类型,用来匹配指定区域中包含特定项的文档。

·TopDocs
负责展示搜索结果,是一个简单的指针容器,指针一般指向前N个排名的搜索结果,搜索结果即匹配查询条件的文档。TopDocs会记录前N个结果中每个结果的int docID(用以恢复文档)和浮点型分数。

你可能感兴趣的:(lucene,搜索引擎)