Lucene Solr 811 --- slor+Lucene入门

快来打我* 2022-11-27 12:07 326阅读 0赞

在这里插入图片描述

文章目录

  • solr
  • lucene
    • 倒排索引
    • 实际举例
    • lucene API 介绍
      • 创建项目
      • 创建索引
      • 查看索引
      • 从索引查询

solr

Solr是一个高性能,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。

lucene

Lucene是apache jakarta项目的一个子项目,是一个开放源代码的全文检索引擎开发工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

倒排索引

我们一般情况下,先找到文档,再在文档中找出包含的词;
在这里插入图片描述
倒排索引则是这个过程反过来,用词,来找出它出现的文档.
在这里插入图片描述

实际举例






















文档编号 文档内容
1 全文检索引擎工具包
2 全文检索引擎的架构
3 查询引擎和索引引擎

分词结果






















文档编号 分词结果集
1 {全文,检索,引擎,工具,包}
2 {全文,检索,引擎,的,架构}
3 {查询,引擎,和,索引,引擎}

倒排索引



















































编号 单词 文档编号列表
1 全文 1,2
2 检索 1,2
3 引擎 1,2,3
4 工具 1
5 1
6 架构 2
7 查询 3
8 索引 3

lucene API 介绍

创建项目

在这里插入图片描述

创建索引

新建 maven 项目,添加依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>cn.tedu</groupId>
  7. <artifactId>lucene-demo</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <dependencies>
  10. <dependency>
  11. <groupId>org.apache.lucene</groupId>
  12. <artifactId>lucene-core</artifactId>
  13. <version>8.1.1</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>junit</groupId>
  17. <artifactId>junit</artifactId>
  18. <version>4.12</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.apache.lucene</groupId>
  22. <artifactId>lucene-analyzers-smartcn</artifactId>
  23. <version>8.1.1</version>
  24. </dependency>
  25. </dependencies>
  26. <build>
  27. <plugins>
  28. <plugin>
  29. <groupId>org.apache.maven.plugins</groupId>
  30. <artifactId>maven-compiler-plugin</artifactId>
  31. <version>3.8.0</version>
  32. <configuration>
  33. <source>1.8</source>
  34. <target>1.8</target>
  35. </configuration>
  36. </plugin>
  37. </plugins>
  38. </build>
  39. </project>

创建测试类,添加以下代码

  1. package lucendemo;
  2. import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
  3. import org.apache.lucene.document.*;
  4. import org.apache.lucene.index.IndexWriter;
  5. import org.apache.lucene.index.IndexWriterConfig;
  6. import org.apache.lucene.store.FSDirectory;
  7. import org.junit.Test;
  8. import java.io.File;
  9. import java.io.IOException;
  10. public class Test1 {
  11. String[] a = {
  12. "3, 华为 - 华为电脑, 爆款",
  13. "4, 华为手机, 旗舰",
  14. "5, 联想 - Thinkpad, 商务本",
  15. "6, 联想手机, 自拍神器"
  16. };
  17. @Test
  18. public void test1() throws IOException {
  19. //把索引生成到d:/abc 目录
  20. //需要封装这个目录
  21. FSDirectory d = FSDirectory.open(new File("d:/abc").toPath());
  22. //创建中文分词工具 SmartChineseAnlyzer
  23. IndexWriterConfig conf = new IndexWriterConfig(new SmartChineseAnalyzer());
  24. //创建索引输出工具 IndexWriter
  25. IndexWriter writer = new IndexWriter(d, conf);
  26. //循环处理四篇文档,生成倒排索引输出
  27. for (String s:a){
  28. String[] a = s.split(",\\s*");
  29. //[商品id,名称,卖点]
  30. //三个商品数据,要封装到Document对象
  31. Document doc = new Document();
  32. doc.add(new LongPoint("id",Long.parseLong(a[0])));
  33. doc.add(new StoredField("id",Long.parseLong(a[0])));
  34. doc.add(new TextField("title",a[1], Field.Store.YES));
  35. doc.add(new TextField("sellPoint",a[2],Field.Store.YES));
  36. writer.addDocument(doc);
  37. }
  38. writer.flush();
  39. writer.close();
  40. }
  41. }

查看索引

运行 luke
运行lucene 8.1.1中的luke应用程序,指定索引的存放目录
在这里插入图片描述
查看文档
在这里插入图片描述
指定分词器,并测试分词
在这里插入图片描述
在这里插入图片描述
拆词效果并不是很好

查询测试
在这里插入图片描述

  1. id的查询
    在这里插入图片描述

从索引查询

  • 在测试类中添加 test2() 测试方法

    package lucendemo;

    import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
    import org.apache.lucene.document.;
    import org.apache.lucene.index.
    ;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.ScoreDoc;
    import org.apache.lucene.search.TermQuery;
    import org.apache.lucene.search.TopDocs;
    import org.apache.lucene.store.FSDirectory;
    import org.junit.Test;

    import java.io.File;
    import java.io.IOException;
    public class Test1 {

    1. String[] a = {
    2. "3, 华为 - 华为电脑, 爆款",
    3. "4, 华为手机, 旗舰",
    4. "5, 联想 - Thinkpad, 商务本",
    5. "6, 联想手机, 自拍神器"
    6. };
    7. @Test
    8. public void test2() throws IOException {
    9. //封装d:/abc文件夹
    10. FSDirectory d = FSDirectory.open(new File("d:/abc").toPath());
    11. //创建索引读取工具:IndexReader
    12. IndexReader reader = DirectoryReader.open(d);
    13. //创建查询器:IndexSearch
    14. IndexSearcher searcher = new IndexSearcher(reader);
    15. //封装查询的关键词和查询的数量
    16. TermQuery q = new TermQuery(new Term("title", "华为"));
    17. //用查询器执行查询,得到的查询结果[{id:0,score:0.556},{id:2,score:0.34},{....}]
    18. TopDocs topDocs = searcher.search(q, 20);
    19. //遍历处理查询结果
    20. for (ScoreDoc sdoc: topDocs.scoreDocs) {
    21. int id = sdoc.doc;
    22. float score = sdoc.score;
    23. Document doc = searcher.doc(id);
    24. System.out.println(id);
    25. System.out.println(score);
    26. System.out.println(doc.get("id"));
    27. System.out.println(doc.get("score"));
    28. System.out.println(doc.get("sellPoint"));
    29. System.out.println("----------------------------------------");
    30. }
    31. }

    }

发表评论

表情:
评论列表 (有 0 条评论,326人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Solr/Lucene打分算法

    摘要: 检索模型也就是文档和查询词的相关度的评分方法。Lucene使用布尔模型来确定哪些文档匹配上查询词,使用向量空间模型(VSM)来对这些文档评分。 核心 评分算法中

    相关 lucene/solr去重

    \[b\]\[size=medium\] 什么是facet呢?参考wiki 比如在taobao或者京东买东西的时候,搜索手机,出现好多品牌、价格区间等分类信息,这