万恶的源头 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的更多相关文章

  1. Lucene初步搜索

    Lucene在创立索引后,要进行搜索查询 搜索大概需要5部, 1,读取索引. 2,查询索引. 3,匹配数据. 4,封装匹配结果. 5,获取需要的值. 语言表达能力不好,大概就是分着几部吧. /** * ...

  2. Lucene之删除索引

    1.前言 之前的博客<Lucene全文检索之HelloWorld>已经简单介绍了Lucene的索引生成和检索.本文着重介绍Lucene的索引删除. 2.应用场景: 索引建立完成后,因为有些 ...

  3. Socket网络通信编程(二)

    1.Netty初步 2.HelloWorld 3.Netty核心技术之(TCP拆包和粘包问题) 4.Netty核心技术之(编解码技术) 5.Netty的UDP实现 6.Netty的WebSocket实 ...

  4. 搜索引擎系列 ---lucene简介 创建索引和搜索初步

    一.什么是Lucene? Lucene最初是由Doug Cutting开发的,2000年3月,发布第一个版本,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎 :Lucene得名于Doug妻子 ...

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

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

  6. Lucene索引的初步创建

    从百度上知道的,Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的 ...

  7. Lucene学习之初步了解

    全文搜索 比如,我们一个文件夹中,或者一个磁盘中有很多的文件,记事本.world.Excel.pdf,我们想根据其中的关键词搜索包含的文件.例如,我们输入Lucene,所有内容含有Lucene的文件就 ...

  8. SpringMVC初步——HelloWorld的实现

    开通博客园好几个月了,今天开始要用博客园记录自己的学习过程! 目录: 导包: 1. 配置web.xml文件的springDispatcherServlet 在xml中 alt+/ 找到springdi ...

  9. Lucene 搜索的初步探究

    搜索应用程序和 Lucene 之间的关系 一般的搜索引擎都会采用这样的 Lucene 采用的是一种称为反向索引(inverted index)的机制.反向索引就是说我们维护了一个词 / 短语表,对于这 ...

随机推荐

  1. IPython的基本功能(转)

    原文:http://kochiya.me/www/posts/Ipython!.html 前几天偶然在公司内网上拖了一本 Learning IPython for Interactive Comput ...

  2. C++ string and wstring convert

    http://blog.sina.com.cn/s/blog_7632c6010100u1et.html http://www.codeproject.com/Tips/197097/Converti ...

  3. 3.Github介绍

    很多人都知道,Linus在1991年创建了开源的Linux.从此,Linux系统不断发展,已经成为最大的服务器系统软件了.Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的 ...

  4. linux 系统性能指标

    一.查看CPU使用情况 cpu使用率反映的是当前cpu的繁忙程度,忽高忽低的原因在于占用cpu处理时间的进程可能处于io等待状态但却还未释放进入wait. 平均负载(loadaverage)是指某段时 ...

  5. python和shell之间变量的相互调用

    python -> shell: 1.环境变量 2.字符串连接 3.通过管道 import os var=’123’ os.popen(’wc -c’, ’w’).write(var) 4.通过 ...

  6. 八、网页版消息推送SDK-WebSockets

    介绍 由于项目组需求.最近在研究消息推送服务平台.结合业务和使用场景分析最终选择的是 Mosquitto 消息服务器. Mosquitto 服务器的安装.配置.集群搭建 我就不在这多说了.有兴趣的可以 ...

  7. python全栈开发从入门到放弃之常用模块和正则

    什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的代码(.p ...

  8. CSS3、SVG、Canvas、WebGL动画精选整理

    一.CSS3动画 名称 用途 链接 阴影波纹特效 1.元素hover效果 2.突出表现效果 http://www.jq22.com/code80 横板导航菜单动画 导航菜单 http://www.jq ...

  9. QML Image Element

    QML Image Element The Image element displays an image in a declarative user interface More... Image元 ...

  10. LigerUI ligerComboBox 下拉框 表格 多选无效

    $("#txt1").ligerComboBox({ width: 250, slide: false, selectBoxWidth: 500, selectBoxHeight: ...