Lucene 初步 之 HelloWorld
万恶的源头 HelloWorld
要完成lucene 的配置 需要几个jar包 (如果需要可以留言我私发)
创建索引API分析:
1. Directory: 类代表一个Lucene索引的位置,FSDirectory:它表示一个存储在文件系统中的索引的位置
2. Analyzer 类是一个抽象类, 它有多个实现,在一个文档被入索引库之前,首先需要对文档内容进行分词处理,针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引
3. IndexWriter:是创建索引和维护索引的中心组件, 这个类创建一个新的索引并且添加文档到一个已有的索引中。IndexWriter只负责索引库的更新(删、更新、插入),不负责查询
4. Document:由多个字段(Field)组成,一个Field代表与这个文档相关的元数据。如作者、标题、主题等等,分别做为文档的字段索引和存储。add(Fieldable field)添加一个字段(Field)到Document
Store,Index介绍
枚举类型 |
枚举常量 |
说明 |
Store |
NO |
不存储属性的值 |
YES |
存储属性的值 |
|
Index |
NO |
不建立索引 |
ANALYZED |
分词后建立索引 |
|
NOT_ANALYZED |
不分词,把整个内容作为一个词建立索引 |
说明:Store是影响搜索出的结果中是否有指定属性的原始内容。Index是影响是否可以从这个属性中查询(No),或是查询时可以查其中的某些词(ANALYZED),还是要把整个内容作为一个词进行查询(NOT_ANALYZED)。
搜索原理图分析:
这时我们假设 把商品添加到索引库
public void saveGoods(Goods goods) {
//创建一个indexWrite
IndexWriter indexWriter = null;
//指定索引库的目录
Directory directory = null;
//创建一个分词器
Analyzer analyzer = null; try {
//不同分词器,分词的效果不同
analyzer = new StandardAnalyzer(Version.LUCENE_30);
//目录可以任意指定,最好和项目同级目录
directory= FSDirectory.open(new File("./indexData"));
//通过分词器和索引创建indexWrite
indexWriter=new IndexWriter(directory,analyzer, IndexWriter.MaxFieldLength.LIMITED);
//把Goods 转化成lucene可以识别的doument
Document doc=new Document();
//Goods 对象中的,每个属性,转化lucene 中的字段
doc.add(new Field("gid",goods.getGid().toString(), Store.YES,Index.NOT_ANALYZED));
doc.add(new Field("gname",goods.getGname(), Store.YES,Index.ANALYZED));
doc.add(new Field("gprice",goods.getGprice().toString(), Store.YES,Index.NOT_ANALYZED));
doc.add(new Field("gremark",goods.getGremark(), Store.YES,Index.ANALYZED));
//把document添加到索引库
indexWriter.addDocument(doc);
//提交
indexWriter.commit();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally {
try {
indexWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
商品的实体类
package cn.wh; import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors; //有参构造函数
@AllArgsConstructor
//无参构造函数
@NoArgsConstructor
//封装
@Data
//链式风格访问
@Accessors(chain = true)
public class Goods implements java.io.Serializable {
// Fields
private Integer gid;
private String gname;
private Double gprice;
private String gremark; }
这时我们执行会产生一个索引的库
这时我们再创建一个查询的方式 (根据商品名查询)
public List<Goods> query(String gname){
List<Goods> goodsList=new ArrayList<Goods>();
// 创建查询工具类
IndexSearcher indexSearcher=null;
// 指定Lucenen索引库目录
Directory directory=null;
// 创建一个分词器
Analyzer analyzer=null;
try {
// 指定查询的目录
directory=FSDirectory.open(new File("./indexData"));
// 指定查询的分词器: 钓鱼岛中国的---> 钓鱼 钓鱼岛 中国
analyzer=new StandardAnalyzer(Version.LUCENE_30);
// QueryParser:查询解析器,用来解析查询的字符串,和分词
/*
* Version.LUCENE_30:版本号
* gname: 要查询的 字段名 Term:key,后面可以到多个字段中查找
* analyzer:指定对关键字的分词器
* */
QueryParser parse=new QueryParser(Version.LUCENE_30,"gname",analyzer);
// 解析要查询的关键字:返回的是Query类型
Query query=parse.parse(gname);
indexSearcher=new IndexSearcher(directory);
// indexSearch做查询操作: n 用户期望查询结果数,后面做分页使用
TopDocs topDocs=indexSearcher.search(query,10);
/*
* TopDocs:
* totalHits: 实际查询到的结果数
* scoreDocs[]: 存储了所有符合条件的document 编号
* */
System.out.println("实际的结果数为:" + topDocs.totalHits);
// 存储的是document在lucenen中的逻辑编号
ScoreDoc[] docs=topDocs.scoreDocs; //[0]=0 [1]=1
/*
* ScoreDoc:
* doc: 文档逻辑编号
* score: 当前文档得分
*
* */
for(int i=0;i<docs.length;i++){
System.out.println("文档的编号:" + docs[i].doc);
System.out.println("此文档的得分:" + docs[i].score);
// 通过文档的编号获取真正的文档
Document doc=indexSearcher.doc(docs[i].doc);
// 把Document类型转化我们自己识别的类型
Goods goods=new Goods();
goods.setGid(Integer.parseInt(doc.get("gid")));
goods.setGname(doc.get("gname"));
goods.setGprice(Double.parseDouble(doc.get("gprice")));
goods.setGremark(doc.get("gremark"));
goodsList.add(goods);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return goodsList; }
最后测试
可以根据hello 查询出来东西
这时 lucence 提供了一个jar 包 这个jar包是可以看见索引文件中的元素模样
在cmd 输入 java -jar XXXX jar包的名 (如果要这个jar 包 可以留言 我私法)
打开一个客户端 这时 在path中输入索引文件夹的位置
就能看见每个分词的效果就大小和索引
Lucene 初步 之 HelloWorld的更多相关文章
- Lucene初步搜索
Lucene在创立索引后,要进行搜索查询 搜索大概需要5部, 1,读取索引. 2,查询索引. 3,匹配数据. 4,封装匹配结果. 5,获取需要的值. 语言表达能力不好,大概就是分着几部吧. /** * ...
- Lucene之删除索引
1.前言 之前的博客<Lucene全文检索之HelloWorld>已经简单介绍了Lucene的索引生成和检索.本文着重介绍Lucene的索引删除. 2.应用场景: 索引建立完成后,因为有些 ...
- Socket网络通信编程(二)
1.Netty初步 2.HelloWorld 3.Netty核心技术之(TCP拆包和粘包问题) 4.Netty核心技术之(编解码技术) 5.Netty的UDP实现 6.Netty的WebSocket实 ...
- 搜索引擎系列 ---lucene简介 创建索引和搜索初步
一.什么是Lucene? Lucene最初是由Doug Cutting开发的,2000年3月,发布第一个版本,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎 :Lucene得名于Doug妻子 ...
- lucene简介 创建索引和搜索初步
lucene简介 创建索引和搜索初步 一.什么是Lucene? Lucene最初是由Doug Cutting开发的,2000年3月,发布第一个版本,是一个全文检索引擎的架构,提供了完整的查询引擎和索引 ...
- Lucene索引的初步创建
从百度上知道的,Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的 ...
- Lucene学习之初步了解
全文搜索 比如,我们一个文件夹中,或者一个磁盘中有很多的文件,记事本.world.Excel.pdf,我们想根据其中的关键词搜索包含的文件.例如,我们输入Lucene,所有内容含有Lucene的文件就 ...
- SpringMVC初步——HelloWorld的实现
开通博客园好几个月了,今天开始要用博客园记录自己的学习过程! 目录: 导包: 1. 配置web.xml文件的springDispatcherServlet 在xml中 alt+/ 找到springdi ...
- Lucene 搜索的初步探究
搜索应用程序和 Lucene 之间的关系 一般的搜索引擎都会采用这样的 Lucene 采用的是一种称为反向索引(inverted index)的机制.反向索引就是说我们维护了一个词 / 短语表,对于这 ...
随机推荐
- jQuery中this与$(this)的差别
jQuery中this与$(this)的差别 $("#textbox").hover( function() { this.title ...
- 创建JOB定时执行存储过程
创建JOB定时执行存储过程有两种方式 方式1:通过plsql手动配置job,如下图: 方式2:通过sql语句,如下sql declare job_OpAutoDta pls_integer;--声明一 ...
- http://echarts.baidu.com/demo.html#effectScatter-map
http://echarts.baidu.com/demo.html#effectScatter-map
- linux ipc/its
linux进程间双向消息队列 server.c #include <stdio.h> #include <stdlib.h> #include <string.h> ...
- 生信-序列比较dp[未完成]
来自:生物信息学-陈铭第二版的一个例题. 题目: 目前的代码,运行不正确,关键就是不知道怎么回溯啊,回溯怎么标记呢? #include <iostream> #include<vec ...
- 机器学习第2周---炼数成金-----线性回归与Logistic
重点归纳 回归分析就是利用样本(已知数据),产生拟合方程,从而(对未知数据)迚行预测用途:预测,判别合理性例子:利用身高预测体重:利用广告费用预测商品销售额:等等.线性回归分析:一元线性:多元线性:广 ...
- django 【认证】
一.验证 1.views.py from django.contrib.auth.decorators import login_required from django.contrib.auth i ...
- PEP8编码规范
1.代码布局设计 1.1 缩进 -4个空格进行缩进 1.2 tab键-在python2中tab和空格是混用的,但是在python中基本上使用tab(pycharm开发工具会自动对代码缩进) 1.3 最 ...
- PKU 2559 Largest Rectangle in a Histogram(单调栈)
题目大意:原题链接 一排紧密相连的矩形,求能构成的最大矩形面积. 为了防止栈为空,所以提前加入元素(-1,0) #include<cstdio> #include<stack> ...
- exec-maven-plugin配置及使用
背景: 如果你想在项maven生命周期内,运行一段java代码,或者一段独立的程序,或者说我们所指的预执行,初始化某些值,生成某些不能预先生成的文件.那么这样我们就可以使用exec-maven-plu ...