Lucene学习笔记:基础
Lucence是Apache的一个全文检索引擎工具包。可以将采集的数据存储到索引库中,然后在根据查询条件从索引库中取出结果。索引库可以存在内存中或者存在硬盘上。
本文主要是参考了这篇博客进行学习的,原博客地址https://blog.csdn.net/bskfnvjtlyzmv867/article/details/80914156
主要开发流程是:采集数据,将数据转化成索引文档,然后存储在索引库中,索引库可以保存在内存中,或者保存在硬盘上。在查询的时候通过索引库查询结果,返回数据。
下面的例子主要是将Product表中的数据存储到索引库中,并通过索引库进行查询。项目依赖的jar包可以参考原博客,我用的Lucence版本是4.7。

新建实体类Product,其代码如下:
public class Product {
private Long id;
private String title;
private String sellPoint;
}
将Product实体转化成索引库中Document,并存到索引库中。Product数据可以从数据库中查询,然后通过此方法转化成索引库中的Document,此处省略从数据库查询Product的逻辑。
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version; import entity.Product; public class ProductRepository { public void createIndex(Product product) {
Field id = new StringField("id", product.getId().toString(), Field.Store.YES);
Field title = new TextField("title", product.getTitle().toString(), Field.Store.YES);
Field sellPoint = new TextField("sellPoint", product.getSellPoint().toString(), Field.Store.YES); Document document = new Document();
document.add(id);
document.add(title);
document.add(sellPoint);
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_47);
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_47, analyzer);
Path path = Paths.get("D:/develop/workspace/slem_compass/data");
try {
Directory directory = FSDirectory.open(path.toFile());
IndexWriter indexWriter = new IndexWriter(directory, config);
indexWriter.addDocument(document);
indexWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
其中上面的代码中Path是索引库在硬盘上的位置,我这里是放在D盘上的某个文件夹内。
下面如何从索引库中查询数据呢?我写了一个Servlet,用户提交查询关键字,request获取到后,根据关键字从索引库中查询数据。当然也可以用Main方法或者test测试类。
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
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.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version; @WebServlet("/search")
public class SearchServlet extends HttpServlet {
private static final long serialVersionUID = 1L; public SearchServlet() {
super();
} protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_47);
QueryParser parser = new QueryParser(Version.LUCENE_47, "title", analyzer);
String title = request.getParameter("title");
System.out.println("");
System.out.println("title: " + title);
try {
Query query = parser.parse(title);
Path path = Paths.get("D:/develop/workspace/slem_compass/data");
Directory directory = FSDirectory.open(path.toFile());
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(reader); TopDocs topDocs = indexSearcher.search(query, 10);
ScoreDoc[] scoreDocs = topDocs.scoreDocs; for (ScoreDoc scoreDoc : scoreDocs) {
int docID = scoreDoc.doc; Document doc = indexSearcher.doc(docID);
System.out.println(doc.get("id") + " " + doc.get("title") + " " + doc.get("sellPoint"));
}
System.out.println("");
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().append("Served at: ").append(request.getContextPath());
} protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }
查询的时候也是从D盘上的索引库中读取相应的信息,然后根据关键字进行查询。
这样就完成了索引库的存储和查询。索引的查询很复杂,上面的demo只是一个比较简单的例子,说明大致的原理,后面继续补充索引的查询。
Lucene学习笔记:基础的更多相关文章
- jQuery学习笔记 - 基础知识扫盲入门篇
jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...
- Lucene学习笔记(更新)
1.Lucene学习笔记 http://www.cnblogs.com/hanganglin/articles/3453415.html
- Python学习笔记基础篇——总览
Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- 《python基础教程(第二版)》学习笔记 基础部分(第1章)
<python基础教程(第二版)>学习笔记 基础部分(第1章)python常用的IDE:Windows: IDLE(gui), Eclipse+PyDev; Python(command ...
- Java学习笔记——基础篇
Tips1:eclipse中会经常用到System.out.println方法,可以先输入syso,然后eclipse就会自动联想出这个语句了!! 学习笔记: *包.权限控制 1.包(package) ...
- Apache Lucene学习笔记
Hadoop概述 Apache lucene: 全球第一个开源的全文检索引擎工具包 完整的查询引擎和搜索引擎 部分文本分析引擎 开发人员在此基础建立完整的全文检索引擎 以下为转载:http://www ...
- iOS学习笔记——基础控件(上)
本篇简单罗列一下一些常用的UI控件以及它们特有的属性,事件等等.由于是笔记,相比起来不会太详细 UIView 所有UI控件都继承于这个UIView,它所拥有的属性必是所有控件都拥有,这些属性都是控件最 ...
- Lucene学习笔记
师兄推荐我学习Lucene这门技术,用了两天时间,大概整理了一下相关知识点. 一.什么是Lucene Lucene即全文检索.全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明 ...
随机推荐
- redis-python
一:缓存数据库介绍 NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库,随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特 ...
- 基于HALCON的模板匹配方法总结
注:很抱歉,忘记从转载链接了,作者莫怪.... 基于HALCON的模板匹配方法总结 很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间.去年有过一段时间的集中学习,做了许多 ...
- ORM版学员管理系统
ORM版学员管理系统 班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = m ...
- AES五种加密模式(CBC、ECB、CTR、OCF、CFB)
--转载https://www.cnblogs.com/starwolf/p/3365834.html https://www.freebuf.com/column/171939.html 分组密码有 ...
- Django03-视图系统views
一.编写视图 一个视图函数,是一个简单的Python函数,它接受web请求,并且返回web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是 ...
- 系统分析与设计个人作业:WordCount
本次作业gitee地址:https://gitee.com/ackary/WordCount 一.项目简介 1.基础功能 基础功能部分主要实现的功能是统计一个程序设计语言源文件的字符数.单词数.行数, ...
- 项目管理第一篇(PROJECT MANAGEMENT A Systems Approach to Planning, Scheduling, and Controlling)
请把梦想和野心带上,这是我哥对我说的. 几年下来,人浑浑噩噩,梦想和野心像锋利的石头在水中慢慢被磨平,今天就再次记住,不要让焦虑和失望伴随着人生和家庭. 这是H A R O L D K E R Z N ...
- 提升lua代码效率
local test = {} , do test[ i ] = {} end local t1 = os.clock( ) , do test[ ].mValue = end local t2 = ...
- Linux 用户与组
在 Linux 操作系统下,如何添加一个新用户到一个特定的组中?如何同时将用户添加到多个组中?又如何将一个已存在的用户移动到某个组或者给他增加一个组?对于不常用 Linux 的人来讲,记忆 Linux ...
- flex-grow,flex-shrink,flex-basis及flex
flex-grow:默认值0:分配剩余空间的扩张比例: flex-basis:默认值auto:倘若设置了此属性,那么计算剩余空间之前要优先减去此属性,且它的层级比width高,会将width覆盖. 有 ...