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元一斤
- lucene实例
- lucene的简单实例
- lucene的简单实例
- lucene 搜索入门实例
- lucene简单实例
- lucene的简单实例
- lucene实例使用
- lucene 实例小解.
- lucene入门实例
- lucene简单实例
- lucene简单实例
- lucene简单实例《二》
- lucene的简单实例
- lucene 3实例详解
- lucene&IKAnalyzer入门实例
- lucene简单实例
- 第一个Lucene实例
- Lucene入门实例
- bzoj2818Gcd 莫比乌斯反演
- 数组中的逆序对数
- eventbus使用
- [Unity&Photon]在Unity&Photon基础上如何实现简单的右键移动
- VSFTP的安装
- lucene实例
- Git Server
- 数据库表设计,没有最好只有最适合
- [YTU]_2917(Shape系列-3)
- 一个比较有趣的题:推算今天星期几
- 常用linux日志查询命令
- mybatis-分步查询方式传递多列的值-16
- bzoj2152 聪聪与可可 点分治
- Android隐藏软键盘