lucene全文检索概述(三)
目录
一.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类型的一律不存储(单独使用),写上也直接报错