一、Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

  二、搜索引擎这个东西还是很大的,我这里只是用了一点点皮毛,有兴趣还是去学习一下Solr

  三、简易版的搜索实现依赖包

  1.     <dependency>
  2. <groupId>com.github.magese</groupId>
  3. <artifactId>ik-analyzer</artifactId>
  4. <version>7.4.0</version>
  5. </dependency>

  四、代码

  1. import com.alibaba.fastjson.JSONObject;
  2. import org.apache.lucene.analysis.TokenStream;
  3. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
  4. import org.apache.lucene.document.Document;
  5. import org.apache.lucene.document.Field;
  6. import org.apache.lucene.document.TextField;
  7. import org.apache.lucene.index.*;
  8. import org.apache.lucene.queryparser.classic.QueryParser;
  9. import org.apache.lucene.search.IndexSearcher;
  10. import org.apache.lucene.search.Query;
  11. import org.apache.lucene.search.ScoreDoc;
  12. import org.apache.lucene.store.Directory;
  13. import org.apache.lucene.store.RAMDirectory;
  14. import org.wltea.analyzer.lucene.IKAnalyzer;
  15.  
  16. import java.io.IOException;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19.  
  20. /**
  21. * Funtion: 搜索引擎核心工具类.
  22. * <p>
  23. * Date: 2018/9/18 14:08
  24. */
  25. public class LuceneUtils {
  26. //索引字段
  27. private static final String INDEX_NAME = "searchName";
  28. //用于传输实体类型
  29. public static final String ENTITY_TYPE = "entityType";
  30. //关键词,用于前端
  31. public static final String KEY_WORDS = "keyWords";
  32. private static final Integer VIEW_NUMBER = 100;
  33.  
  34. /**
  35. * 搜索引擎,查询结果
  36. * @param searchName
  37. * @param objects
  38. * @return
  39. * @throws Exception
  40. */
  41. public static List<JSONObject> search(String searchName, List<Object> objects) throws Exception {
  42. //1、准备中文分词器
  43. IKAnalyzer analyzer = new IKAnalyzer();
  44. //2、获取关键词,用于前端使用
  45. List<String> keywords = getKeywords(searchName, analyzer);
  46. //3、索引
  47. Directory directory = addIndex(analyzer, objects);
  48. //4、查询器
  49. Query query = new QueryParser(INDEX_NAME, analyzer).parse(searchName);
  50. //5、搜索
  51. IndexReader reader = DirectoryReader.open(directory);
  52. IndexSearcher searcher = new IndexSearcher(reader);
  53. ScoreDoc[] scoreDocs = searcher.search(query, VIEW_NUMBER).scoreDocs;
  54. //6、查询结果
  55. List<JSONObject> results = getResults(searcher, scoreDocs, keywords);
  56. //7、关闭查询
  57. reader.close();
  58. directory.close();
  59. //8、返回结果
  60. return results;
  61. }
  62.  
  63. /**
  64. * 获取关键词
  65. * @param searchName
  66. * @param analyzer
  67. * @return
  68. * @throws IOException
  69. */
  70. private static List<String> getKeywords(String searchName, IKAnalyzer analyzer) throws IOException {
  71. List<String> keyWords = new ArrayList<>();
  72. TokenStream tokenStream = analyzer.tokenStream("", searchName);
  73. CharTermAttribute attribute = tokenStream.getAttribute(CharTermAttribute.class);
  74. tokenStream.reset();
  75. while (tokenStream.incrementToken()) {
  76. keyWords.add(attribute.toString());
  77. }
  78. tokenStream.close();
  79. return keyWords;
  80. }
  81.  
  82. /**
  83. * 获取搜索结果
  84. * @param searcher
  85. * @param scoreDocs
  86. * @return
  87. * @throws Exception
  88. */
  89. private static List<JSONObject> getResults(IndexSearcher searcher, ScoreDoc[] scoreDocs, List<String> keyWords) throws Exception {
  90. if (scoreDocs != null && scoreDocs.length > 0) {
  91. IKAnalyzer analyzer = new IKAnalyzer();
  92. List<JSONObject> objects = new ArrayList<>();
  93. //遍历文本
  94. for (ScoreDoc scoreDoc:scoreDocs) {
  95. Document document = searcher.doc(scoreDoc.doc);
  96. List<IndexableField> fields = document.getFields();
  97. if (fields != null && !fields.isEmpty()) {
  98. //获取指定索引数据
  99. JSONObject jsonObject = JSONObject.parseObject(document.get(INDEX_NAME));
  100. jsonObject.put(ENTITY_TYPE, document.get(ENTITY_TYPE));
  101. jsonObject.put(KEY_WORDS, keyWords);
  102. objects.add(jsonObject);
  103. }
  104. }
  105. return objects;
  106. }
  107. return null;
  108. }
  109.  
  110. /**
  111. * 添加索引
  112. * @param analyzer
  113. * @param objects
  114. * @return
  115. * @throws IOException
  116. */
  117. private static Directory addIndex(IKAnalyzer analyzer, List<Object> objects) throws IOException {
  118. //使用内存方式
  119. Directory directory = new RAMDirectory();
  120. IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
  121. IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
  122. if (objects != null && !objects.isEmpty()) {
  123. //添加索引
  124. for (Object object:objects) {
  125. Document document = new Document();
  126. document.add(new TextField(INDEX_NAME, JSONObject.toJSONString(object), Field.Store.YES));
  127. document.add(new TextField(ENTITY_TYPE, object.getClass().getName(), Field.Store.YES));
  128. indexWriter.addDocument(document);
  129. }
  130. }
  131. indexWriter.close();
  132. return directory;
  133. }
  134. }

  

搜索引擎Lucene之皮毛的更多相关文章

  1. [垂直化搜索引擎]lucene简介及使用

    摘自:大型分布式网站架构-设计与实践

  2. 1、什么是Lucene,Lucene能干什么

    1.什么是lucene  Lucene是一个全文搜索框架,而不是应用产品.因此它并不像http://www.baidu.com/ 或者google Desktop那么拿来就能用,它只是提供了一种工具让 ...

  3. lucene简介 创建索引和搜索初步

    lucene简介 创建索引和搜索初步 一.什么是Lucene? Lucene最初是由Doug Cutting开发的,2000年3月,发布第一个版本,是一个全文检索引擎的架构,提供了完整的查询引擎和索引 ...

  4. Solr vs. Elasticsearch谁是开源搜索引擎王者

    当前是云计算和数据快速增长的时代,今天的应用程序正以PB级和ZB级的速度生产数据,但人们依然在不停的追求更高更快的性能需求.随着数据的堆积,如何快速有效的搜索这些数据,成为对后端服务的挑战.本文,我们 ...

  5. 转 Solr vs. Elasticsearch谁是开源搜索引擎王者

    转 https://www.cnblogs.com/xiaoqi/p/6545314.html Solr vs. Elasticsearch谁是开源搜索引擎王者 当前是云计算和数据快速增长的时代,今天 ...

  6. Elasticsearch vs Solr 搜索引擎对比和选型

    前言 全文搜索属于最常见的需求,开源的 Elasticsearch 是目前全文搜索引擎的首选. 基于Lucene它可以快速地储存.搜索和分析海量数据.维基百科.Stack Overflow.Githu ...

  7. Lucene的FuzzyQuery中用到的Levenshtein Distance(LD)算法

    2019独角兽企业重金招聘Python工程师标准>>> Lucene的FuzzyQuery中用到的Levenshtein Distance(LD)算法 博客分类: java 搜索引擎 ...

  8. 基于.NET平台常用的框架整理(转)

    自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的 学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到, ...

  9. Index

    我主要在研究.NET/C# 实现 PC IMERP 和 Android IMERP ,目的在解决企业通信中遇到的各类自动化问题   分布式缓存框架: Microsoft Velocity:微软自家分布 ...

随机推荐

  1. 使用ntpdate工具校正linux服务器时间

    当Linux服务器的时间不对的时候,可以使用ntpdate工具来校正时间. 安装:yum install ntpdate ntpdate简单用法: # ntpdate ip # ntpdate 210 ...

  2. 51Nod 1686 第K大区间(离散化+尺取法)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 题意: 思路: 第K大值,所以可以考虑二分法,然后用尺取法去扫描, ...

  3. UVa 1635 无关的元素(唯一分解定理+二项式定理)

    https://vjudge.net/problem/UVA-1635 题意: 给定n个数a1,a2,...an,依次求出相邻两数之和,将得到一个新数列.重复上述操作,最后结果将变成一个数.问这个数除 ...

  4. sapply

    列表并非总是存储结果的最佳容器.有时,我们希望将结果放在一个向量或者矩阵中.sapply( )函数可以根据结果的结构将其合理简化.假设,我们将平方运算应用到 1:10 的每个元素上.如果使用 lapp ...

  5. Java回顾之I/O

    这篇文章主要回顾Java中和I/O操作相关的内容,I/O也是编程语言的一个基础特性,Java中的I/O分为两种类型,一种是顺序读取,一种是随机读取. 我们先来看顺序读取,有两种方式可以进行顺序读取,一 ...

  6. PrestaShop 1.7 用户付款的时候无法支付错误

    用户付款的时候出现错误,错误的信息是没有支付方式. 这个有可能是你后台支付的国家限制没有选择. 请确定你已经选择了支付国家限制已经选择了. 当选择成功后,你应该可以看到下面的选择项.

  7. Linux命令详解-help

    help命令顾名思义就是显示帮助信息的,它是个Bash内建命令,也只是用来显示Bash内建命令的帮助信息的(Display  helpful  information about builtin co ...

  8. 【Demo】Tree.js实例

    Three.js是通过对WebGL接口的封装与简化而形成的一个易用的图形库. 简单点的说法:WebGL可以看成是浏览器给我们提供的接口,在javascript中可以直接用这些API进行3D图形的绘制: ...

  9. oracle版本号详解

  10. HttpResponse 类

    而封闭HTTP输出信息的类型就是HttpResponse类,使用HttpResponse类可以实现三种类型的输出,即文本,URL,二进制流.  实现这三类的属性和方法分别介绍如下:1.文本的输出,在日 ...