1. Field域

1.1  Field的属性

  • 是否分词(Tokenized)

是:对该field存储的内容进行分词,分词的目的,就是为了索引。

  比如:商品名称、商品描述、商品价格

否:不需要对field存储的内容进行分词,不分词,不代表不索引,而是将整个内容进行索引。

  比如:商品id

  • 是否索引(Indexed)

是:将分好的词进行索引,索引的目的,就是为了搜索。

  比如:商品名称、商品描述、商品价格、商品id

否:不索引,也就是不对该field域进行搜索。

  • 是否存储(Stored)

是:将field域中的内容存储到文档域中。存储的目的,就是为了搜索页面显示取值用的。

  比如:商品名称、商品价格、商品id、商品图片地址

否:不将field域中的内容存储到文档域中。不存储,则搜索页面中没法获取该field域的值。

  比如:商品描述,由于商品描述在搜索页面中不需要显示,再加上商品描述的内容比较多,所以就不需要进行存储。如果需要商品描述,则根据搜索出的商品ID去数据库中查询,然后显示出商品描述信息即可。

1.2  Field的常用类型

下边列出了开发中常用 的Filed类型,注意Field的属性,根据需求选择:

Field类

数据类型

Analyzed

是否分词

Indexed

是否索引

Stored

是否存储

说明

StringField(FieldName, FieldValue,Store.YES))

字符串

N

Y

Y或N

这个Field用来构建一个字符串Field,但是不会进行分词,会将整个串存储在索引中,比如(订单号,身份证号等)

是否存储在文档中用Store.YES或Store.NO决定

LongField(FieldName, FieldValue,Store.YES)

Long型

Y

Y

Y或N

这个Field用来构建一个Long数字型Field,进行分词和索引,比如(价格)

是否存储在文档中用Store.YES或Store.NO决定

StoredField(FieldName, FieldValue)

重载方法,支持多种类型

N

N

Y

这个Field用来构建不同类型Field

不分析,不索引,但要Field存储在文档中

TextField(FieldName, FieldValue, Store.NO)

TextField(FieldName, reader)

字符串

Y

Y

Y或N

如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略.

 1.3 修改入门程序的代码

for (Book book : list) {document = new Document();// store:如果是yes,则说明存储到文档域中// 图书ID// 不分词、索引、存储 StringFieldField id = new StringField("id", book.getId().toString(), Store.YES);// 图书名称// 分词、索引、存储 TextFieldField name = new TextField("name", book.getName(), Store.YES);// 图书价格// 分词、索引、存储 但是是数字类型,所以使用FloatFieldField price = new FloatField("price", book.getPrice(), Store.YES);// 图书图片地址// 不分词、不索引、存储 StoredFieldField pic = new StoredField("pic", book.getPic());// 图书描述// 分词、索引、不存储 TextFieldField description = new TextField("description", book.getDescription(), Store.NO);
// 将field域设置到Document对象中
            document.add(id);·············
}

2. 索引维护

2.1 需求

图书信息在数据库发生变化,所以索引库相对应的也要发生增删改变化。

2.2 增加索引

语法(具体参照创建索引的程序):IndexWriter.addDocument(document);

   ······   // a)创建分词器,标准分词器(分析文档,对文档中的Field域进行分词)Analyzer analyzer = new StandardAnalyzer();// b)创建IndexWriterConfig对象IndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);// c)创建索引库目录,指定索引库的地址File indexFile = new File("D:\\DBIndex\\");Directory directory = FSDirectory.open(indexFile);// d)创建IndexWriter对象IndexWriter writer = new IndexWriter(directory, cfg);// e)通过IndexWriter对象将Document写入到索引库中for (Document doc : docList) {writer.addDocument(doc);}// f)关闭writerwriter.close();   ······

2.2 删除索引

增删改操作,都是需要通过IndexWriter对象来操作。

  2.2.1 根据条件删除

Term是索引域中最小的单位。根据条件删除时,建议根据唯一键来进行删除。在solr中就是根据ID来进行删除和修改操作的。

@Testpublic void deleteIndex() throws Exception {// 创建分词器,标准分词器Analyzer analyzer = new StandardAnalyzer();// 创建IndexWriterIndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);Directory directory = FSDirectory.open(new File("D:\\DBIndex\\"));// 创建IndexWriterIndexWriter writer = new IndexWriter(directory, cfg);        // Termswriter.deleteDocuments(new Term("id", "1"));
writer.close();}

  2.3.2 删除全部

@Testpublic void deleteIndex() throws Exception {// 创建分词器,标准分词器Analyzer analyzer = new StandardAnalyzer();// 创建IndexWriterIndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);Directory directory = FSDirectory.open(new File("D:\\DBIndex\\"));// 创建IndexWriterIndexWriter writer = new IndexWriter(directory, cfg);// Terms// writer.deleteDocuments(new Term("id", "1"));// 删除全部(慎用)
        writer.deleteAll();writer.close();}

2.4 修改索引

@Testpublic void updateIndex() throws Exception {// 创建分词器,标准分词器Analyzer analyzer = new StandardAnalyzer();// 创建IndexWriterIndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);Directory directory = FSDirectory.open(new File("D:\\DBIndex\\"));// 创建IndexWriterIndexWriter writer = new IndexWriter(directory, cfg);// 第一个参数:指定查询条件// 第二个参数:修改之后的对象// 修改时如果根据查询条件,可以查询出结果,则将以前的删掉,然后覆盖新的Document对象,如果没有查询出结果,则新增一个Document// 修改流程即:先查询,再删除,在添加Document doc = new Document();doc.add(new TextField("name", "lisi", Store.YES));writer.updateDocument(new Term("name", "zhangsan"), doc);writer.close();}

(三)Lucene——Field域和索引的增删改相关推荐

  1. Android复习07【创建数据库、insert()插入数据、查看数据库、根据列索引获取参数值、根据列名-返回索引、增删改查数据、数据分页、修改表结构、Room框架】

    2020-04-09-星期四-第八周 目   录 创建数据库 insert()方法 查看数据库(Save as保存) 菜鸟教程---SQLite数据库 根据 列索引 获取 参数值 列比较多---根据列 ...

  2. html编辑ko,BootstrapTable+KnockoutJS相结合实现增删改查解决方案(三)两个Viewmodel搞定增删改查...

    前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控件的取值和赋值,远远没有将MVVM的精妙展现出来.最近项目打 ...

  3. 3. mysql的注解驱动的三种方式_上手spring boot项目(三)之spring boot整合mybatis进行增删改查的三种方式。...

    1.引入依赖 org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot- ...

  4. Solr索引之增删改查

    浏览器界面操作: 一.添加:如图添加相应内容后点击Submit Documents,出现图上所示success状态则表示添加成功. 二.修改:修改界面和添加界面一致,但是修改是通过先删除再添加新索引实 ...

  5. MySQL基础(三)表关系及数据的增删改查

    这一部分主要使用SQL中的DML,数据库操作语言(data manipulation language),对数据库数据进行增.删.改.查操作,作为前提,先介绍关系型数据库中的表关系. 关系型数据库(R ...

  6. mysql 重命名索引_mysql增删改字段,重命名替换字段

    ALTER TABLE 语句分为以下几个部分: 部分 说明 table 指定修改的表. field  指定在表内增加或删除的字段. type 字段的数据类型. size 字段的字符长度 (文本及二进制 ...

  7. mysql索引的增删_mysql索引的增删改查怎么实现?

    mysql中可使用"CREATE INDEX"语句来添加索引:使用"SHOW INDEX"语句来查看索引:使用"DROP INDEX"语句来 ...

  8. elasticsearch 建立索引、增删改查 及简单查询和组合查询的学习笔记

    创建一个索引(数据库) PUT lagou # 索引名称 {"settings": {"index":{"number_of_shards" ...

  9. mysql--字段--索引的增删改查

    #增加字段 ALTER TABLE `t_user_info` ADD COLUMN `phone_number` VARCHAR(11) NULL DEFAULT '' comment '测试表id ...

最新文章

  1. a*算法matlab代码_导向滤波算法及其matlab代码实现
  2. jsp中的url拼接的参数传递到controller乱码_猿蜕变系列5——一文搞懂Controller的花式编写...
  3. mysql 主从复制
  4. python编程语法大全-python语法汇总
  5. 跨链Cosmos(8)同构跨链交易流程
  6. 2017甲骨文JavaOne参会感想
  7. 算法设计与分析【第七周】贪心算法 活动安排问题
  8. java--xml文件读取(SAX)
  9. 预训练再次跨界!百度提出ERNIE-GeoL,地理位置-语言联合预训练!
  10. 技术如何转型产品经理
  11. eclipse 64位_Eclipse安装教程
  12. 提升网络销售转化率的10种方法
  13. Kafka监控系统Kafka Eagle:支持kerberos认证
  14. 客户端工具收取邮件提示-ERR maildrop alredy locked
  15. 拓端tecdat|python隶属关系图模型:基于模型的网络中密集重叠社区检测方法
  16. Adblock 插件规则语法实现B 站动态黑名单 - 隐藏特定用户的图文动态
  17. 完美解决 vcpkg 下载速度慢
  18. 2022年认证杯SPSSPRO杯数学建模C题(第二阶段)污水流行病学原理在新冠疫情防控方面的作用求解全过程文档及程序
  19. windows下文件名太长无法删除
  20. 使用BitLocker实现磁盘加密、u盘加密、移动硬盘加密

热门文章

  1. 盛辉智能机器人安全吗_蓝小欧车载安全机器人构建全方位智能出行安全生态
  2. java中的进制输出转换_Java I/O : Java中的进制详解
  3. readline 移植 注意事项
  4. android怎么监听多点触摸_大尺寸触摸屏厂家定制多点触摸框
  5. 安卓怎么连接服务器的数据库文件,安卓怎么连接服务器的数据库文件
  6. powerdesigner生成php代码,让powerdesigner生成的sql语句在mysql上成功执行
  7. mysql 缓存怎么设置_mysql中缓存如何设置
  8. 重装系统找不到固态_重装系统时找不到固态
  9. Java实用教程笔记 组件及事件处理
  10. iOS下的 Fixed BUG