1.基础知识

1.相关依赖

1.官网依赖包

官方下载

2.maven

多个maven包版本号要相同

1
2
3
4
5
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>包名</artifactId>
<version>版本号</version>
</dependency>
包名 作用
lucene-core 核心包
lucene-analyzers-common 分词功能
lucene-queryparser 分词查询

2.Luke可视化工具

在Lucene8.0.0以后的版本中官方包中自带Luke,官方原官方项目托管已停止更新,8.0.0以前的可查看现官方项目;

2.Lucene核心类

创建 作用 查询 作用
IndexWriter 写入索引流 IndexReader 读取索引流
Analyzer 分析器 Query 查询方式
Document 文档 indexSearcher 搜索
Field 域 Term 类似域
其他类 作用
Directory
TokenStream
TermAttribute

1.创建索引

1.Analyer

分词器 详解
StandardAnalyzer 默认分词器,中文词会被拆分成单个字
IKAnalyzer 中文分词器,官方项目已停止更新,可用别人开发的项目(maven)

2.Document

文档对象包含域

3.Field

Field类型 数据类型 Analyzed 是否分析 Indexed 是否索引 Stored 是否存储 说明
StringField(FieldName, FieldValue,Filed.Store.YES/NO)) 字符串 N Y Y或N 这个Field用来构建一个字符串Field,但是不会进行分析,会将整个串存储在索引中,比如(订单号,姓名等)
LongPoint/IntPoint(String name, long… point) Long型 Y Y N 可以使用LongPoint、IntPoint等类型存储数值类型的数据。让数值类型可以进行索引。但是不能存储数据,如果想存储数据还需要与StoredField一起使用。
StoredField(FieldName, FieldValue) 重载方法,支持多种类型 N N Y 这个Field用来构建不同类型Field 不分析,不索引,但要Field存储在文档中,可以使用LongPoint以后在使用这个进行存储
TextField(FieldName, FieldValue, Filed.Store.YES/NO) 或 TextField(FieldName, reader) 字符串 或 流 Y Y Y或N 如果是一个Reader, Lucene猜测内容比较多,会采用Unstored的策略.

文件的大小/内容/名称/地址都可以加入域中

2.查询索引

1.Query

搜索方式 作用
TermQuery 根据域名和关键词搜索
RanageQuery 根据范围查询

2.TopDocs

方法/属性 作用 返回值
totalHits 符合搜索条件的文档数量 TotalHits对象 (输出为:n hits)
socreDocs 符合搜索条件的结果 scoreDoc数组
getMaxScore() 返回最大评分
TopDocs() 排序(多个重载方法)
1.ScoreDoc
方法/属性 作用
score 文档的查询分数
doc 文档编号
shardIndex 未知/不常用
2.TotalHits
方法/属性 作用
value 输出数值n(Int)
relation 命中范围(未知/不常用)

3.执行流程

1.创建索引

  1. 指定索引库保存位置

    1
    2
    3
    Path path = new File("地址").toPath();
    Path path = Paths.get("地址);
    Directory directory = FSDirectory.open(path);//需要抛出IO异常
  2. 新建分词器

    1
    Analyzer analyzer = new 分词器名();
  3. 新建写入索引配置对象

    1
    IndexWriterConfig config= new IndexWriterConfig(analyzer);//不写参数代表默认配置
  4. 新建写入索引对象

    1
    IndexWriter indexWriter = new IndexWriter(directory,config);
  5. 创建文档对象

    1
    Document document = new Document();//建议1个文档对应所有类型的域各一个
  6. 创建域

    文件的大小/内容/名称/地址都可以加入域中

    1
    Field field = new 域类型("域名","内容",Filed.Store.YES);//yes代表存储,no代表不存储.
  7. 添加一条记录

    1
    document.add(field);
  8. 将记录添加到索引事例中

    1
    indexWriter.addDocument(document);
  9. 关闭索引事例

    1
    indexWriter.close();

2.演示分词效果

  1. 新建分词对象

    1
    Analyzer anlyzer= new 分词对象();
  2. 创建标记流,测试域名

    1
    TokenStream tokenStream = anlyzer.tokenStream("域名","事例文字或者流");//域名可不写
  3. 添加功能

    名称 作用 注意事项
    CharTermAttribute 表示token本身的内容
    OffsetAttribute 表示token的首字母和尾字母在原文本中的位置 首字母:startOffset()/尾字母:startOffset()
    TypeAttribute 表示token的词汇类型信息,默认值为word,其它值有<ALPHANUM> <APOSTROPHE> <ACRONYM><COMPANY> <EMAIL> <HOST> <NUM> <CJ>
    FlagsAttribute 与TypeAttribute类似,假设你需要给token添加额外的信息,而且希望该信息可以通过分析链,那么就可以通过flags去传递
    PositionIncrementAttribute 表示当前token相对于前一个token的相对位置,也就是相隔的词语数量,如果两者之间没有停用词,那么该值默认为1 例如“text for attribute”,text和attribute之间的getPositionIncrement为2
    PayloadAttribute 在每个索引位置都存储了payload(关键信息),当使用基于Payload的查询时,该信息在评分中非常有用
    1
    功能类 x = tokenStream.addAttribute(功能名.class);
  4. 重置标记流

    1
    tokenStream.rest();//会抛出IOException
  5. 遍历tokenStream

    1
    2
    3
    while(tokenStream.incrementToken(){//返回flase表示结束
    sout(CharTermAttribute.toString());
    }
  6. 关闭标记流

    1
    2
    tokenStream.end();//待学
    tokenStream.close();

3.查询索引

1.Query子类

  1. 指定索引库位置

    1
    Directory directory = FSDirectory.open(path);
  2. 创建读取索引事例

    1
    IndexReader indexReader = DirectoryReader.open(directory);
  3. 创建搜索对象

    1
    IndexSearcher indexSearcher = new IndexSearcher(indexReader);
  4. 指定搜索方式

    1
    2
    3
    Query query = 搜索方式(term);
    Query query = new TermQuery(new Term("搜索域","关键词"));//1.TermQuery
    LongPoint.RangeQuery("搜索域",startL,endL);//2.RangeQuery
  5. 设置query和显示个数并返回结果

    1
    TopDocs topDocs = indexSearcher.search(query,10);
  6. 显示搜索结果的信息集数组

    1
    ScoreDoc[] scoreDocs = topDocs.scoreDocs;
  7. 显示结果

    1
    2
    3
    4
    5
    for(ScoreDoc scoreDoc:scoreDocs){   
    int docId = scoreDoc.doc; //信息集的id
    Document document = indexSearcher.doc(docId); //通过id获取文档
    System.out.println(document.get("域名")); //根据域名查询内容
    }

2.QueryParser

修改第4部分

1
2
3
4
5
6
//1.创建分词器
Analyzer analyzer = new IKAnalyzer();
//2.创建QueryParaser对象
QueryParser queryParser = new QueryParser("name", analyzer);
//3.创建Query
query = queryParser.parse("lucene是一个java开发的全文检索工具包");

4.管理索引库

1.添加索引

跟添加索引一样的操作

2.删除索引

指定索引库–>1/2—>结束

1.删除所有索引
1
indexWriter.deleteAll();
2.根据查询删除索引
1
indexWriter,deleteDocuments(new Term("域名","关键词"));

3.修改索引

跟添加索引库一样只不过document.add()修改为下列代码

  1. 修改后的文档

    1
    document.add(new TextField("要修改的域名","修改后的内容",存储类型))
  2. 根据搜索关键词替换document

    1
    indexWriter.updateDocument(new Term("域名","关键词"),document);

最后更新: 2019年11月06日 21:15

原始链接: https://airbash.cn/2019/11/02/Apache/Lucene/

赏
× 请我吃糖~
打赏二维码