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

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

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

    <dependency>
<groupId>com.github.magese</groupId>
<artifactId>ik-analyzer</artifactId>
<version>7.4.0</version>
</dependency>

  四、代码

import com.alibaba.fastjson.JSONObject;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.*;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; /**
* Funtion: 搜索引擎核心工具类.
* <p>
* Date: 2018/9/18 14:08
*/
public class LuceneUtils {
//索引字段
private static final String INDEX_NAME = "searchName";
//用于传输实体类型
public static final String ENTITY_TYPE = "entityType";
//关键词,用于前端
public static final String KEY_WORDS = "keyWords";
private static final Integer VIEW_NUMBER = 100; /**
* 搜索引擎,查询结果
* @param searchName
* @param objects
* @return
* @throws Exception
*/
public static List<JSONObject> search(String searchName, List<Object> objects) throws Exception {
//1、准备中文分词器
IKAnalyzer analyzer = new IKAnalyzer();
//2、获取关键词,用于前端使用
List<String> keywords = getKeywords(searchName, analyzer);
//3、索引
Directory directory = addIndex(analyzer, objects);
//4、查询器
Query query = new QueryParser(INDEX_NAME, analyzer).parse(searchName);
//5、搜索
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
ScoreDoc[] scoreDocs = searcher.search(query, VIEW_NUMBER).scoreDocs;
//6、查询结果
List<JSONObject> results = getResults(searcher, scoreDocs, keywords);
//7、关闭查询
reader.close();
directory.close();
//8、返回结果
return results;
} /**
* 获取关键词
* @param searchName
* @param analyzer
* @return
* @throws IOException
*/
private static List<String> getKeywords(String searchName, IKAnalyzer analyzer) throws IOException {
List<String> keyWords = new ArrayList<>();
TokenStream tokenStream = analyzer.tokenStream("", searchName);
CharTermAttribute attribute = tokenStream.getAttribute(CharTermAttribute.class);
tokenStream.reset();
while (tokenStream.incrementToken()) {
keyWords.add(attribute.toString());
}
tokenStream.close();
return keyWords;
} /**
* 获取搜索结果
* @param searcher
* @param scoreDocs
* @return
* @throws Exception
*/
private static List<JSONObject> getResults(IndexSearcher searcher, ScoreDoc[] scoreDocs, List<String> keyWords) throws Exception {
if (scoreDocs != null && scoreDocs.length > 0) {
IKAnalyzer analyzer = new IKAnalyzer();
List<JSONObject> objects = new ArrayList<>();
//遍历文本
for (ScoreDoc scoreDoc:scoreDocs) {
Document document = searcher.doc(scoreDoc.doc);
List<IndexableField> fields = document.getFields();
if (fields != null && !fields.isEmpty()) {
//获取指定索引数据
JSONObject jsonObject = JSONObject.parseObject(document.get(INDEX_NAME));
jsonObject.put(ENTITY_TYPE, document.get(ENTITY_TYPE));
jsonObject.put(KEY_WORDS, keyWords);
objects.add(jsonObject);
}
}
return objects;
}
return null;
} /**
* 添加索引
* @param analyzer
* @param objects
* @return
* @throws IOException
*/
private static Directory addIndex(IKAnalyzer analyzer, List<Object> objects) throws IOException {
//使用内存方式
Directory directory = new RAMDirectory();
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
if (objects != null && !objects.isEmpty()) {
//添加索引
for (Object object:objects) {
Document document = new Document();
document.add(new TextField(INDEX_NAME, JSONObject.toJSONString(object), Field.Store.YES));
document.add(new TextField(ENTITY_TYPE, object.getClass().getName(), Field.Store.YES));
indexWriter.addDocument(document);
}
}
indexWriter.close();
return directory;
}
}

  

搜索引擎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. shell脚本监控Linux系统性能指标

    2016-11-04 22:41 原作者不详 分类: Linux(7) 在服务器运维过程中,经常需要对服务器的各种资源进行监控, 例如:CPU的负载监控,磁盘的使用率监控,进程数目监控等等,以在系统出 ...

  2. hihocode 股票价格 优先队列+map

    股票价格 时间限制:20000ms 单点时限:2000ms 内存限制:256MB 描述 小Hi最近在分析一支股票的价格走势,他需要一个程序来辅助分析.这个程序会接收3种消息(指令): 价格信息,格式是 ...

  3. Linux下的IPC几种通信方式

    Linux下的IPC几种通信方式 管道(pipe):管道可用于具有亲缘关系的进程间的通信,是一种半双工的方式,数据只能单向流动,允许一个进程和另一个与它有公共祖先的进程之间进行通信. 命名管道(nam ...

  4. 玲珑杯 round18 A 计算几何瞎暴力

    题目链接 : http://www.ifrog.cc/acm/problem/1143 当时没看到坐标的数据范围= =看到讨论才意识到,不同的坐标最多只有1k多个,完全可以暴力做法,不过也要一些技巧. ...

  5. ExtJs 6.0+快速入门,ext-bootstrap.js文件的分析,各版本API下载(一)

    ExtAPI 下载地址如下,包含各个版本 http://docs.sencha.com/misc/guides/offline_docs.html 1.使用工具HBuilder 2.java 版本 8 ...

  6. easyui panel自适应浏览器宽度

    一.目标效果: 当浏览器窗口大小改变时.panel宽度始终为浏览器宽度的50%,panel高度则根据其中内容的多少而变化,横向竖向滚动条皆不出现.且不需要重新刷新浏览器或者其他js代码 兼容:chro ...

  7. T4 模板代码生成

    <# //********************************************************* // // Copyright (c) Microsoft. All ...

  8. PHP网站自动化配置的实现

    一直都在用yii2做项目,有在用自动化配置,但是没有自己去配置过.中午没事去看了下yii的初始化代码,发现都是php而已! yii2初始化项目代码 所以,我们做项目肯定是可以用php做的,于是我新建了 ...

  9. 免费180天的Ashampoo Anti-Virus 2014

    官方网站:https://www.ashampoo.com/cn/rmb/pde/0449/Security_Software/Ashampoo-Anti-Virus 活动页面:http://www. ...

  10. C++11_ 右值引用

    版权声明:本文为博主原创文章,未经博主允许不得转载. 由于右值所产生的临时变量问题一直是一种诟病,C++11中引入了右值引用这个核心语言机制,来提升运行期性能. 首先我先说明一下什么是左值和右值: 左 ...