Java luence 介绍

java luence 组件介绍

Lucene是一个高性能的全文搜索引擎库,它不是一个完整的全文搜索引擎,而是一个全文搜索引擎的库,它可以帮助开发者在应用中实现全文搜索功能。

Lucene的主要组件包括:

  1. IndexWriter: 用于创建索引的主要类。它将文档加入索引,可以从索引中删除文档,也可以更新索引。

  2. Directory: 索引的存储方式。Lucene允许索引存储在几种不同的地方,如磁盘、内存等。

  3. Analyzer: 文本分析器,用于分析文本以产生索引项。(这个是重点)

  4. Document: 一个包含各种字段的容器,这些字段最终被建入索引。

  5. Field: 文档的一个组成部分,包含了一个名字和一串值。

  6. IndexSearcher: 用于执行搜索查询并返回查询结果的类。

  7. Query: 查询对象,代表用户的搜索查询条件。

  8. QueryParser: 用于解析用户输入的查询字符串并生成相应的Query对象。

    ScoreDocs: 一个Searcher.search()方法的结果,它包含了与查询条件相匹配的文档,以及它们的相关度分数。

  9. Term: 索引中的最小单位,表示文档的一个特定词。

  10. 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();
        }
    }
}

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值