lucene实例

来源:互联网 发布:淘宝mac版官方下载 编辑:程序博客网 时间:2024/06/07 11:18

一、lucene简介

lucene是一个全文检索工具包,用于对大量数据,进行基于关键字查询。通常经过分词、建立索引、基于索引查询的过程。

二、lucene知识点

1、Directory,索引库,如内存索引(RAMDirectory)、硬盘上索引(FSDirectory)。还包括索引库控制IndexWriterConfig,包括三种方式:

a)IndexWriterConfig.OpenMode.CREATE,创建或覆盖已经存在的索引;

a)IndexWriterConfig.OpenMode.APPEND,追加已经存在的索引;

a)IndexWriterConfig.OpenMode.CREATE_OR_APPEND,创建或追加已经存在的索引;

2、Document,文档的建立,在lucene中,索引的建立和索引的查询都是基于文档的,需要注意的是文档中Field属性,主要包括以下几项:

a)tokenized,即Analyzer把输入的字符串流解析为单词序列,也就是token流,或者说tokenized;

  b)indexed,即加入到索引中;

  c)Field.Store ,是否将原始串存储。

3、Field,文档域,下面相关模式:

   a)StringField,索引(indexed),不切词(no tokenized),也就是整个串就是一个token;

    b)TextField  ,索引(indexed),切词(tokenized);

   c)StoredField ,不索引(no indexed),不切词(no tokenized),仅进行存储,便于在结果中查看;

    d)IntPoint  ,索引,可用于范围查询;

    e)LongPoint,索引,可用于范围查询;

    f)FloatPoint,索引,可用于范围查询;

    g)DoublePoint,索引,可用于范围查询;

  h)SortedDocValuesField,索引,可用于排序查询;

   i)SortedSetDocValuesField,索引,可用于集合排序查询;

    j)NumericDocValuesField,指定文档分数。

4、Term,切词,也就是把需要建立索引的句子切分,分解成一个一个的单词,

通常使用Analyzer进行切分,analyzer切分有多种具体的实现方式,下面列出部分:

    a)StandardAnalyzer,基于字的切分;

    b)CJKAnalyzer ,二元覆盖,即基于两个字的切分,这时会出现其中一个字重叠的情况;

    c)HanLPAnalyzer , 汉语言的一种分词方式,一会我们将使用这个做实例介绍。

5、IndexWriter,索引建立,将之前建立的索引加入索引库中 ,需要注意的是,可以使用term对文档进行唯一定位。

索引库的操作有:

    a)addDocument ,添加索引;

    b)updateDocuments,修改索引;

  c)deleteDocuments,删除索引;

6、IndexSearcher, 索引查询,索引的查询方法有多种方式,即Query下面列出部分:

    a)QueryParser,查询分词列;

    b)RangeQuery,区间查询;

    c)PrefixQuery,前缀查询;

   d)TermQuery,基本词查询,查询不切分的字段;

    e)MultiTermQuery,多词查询;

    f)WildcardQuery,通配符查询,注意此查询很慢,且开头不能使用*;

    g)BooleanQuery,布尔查询;

    h)FieldScoreQuery,函数查询。

    i)FuzzyQuery, 模糊查询,也就是根据相似度查询,

三、lucene实例

1、添加maven依赖

<properties>    <lucene.version>6.5.0</lucene.version></properties><dependencies>    <dependency>        <groupId>org.apache.lucene</groupId>        <artifactId>lucene-core</artifactId>        <version>${lucene.version}</version>    </dependency>    <dependency>        <groupId>org.apache.lucene</groupId>        <artifactId>lucene-queryparser</artifactId>        <version>${lucene.version}</version>    </dependency>    <!-- 分词器 -->    <dependency>        <groupId>org.apache.lucene</groupId>        <artifactId>lucene-analyzers-smartcn</artifactId>        <version>${lucene.version}</version>    </dependency>    <dependency>        <groupId>org.apache.lucene</groupId>        <artifactId>lucene-analyzers-common</artifactId>        <version>${lucene.version}</version>    </dependency>    <dependency>        <groupId>com.hankcs.nlp</groupId>        <artifactId>hanlp-lucene-plugin</artifactId>        <version>1.1.2</version>    </dependency></dependencies>

2、代码实例

public class LuceneMain {    public static void main(String[] args) {        createIndex();        indexSearch();    }    //建索引    static void createIndex(){        HanLPAnalyzer analyzer = new HanLPAnalyzer();        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);        indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);        Directory directory = null;//        directory = new RAMDirectory();  //内存索引        IndexWriter indexWriter = null;        try {            directory = FSDirectory.open(Paths.get("/home/mong/luceneindex/testIndex1"));            indexWriter = new IndexWriter(directory,indexWriterConfig);        } catch (IOException e) {            e.printStackTrace();        }        Document doc1 = new Document();        doc1.add(new StringField("title","banana", Field.Store.YES));        doc1.add(new TextField("content","香蕉,3元一斤", Field.Store.YES));        Document doc2 = new Document();        doc2.add(new StringField("title","pearl", Field.Store.YES));        doc2.add(new TextField("content","梨子,2元一斤", Field.Store.YES));        try {////            //添加索引//            List<Document> documentList = Arrays.asList(doc1,doc2);//            indexWriter.addDocuments(documentList);////            //删除索引//            indexWriter.deleteDocuments(new Term("fruitId","banana"));            //更新索引            indexWriter.updateDocument(new Term("fruitId","banana"),doc1);            indexWriter.updateDocument(new Term("fruitId","pearl"),doc2);            indexWriter.commit();        } catch (IOException e) {            e.printStackTrace();        }finally {            try{                indexWriter.close();                directory.close();            }catch (Exception e){                e.printStackTrace();            }        }    }    //索引查询    static void indexSearch(){        Directory directory = null;        try{            directory = FSDirectory.open(Paths.get("/home/mong/luceneindex/testIndex1"));            DirectoryReader directoryReader = DirectoryReader.open(directory);            IndexSearcher searcher = new IndexSearcher(directoryReader);            HanLPAnalyzer analyzer = new HanLPAnalyzer();            QueryParser parser = new QueryParser("content",analyzer);            Query query1 = parser.parse("2元");//            Term term1 = new Term("content","?子*");//            WildcardQuery query = new WildcardQuery(term1);            TermQuery query2 = new TermQuery(new Term("title","pearl"));            BooleanQuery.Builder builder = new BooleanQuery.Builder();            builder.add(query1, BooleanClause.Occur.MUST);            builder.add(query2, BooleanClause.Occur.MUST);            BooleanQuery query = builder.build();            TopDocs topDocs = searcher.search(query, 10);            if(null != topDocs){                System.out.println("find items :" + topDocs.totalHits);                for(int i=0; i<topDocs.scoreDocs.length;i++){                    Document doc = searcher.doc(topDocs.scoreDocs[i].doc);                    System.out.println("title : "+doc.get("title"));                    System.out.println("content : "+doc.get("content"));                }            }            directory.close();            directoryReader.close();        }catch (Exception e){        }    }}

输出结果:

find items :1
title : pearl
content : 梨子,2元一斤

原创粉丝点击