java luence 组件介绍
Lucene是一个高性能的全文搜索引擎库,它不是一个完整的全文搜索引擎,而是一个全文搜索引擎的库,它可以帮助开发者在应用中实现全文搜索功能。
Lucene的主要组件包括:
-
IndexWriter
: 用于创建索引的主要类。它将文档加入索引,可以从索引中删除文档,也可以更新索引。 -
Directory
: 索引的存储方式。Lucene允许索引存储在几种不同的地方,如磁盘、内存等。 -
Analyzer
: 文本分析器,用于分析文本以产生索引项。(这个是重点) -
Document
: 一个包含各种字段的容器,这些字段最终被建入索引。 -
Field
: 文档的一个组成部分,包含了一个名字和一串值。 -
IndexSearcher
: 用于执行搜索查询并返回查询结果的类。 -
Query
: 查询对象,代表用户的搜索查询条件。 -
QueryParser
: 用于解析用户输入的查询字符串并生成相应的Query对象。ScoreDocs
: 一个Searcher.search()
方法的结果,它包含了与查询条件相匹配的文档,以及它们的相关度分数。 -
Term
: 索引中的最小单位,表示文档的一个特定词。 -
demo
import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.store.RAMDirectory; import org.apache.lucene.util.Version; import java.io.IOException; public class LuceneExample { public static void main(String[] args) throws Exception { // 创建索引 IndexWriter writer = new IndexWriter(new RAMDirectory(), new StandardAnalyzer(Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED); Document doc = new Document(); doc.add(new Field("content", "Hello World", Field.Store.YES, Field.Index.ANALYZED)); writer.addDocument(doc); writer.close(); // 搜索索引 IndexSearcher searcher = new IndexSearcher(writer.getReader()); QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "content", new StandardAnalyzer(Version.LUCENE_CURRENT)); Query query = parser.parse("Hello"); ScoreDoc[] hits = searcher.search(query, null, 1000).scoreDocs; // 处理搜索结果 for (int i = 0; i < hits.length; i++) { Document hitDoc = searcher.doc(hits[i].doc); System.out.println(hitDoc.get("content")); } searcher.close(); writer.close(); } }
luence的核心是分析器Analyzer
分析器就是分词器可以将一段文字拆分成不同的内容,如将中华人民共和国拆分成 中华 人民 共和国三个token
Analyzer分析器设计遵循一个基本过程:
- 文档
- token对象
- 过滤器链表,比如,小写过滤,停用词过滤,自定义逻辑过滤
- 生成的token对象将由索引模块,生成关于term分词的倒排索引
无论是内置的还是自定义的Analyzer分析器,底层都由三个基本模块组成,分别是:字符过滤器,tokenize和token 过滤器。
什么是token?
Lucene中的分析器是一个文本分析的功能。简单地说,它接收文本(比如文档)分解成单词,并返回token对象流。 (token是分词后的结果 比方说 “中国” 被分成 token 1 中 token 2 国)
什么是term?
Analyzer从文档中提取出token对象后,与其field进行结合后,就形成term分词概念了。
Field + Token = Term
也就是说es中字段的值会被分词后建立倒排索引,用于查询
Tokenizer
tokenize基于规则将一个字符串分解成多个子串,比方说按照空格,按照字典表等。
Filter
Filter对Tokenizer返回的一系列token列表进行基于规则的操作。比如,LowerCaseFilter将接受的token列表转换成小写。
总的来说:
Analyzer的工作原理如下
Tokenizert即是第一个分析阶段,有且只有一个,用来读取原始文件并转换成token对象列表。Filter是第二个分析阶段,允许有多个filters组成一个过滤器列表,用来将输入的token对象列表进行分析,输出后仍然是token对象列表。
以SimpleAnalyzer 为例
SimpleAnalyzer 源码中有一个createCompoents方法用于定义使用哪些Tokenizert和Filter
下面给出测试分词结果的方法
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.junit.Assert;
import org.junit.Test;
public class LuceneTokenTest {
@Test
public void testTokenizer() {
Analyzer analyzer = new SimpleAnalyzer();
String text = "Lucene is a great tool for text indexing and search";
TokenStream tokenStream = analyzer.tokenStream("text", text);
try {
CharTermAttribute termAttribute =
tokenStream.addAttribute(CharTermAttribute.class);
tokenStream.reset();
while (tokenStream.incrementToken()) {
System.out.println(termAttribute.toString());
}
tokenStream.end();
tokenStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}