Lucene(4):Field域类型

news/2024/10/24 9:16:53/

1 Field属性

Field是文档中的域,包括Field名和Field值两部分,一个文档可以包括多个Field,Document只是Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容。

  • 是否分词(tokenized)

是:作分词处理,即将Field值进行分词,分词的目的是为了索引。

比如:商品名称、商品描述等,这些内容用户要输入关键字搜索,由于搜索的内容格式大、内容多需要分词后将语汇单元建立索引

否:不作分词处理

比如:商品id、订单号、身份证号等

是否索引(indexed)

是:进行索引。将Field分词后的词或整个Field值进行索引,存储到索引域,索引的目的是为了搜索。

比如:商品名称、商品描述分析后进行索引,订单号、身份证号不用分词但也要索引,这些将来都要作为查询条件。

否:不索引。

比如:图片路径、文件路径等,不用作为查询条件的不用索引。

是否存储(stored)

是:将Field值存储在文档域中,存储在文档域中的Field才可以从Document中获取。

比如:商品名称、订单号,凡是将来要从Document中获取的Field都要存储。

否:不存储Field值

比如:商品描述,内容较大不用存储。如果要向用户展示商品描述可以从系统的关系数据库中获取。

2 Field常用类型

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

Field类数据类型

Analyzed是否分词

Indexed是否索引

Stored是否存储

说明

StringField(FieldName,FieldValue,Store.YES))

字符串NYY或N

这个Field用来构建一个字符串Field,但是不会进行分词,会将整个串存储在索引中,比如(订单号,身份证号等)是否存储在文档中用Store.YES或Store.NO决定

FloatPoint(FieldName, FieldValue)

Float型YYN

这个Field用来构建一个Float数字型Field,进行分词和索引,不存储, 比如(价格) 存储在文档中

DoublePoint(FieldName,FieldValue)

Double型

YYN

这个Field用来构建一个Double数字型Field,进行分词和索引,不存储

LongPoint(FieldName, FieldValue)

Long型YYN

这个Field用来构建一个Long数字型Field,进行分词和索引,不存储

IntPoint(FieldName, FieldValue)

Integer型YYN

这个Field用来构建一个Integer数字型Field,进行分词和索引,不存储

StoredField(FieldName, FieldValue)

重载方法,支持多种类型

NNY

这个Field用来构建不同类型Field不分析,不索引,但要Field存储在文档中

TextField(FieldName, FieldValue,Store.NO) 或 TextField(FieldName,reader)

字符串或流

YYY或N

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

NumericDocValuesField(FieldName,FieldValue)

数值

---

配合其他域排序使用

3 Field修改

3.1 修改分析

图书id:

是否分词:不用分词,因为不会根据商品id来搜索商品

是否索引:不索引,因为不需要根据图书ID进行搜索

是否存储:要存储,因为查询结果页面需要使用id这个值。

图书名称:

是否分词:要分词,因为要根据图书名称的关键词搜索。

是否索引:要索引。

是否存储:要存储。

图书价格:

是否分词:要分词,lucene对数字型的值只要有搜索需求的都要分词和索引,因 为lucene对数字型的内容要特殊分词处理,需要分词和索引。

是否索引:要索引

是否存储:要存储

图书图片地址:

是否分词:不分词

是否索引:不索引

是否存储:要存储

图书描述:

是否分词:要分词

是否索引:要索引

是否存储:因为图书描述内容量大,不在查询结果页面直接显示,不存储。

不存储是不在lucene的索引域中记录,节省lucene的索引文件空间。

如果要在详情页面显示描述,解决方案:

从lucene中取出图书的id,根据图书的id查询关系数据库(MySQL)中book表得到描述信息。

3.2 代码修改

对之前编写的testCreateIndex()方法进行修改。

代码片段

    /*** 创建索引库*/@Testpublic void createIndexTest() throws Exception {//1. 采集数据SkuService skuService = new SkuServiceImpl();List<Sku> skuList = skuService.querySkuList();//文档集合List<Document> docList = new ArrayList<>();for (Sku sku : skuList) {//2. 创建文档对象Document document = new Document();//创建域对象并且放入文档对象中/*** 是否分词: 否, 因为主键分词后无意义* 是否索引: 是, 如果根据id主键查询, 就必须索引* 是否存储: 是, 因为主键id比较特殊, 可以确定唯一的一条数据, 在业务上一般有重要所用, 所以存储*      存储后, 才可以获取到id具体的内容*/document.add(new StringField("id", sku.getId(), Field.Store.YES));/*** 是否分词: 是, 因为名称字段需要查询, 并且分词后有意义所以需要分词* 是否索引: 是, 因为需要根据名称字段查询* 是否存储: 是, 因为页面需要展示商品名称, 所以需要存储*/document.add(new TextField("name", sku.getName(), Field.Store.YES));/*** 是否分词: 是(因为lucene底层算法规定, 如果根据价格范围查询, 必须分词)* 是否索引: 是, 需要根据价格进行范围查询, 所以必须索引* 是否存储: 是, 因为页面需要展示价格*/document.add(new IntPoint("price", sku.getPrice()));document.add(new StoredField("price", sku.getPrice()));/*** 是否分词: 否, 因为不查询, 所以不索引, 因为不索引所以不分词* 是否索引: 否, 因为不需要根据图片地址路径查询* 是否存储: 是, 因为页面需要展示商品图片*/document.add(new StoredField("image", sku.getImage()));/*** 是否分词: 否, 因为分类是专有名词, 是一个整体, 所以不分词* 是否索引: 是, 因为需要根据分类查询* 是否存储: 是, 因为页面需要展示分类*/document.add(new StringField("categoryName", sku.getCategoryName(), Field.Store.YES));/*** 是否分词: 否, 因为品牌是专有名词, 是一个整体, 所以不分词* 是否索引: 是, 因为需要根据品牌进行查询* 是否存储: 是, 因为页面需要展示品牌*/document.add(new StringField("brandName", sku.getBrandName(), Field.Store.YES));//将文档对象放入到文档集合中docList.add(document);}//3. 创建分词器, StandardAnalyzer标准分词器, 对英文分词效果好, 对中文是单字分词, 也就是一个字就认为是一个词.Analyzer analyzer = new IKAnalyzer();//4. 创建Directory目录对象, 目录对象表示索引库的位置Directory dir = FSDirectory.open(Paths.get("E:\\dir"));//5. 创建IndexWriterConfig对象, 这个对象中指定切分词使用的分词器IndexWriterConfig config = new IndexWriterConfig(analyzer);//6. 创建IndexWriter输出流对象, 指定输出的位置和使用的config初始化对象IndexWriter indexWriter = new IndexWriter(dir, config);//7. 写入文档到索引库for (Document doc : docList) {indexWriter.addDocument(doc);}//8. 释放资源indexWriter.close();}

使用luke查看索引的建立情况

 


http://www.ppmy.cn/news/74110.html

相关文章

Git的项目管理工具的使用

Git的项目管理工具的使用 为什么学习Git软件&#xff1f; 主流开发中&#xff0c;基于互联网的开发项目都会使用git进行资源管理 资源管理&#xff1a;人力资源 ​ 代码资源 : .java .c . js 等 ​ 文档资源 &#xff1a; doc.md ,pdf 等 git是最常用的scm软件&#xff08;Soft…

软考初级程序员上午单选题(15)

1、在目前流行的大多数PC中&#xff0c;硬盘一般是通过硬盘接口电路连接到______。 A&#xff0e;CPU局部总线 B&#xff0e;PCI总线 C&#xff0e;ISA总线(AT总线) D&#xff0e;存储器总线 2、松耦合多处理机实现处理机间通信靠的是______。 A&#xff0e;共享主存 B&#x…

错题汇总10

1.如果MyClass为一个类&#xff0c;执行”MyClass a[5], *b[6]”语言会自动调用该类构造函数的次数是 A 2 B 5 C 4 D 9 5个Myclass对象的一个数组&#xff0c;调用5次Myclass类的构造函数 b实际为一个指针数组&#xff0c;该数组中每个元素都是Myclass*&#xff0c;不会调用…

linux中 list_entry 设计背景及原理解析

Linux 2.4.22 在这一版本中的 list_entry的宏定义实现如下&#xff1a; #define list_entry(ptr, type, member) \((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))乍一看&#xff0c;会觉得特别复杂&#xff0c;其实分析之后&#xff0c;会发现清晰…

从初级软件测试,到高级软件测试的必经之路

作为软件质量控制中的重要一环&#xff0c;软件测试工程师基本处于"双高"地位&#xff0c;即&#xff1a;地位高、待遇高&#xff0c;而随着软件测试行业等级越来越专业化&#xff0c;软件测试工程师也随即被分为不同的等级&#xff0c;即&#xff1a;初级测试工程师…

PointGPT 论文解读,点云的自回归生成预训练

PointGPT: Auto-regressively Generative Pre-training from Point Clouds 论文&#xff1a;https://arxiv.org/pdf/2305.11487.pdf 一种将GPT概念扩展到点云的方法&#xff0c;在多个3D点云下有任务中&#xff08;点云分类&#xff0c;part分割等&#xff09;上实现了最先进…

【Java入门】Java的语言概述

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Java入门篇系列&#xff0c;该专栏主要讲解&#xff1a;什么是java、java的数据类型与变…

Linux的启动流程

文章目录 Linux的启动流程BIOS、boot loader与kernel加载BIOSboot loader加载内核检测硬件与 initramfs 的功能 Linux的启动流程 本文章参考&#xff1a; [Uncertainty!!]的Linux的启动流程 Linux的启动流程是一个非常复杂的过程&#xff0c;下面是对Linux启动流程的详细分析&a…