lucene全文检索概述(三)

                                      lucene全文检索概述(三)

目录

                                      lucene全文检索概述(三)

 

一.Lucene创建索引

1代码编写生成空索引文件

1.代码模板

2.运行代码

3.添加数据

4.执行代码

5.利用luke软件观察当前生成的索引内容

6.存在的问题

7.Store的yes和no的用处?


 

一.Lucene创建索引

1代码编写生成空索引文件

使用lucene全文检索引擎工具包在windows中创建可以使用的第一个索引文件

  • 指向一个文件夹位置(项目根目录)
  • 生成一个索引创建的输出流对象IndexWriter(绑定Analayzer)
  • document对象数据的封装整理
  • 输出到索引的目录文件夹生成索引供搜索服务
  • 完成一个空文件的创建

1.代码模板

public class CreateIndex {
	@Test
	public void createIndex() throws Exception{
		//1指定一个文件夹位置,项目根目录./index01
		Path path = Paths.get("d:/index01");
		//lucene的文件夹对象包装path
		FSDirectory dir = FSDirectory.open(path);
		//2生成一个创建索引的输出对象
		//配置的生成,输出的原则覆盖,追加,输出计算分词的分词器
		IndexWriterConfig config=
				new IndexWriterConfig(new IKAnalyzer6x());
		//配置追加覆盖的原则 append 追加  create 覆盖 crate_or_append
		config.setOpenMode(OpenMode.CREATE);
		IndexWriter writer=new IndexWriter(dir, config);
		//3编辑收集document数据的对象封装过程
		//添加一个新闻的数据,添加一个商品数据
		Document doc1=new Document();
		Document doc2=new Document();
		//封装数据手动封装,不同的field域属性和值
		//网页数据的addresshttps://ent.sina.com.cn
		//Store.yes/no的区别,TextField和StringField区别
		//4利用输出writer写出索引文件,索引文件是空的
		writer.addDocument(doc1);
		/*writer.addDocument(doc2);*/
		writer.commit();
	}
}

2.运行代码

仅仅是包含了一个index索引的基础结构,没有任何数据,分词整合结果,document数据都不存在

3.添加数据

//添加一个新闻的数据,添加一个商品数据
		Document doc1=new Document();
		Document doc2=new Document();
		//封装数据手动封装,不同的field域属性和值
		doc1.add(new TextField("title", "文娱大播报1", Store.YES));//title 域,文旅部督办张云雷调侃事件   存储
		doc1.add(new TextField("publisher","新华社1",Store.YES));
		doc1.add(new TextField("content","北京德云社火爆售票,每张票100元1",Store.NO));
		doc1.add(new TextField("name","三星屏幕1",Store.YES));
		doc1.add(new IntPoint("price", 500));
		doc1.add(new StringField("address","https://ent.deyunshe.com.cn",Store.YES));//网页数据的addresshttps://ent.sina.com.cn
		doc2.add(new TextField("title", "文娱大播报2", Store.YES));//title,文旅部督办张云雷调侃事件
		doc2.add(new TextField("publisher","新华社2",Store.YES));
		doc2.add(new TextField("content","北京德云社火爆售票,每张票100元2",Store.NO));
		doc2.add(new TextField("name","三星屏幕2",Store.YES));
		doc2.add(new IntPoint("price", 600));
		doc2.add(new StringField("address","https://ent.deyunshe.com.cn",Store.YES));

4.执行代码

生成一堆二进制文件

5.利用luke软件观察当前生成的索引内容

luke6.0.0是使用lucene编写的一个查看索引的软件

1.进入文件夹双机bat文件,在jdk环境下直接启动软件

2.指向索引文件的根目录

3.项目根目录不好找的话,更改路径 生成在D盘

4.指向对应路径

5.点击OK

6.overview

  • 域的个数:7
  • document文档的个数:2
  • term的个数:32

7.document标签

可以观察任意一个document的数据

8. overview左下框表示域的词项统计数据

9.自动分词

6.存在的问题

FIELD类型都有哪些怎么用?

  • 字符串文本:Text(对当前需要计算分词) String(对域不需要计算分词)
  • 数字多种:IntPoint DoublePoint LongPoint
  • Point类型数据只形成数字特性的管理维护(范围查询)
  • 例如价钱: 1000-5000之间的商品,完成范围查询必须在
  • 域中添加Point类型数据,否则无法查询,但是查询的记过中document是不保存这个数据的.

7.Store的yes和no的用处?

  • YES表示当前域的值需要存储在索引中.
  • NO表示当前域的值不需要存储在索引中.

一个document的数据中域的类型和存储与不存储是分开管理

1.只使用IntPoint/DoublePoint类型定义一个域:

  • 这个域的value只能用作查询时的数据计算(范围)
  • 无法从查询结果中拿到当前域的值

2.使用了Text类型的域定义Store.NO:

  • 可以使用分词查询到document
  • 但是无法查询之后获取域的值

3.使用Text类型的域定义Store.YES

  • 既可以使用分词查询到document
  • 也可以在查询结果中获取域的值

4.使用String类型的域定义Store.No

  • 使用值的整体进行查询(不分词)
  • 不能从查询结果中获取值

5.使用String类型的域定义Store.YES

  • 使用整体查询获取document(不分词)
  • document有当前域的值

NO 就算查得到,也无法获取

如果既要计算数字特性的范围查询,也要从数据中获取查询结果的值

StringField和Point类型一起使用,域名称完全一样,值也要完全一样.

只要是Point类型的一律不存储(单独使用),写上也直接报错

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值