Lucene

向右看齐 2023-06-10 16:20 364阅读 0赞

什么是Lucene

  • Lucene是一套用于全文检索和搜寻的开源程序库,由Apache软件基金会支持和提供
  • Lucene提供了一个简单却强大的应用程序接口(API),能够做全文索引和搜寻,在Java开发环境里Lucene是一个成熟的免费开放源代码工具
  • Lucene并不是现成的搜索引擎产品,但可以用来制作搜索引擎产品
  • 官网:http://lucene.apache.org/

用idea写代码

  1. 创建maven项目(new—project——maven)
  2. 添加依赖(pom.xml)
    在这里插入图片描述


    4.10.2
    1. <dependencies>
    2. <dependency>
    3. <groupId>junit</groupId>
    4. <artifactId>junit</artifactId>
    5. <version>4.12</version>
    6. </dependency>
    7. <!-- lucene核心库 -->
    8. <dependency>
    9. <groupId>org.apache.lucene</groupId>
    10. <artifactId>lucene-core</artifactId>
    11. <version>${lunece.version}</version>
    12. </dependency>
    13. <!-- Lucene的查询解析器 -->
    14. <dependency>
    15. <groupId>org.apache.lucene</groupId>
    16. <artifactId>lucene-queryparser</artifactId>
    17. <version>${lunece.version}</version>
    18. </dependency>
    19. <!-- lucene的默认分词器库 -->
    20. <dependency>
    21. <groupId>org.apache.lucene</groupId>
    22. <artifactId>lucene-analyzers-common</artifactId>
    23. <version>${lunece.version}</version>
    24. </dependency>
    25. <!-- lucene的高亮显示 -->
    26. <dependency>
    27. <groupId>org.apache.lucene</groupId>
    28. <artifactId>lucene-highlighter</artifactId>
    29. <version>${lunece.version}</version>
    30. </dependency>
  1. </dependencies>

3.在idea下的这个文件里新建class
在这里插入图片描述

  1. import org.apache.lucene.analysis.Analyzer;
  2. import org.apache.lucene.analysis.standard.StandardAnalyzer;
  3. import org.apache.lucene.document.Document;
  4. import org.apache.lucene.document.Field;
  5. import org.apache.lucene.document.StringField;
  6. import org.apache.lucene.document.TextField;
  7. import org.apache.lucene.index.IndexWriter;
  8. import org.apache.lucene.index.IndexWriterConfig;
  9. import org.apache.lucene.store.Directory;
  10. import org.apache.lucene.store.FSDirectory;
  11. import org.apache.lucene.util.Version;
  12. import org.junit.Test;
  13. import java.io.File;
  14. public class lucencetest {
  15. //创建索引
  16. @Test
  17. public void testCreate() throws Exception{
  18. //1、创建文档对象
  19. Document document =new Document();
  20. // 创建并添加字段信息。参数:字段的名称、字段的值、是否存储,这里选Store.YES代表存储到文档列表。Store.NO代表不存储
  21. document.add(new StringField("id", "1", Field.Store.YES));
  22. // 这里我们title字段需要用TextField,即创建索引又会被分词。StringField会创建索引,但是不会被分词
  23. document.add(new TextField("title","谷歌地图之父跳槽facebook", Field.Store.YES));
  24. //2 索引目录类,指定索引在硬盘中的位置
  25. Directory directory = FSDirectory.open(new File("d:\\indexDir"));
  26. //3 创建分词器对象
  27. Analyzer analyzer = new StandardAnalyzer();
  28. //4 索引写出工具的配置对象
  29. IndexWriterConfig conf = new IndexWriterConfig(Version.LATEST, analyzer);
  30. //5 创建索引的写出工具类。参数:索引的目录和配置信息
  31. IndexWriter indexWriter = new IndexWriter(directory, conf);
  32. //6 把文档交给IndexWriter
  33. indexWriter.addDocument(document);
  34. //7 提交
  35. indexWriter.commit();
  36. //8 关闭
  37. indexWriter.close();
  38. }
  39. }

点击运行
在这里插入图片描述

查看d盘下,是否有你所创建的文件夹
在这里插入图片描述
也可以创建多条文档的文件
现在pom.xml添加
<!-- https://mvnrepository.com/artifact/com.janeluo/ikanalyzer --> <dependency> <groupId>com.janeluo</groupId> <artifactId>ikanalyzer</artifactId> <version>2012_u6</version> </dependency>依赖

  1. import org.apache.lucene.document.Document;
  2. import org.apache.lucene.document.Field;
  3. import org.apache.lucene.document.StringField;
  4. import org.apache.lucene.document.TextField;
  5. import org.apache.lucene.index.IndexWriter;
  6. import org.apache.lucene.index.IndexWriterConfig;
  7. import org.apache.lucene.store.FSDirectory;
  8. import org.apache.lucene.util.Version;
  9. import org.junit.Test;
  10. import org.wltea.analyzer.lucene.IKAnalyzer;
  11. import java.io.File;
  12. import java.util.ArrayList;
  13. public class lucencebb {
  14. @Test
  15. public void testCreate2() {
  16. try {
  17. ArrayList<Document> documents = new ArrayList<Document>();
  18. Document document = new Document();
  19. document.add(new StringField("id","1", Field.Store.YES));
  20. document.add(new TextField("title","谷歌地图之父跳槽facebook",Field.Store.YES));
  21. documents.add(document);
  22. Document document2 = new Document();
  23. document2.add(new StringField("id","2",Field.Store.YES));
  24. document2.add(new TextField("title","谷歌地图之父加盟FaceBook",Field.Store.YES));
  25. documents.add(document2);
  26. Document document3 = new Document();
  27. document3.add(new StringField("id","3",Field.Store.YES));
  28. document3.add(new TextField("title","谷歌地图创始人拉斯离开谷歌加盟Facebook",Field.Store.YES));
  29. documents.add(document3);
  30. Document document4 = new Document();
  31. document4.add(new StringField("id","4",Field.Store.YES));
  32. document4.add(new TextField("title","谷歌地图之父跳槽Facebook与Wave项目取消有关",Field.Store.YES));
  33. documents.add(document4);
  34. Document document5 = new Document();
  35. document5.add(new StringField("id","5",Field.Store.YES));
  36. document5.add(new TextField("title","谷歌地图之父拉斯加盟社交网站Facebook",Field.Store.YES));
  37. documents.add(document5);
  38. FSDirectory dir = FSDirectory.open(new File("d:/lucenedata"));
  39. IndexWriterConfig conf = new IndexWriterConfig(Version.LATEST, new IKAnalyzer());
  40. conf.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
  41. IndexWriter indexWriter = new IndexWriter(dir, conf);
  42. indexWriter.addDocuments(documents);
  43. indexWriter.commit();
  44. indexWriter.close();
  45. } catch (Exception e) {
  46. e.printStackTrace();
  47. }
  48. }
  49. }

同样运行,查看
在这里插入图片描述
4.运行查询代码

  1. import org.apache.lucene.document.Document;
  2. import org.apache.lucene.index.DirectoryReader;
  3. import org.apache.lucene.index.IndexReader;
  4. import org.apache.lucene.queryparser.classic.QueryParser;
  5. import org.apache.lucene.search.IndexSearcher;
  6. import org.apache.lucene.search.Query;
  7. import org.apache.lucene.search.ScoreDoc;
  8. import org.apache.lucene.search.TopDocs;
  9. import org.apache.lucene.store.Directory;
  10. import org.apache.lucene.store.FSDirectory;
  11. import org.junit.Test;
  12. import org.wltea.analyzer.lucene.IKAnalyzer;
  13. import java.io.File;
  14. public class tabletest {
  15. @Test
  16. public void testSearch() throws Exception {
  17. // 索引目录对象
  18. Directory directory = FSDirectory.open(new File("d:\\lucenedata"));
  19. // 索引读取工具
  20. IndexReader reader = DirectoryReader.open(directory);
  21. // 索引搜索工具
  22. IndexSearcher searcher = new IndexSearcher(reader);
  23. // 创建查询解析器,两个参数:默认要查询的字段的名称,分词器
  24. QueryParser parser = new QueryParser("title", new IKAnalyzer());
  25. // 创建查询对象
  26. Query query = parser.parse("谷歌");
  27. // 搜索数据,两个参数:查询条件对象要查询的最大结果条数
  28. // 返回的结果是 按照匹配度排名得分前N名的文档信息(包含查询到的总条数信息、所有符合条件的文档的编号信息)。
  29. TopDocs topDocs = searcher.search(query, 10);
  30. // 获取总条数
  31. System.out.println("本次搜索共找到" + topDocs.totalHits + "条数据");
  32. // 获取得分文档对象(ScoreDoc)数组.SocreDoc中包含:文档的编号、文档的得分
  33. ScoreDoc[] scoreDocs = topDocs.scoreDocs;
  34. for (ScoreDoc scoreDoc : scoreDocs) {
  35. // 取出文档编号
  36. int docID = scoreDoc.doc;
  37. // 根据编号去找文档
  38. Document doc = reader.document(docID);
  39. System.out.println("id: " + doc.get("id"));
  40. System.out.println("title: " + doc.get("title"));
  41. // 取出文档得分
  42. System.out.println("得分: " + scoreDoc.score);
  43. }
  44. }
  45. }

查询结果:

  1. "C:\Program Files\Java\jdk1.8.0_144\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:F:\idea2019\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=52601:F:\idea2019\IntelliJ IDEA 2019.1.3\bin" -Dfile.encoding=UTF-8 -classpath "F:\idea2019\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar;F:\idea2019\IntelliJ IDEA 2019.1.3\plugins\junit\lib\junit-rt.jar;F:\idea2019\IntelliJ IDEA 2019.1.3\plugins\junit\lib\junit5-rt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar;F:\idea2019\Luceneaa\target\test-classes;C:\Users\ABU\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\ABU\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\ABU\.m2\repository\org\apache\lucene\lucene-core\4.10.2\lucene-core-4.10.2.jar;C:\Users\ABU\.m2\repository\org\apache\lucene\lucene-queryparser\4.10.2\lucene-queryparser-4.10.2.jar;C:\Users\ABU\.m2\repository\org\apache\lucene\lucene-queries\4.10.2\lucene-queries-4.10.2.jar;C:\Users\ABU\.m2\repository\org\apache\lucene\lucene-sandbox\4.10.2\lucene-sandbox-4.10.2.jar;C:\Users\ABU\.m2\repository\org\apache\lucene\lucene-analyzers-common\4.10.2\lucene-analyzers-common-4.10.2.jar;C:\Users\ABU\.m2\repository\org\apache\lucene\lucene-highlighter\4.10.2\lucene-highlighter-4.10.2.jar;C:\Users\ABU\.m2\repository\org\apache\lucene\lucene-memory\4.10.2\lucene-memory-4.10.2.jar;C:\Users\ABU\.m2\repository\com\janeluo\ikanalyzer\2012_u6\ikanalyzer-2012_u6.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 tabletest,testSearch
  2. 本次搜索共找到5条数据
  3. id: 1
  4. title: 谷歌地图之父跳槽facebook
  5. 得分: 0.35773432
  6. id: 2
  7. title: 谷歌地图之父加盟FaceBook
  8. 得分: 0.35773432
  9. id: 3
  10. title: 谷歌地图创始人拉斯离开谷歌加盟Facebook
  11. 得分: 0.289093
  12. id: 5
  13. title: 谷歌地图之父拉斯加盟社交网站Facebook
  14. 得分: 0.25552452
  15. id: 4
  16. title: 谷歌地图之父跳槽FacebookWave项目取消有关
  17. 得分: 0.20441961
  18. Process finished with exit code 0

发表评论

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

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

相关阅读

    相关 Lucene

    什么是Lucene Lucene是一套用于全文检索和搜寻的开源程序库,由Apache软件基金会支持和提供 Lucene提供了一个简单却强大的应用程序接口(AP

    相关 lucene

    Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。其功能非常的强大,但api其实很简单的,它最主要就是做两件事:建立索引和进行搜索。 1. 建立索引

    相关 lucene

    一、           Introduction Lucene是apache的一个项目,是一个开源的全文检索引擎工具包,不是完整的全文检索引擎,而是一个全文检索引擎的架构,

    相关 lucene

    lucene 全文检索 流程 1创建索引库 2查询索引库 先建立索引,在对索引进行搜索就是全文检索 虽然创建索引的过程非常耗时,但索引一旦创建就可以多次使用,

    相关 lucene

    lucene适用于全文检索,文件内容检索,目前少数情境下会使用lucene,而不用sql 一. 原始记录表+索引表 1.lucene索引库在硬盘中,原始库接受的是D

    相关 Lucene的使用,Lucene入门

    本文主要介绍几个方面,为什么使用Lucene使用场景,解决的问题,Lucene的入门使用,以及Lucene一些语法(增删改查)。 一简述Lucene概念:磁盘上的一些邮件,文

    相关 lucene

      Lucene是一款高性能的、可扩展的信息检索(IR)工具库。信息检索是指文档搜索、文档内信息搜索或者文档相关的元数据搜索等操作。 lucene实现全文检索的流程为: