`
风-起-了
  • 浏览: 7430 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

创建lucene时document字段属性的选择

阅读更多

转载请注明出处:http://xiaojimanman.iteye.com/admin/blogs/1972715

 

    在创建索引文件的时候,不知道会不会有下面的疑惑:

     1)document字段设置成什么类型?

     2)采用什么分词器?

     3)字段的权重设置成多少等?

    这些也许都是我们在创建索引文件中经常会遇到的问题,这篇就主要说一下自己关于第一个问题的理解

 

    此篇是以 lucene 4.3.1 为事例,其他版本类似:

    个人认为,我们在创建Document对象的时候,对于以后可能用于用户搜索的字段,我们在创建索引的时候必须对该字段值进行分词处理;对于那些只做存储的字段,就可以只简单的保存一下即可,不需要分词,也不需要检索;对于那些需要整体考虑字段,就不能采取分词。下面就简单的看下Document的API:

 

    对于那种已经有明确的类型的字段可以设置成 IntField、FloatField、LongField等,这种字段类型就像API中说的一样,可以高效的处理过滤和排序。如果索引文件中,某些字段是用来排序或者索引的,那这种类型应该是不错的选择。StringField 是将属性值当做一个整体,并不对其做分词操作,但是可以做检索。StoredField 只是将属性值做简单的存储,并不参与搜索、过滤和排序等操作,只是在查询索引时能通过IndexSearcher.doc(int) 或 IndexReader.document(int, org.apache.lucene.index.StoredFieldVisitor)  取得对应的字段值。TextField 类型主要用于根据用户输入词进行搜索的字段,这里就牵扯到分词器的选择。

     这里就简单的说一下自己对分词器选择的理解。选择何种分词器用户的搜索效果才更好,这个主要根据产品的特点(也许有人会说,这不等于白说嘛)。举个简单的例子:前几天自己给人民网新闻和论坛做了一个站内搜索,对于新闻这种信息的搜索,个人理解最大的就是对人名或者事件的搜索,如果分词器可以准确的处理出人名,那对搜索结果应该会有很大的提升,但是现在主流的几个分词器都没有关于人名的处理或者没有全面的处理,所以自己只能去修改IKAnalyzer分词器,让其可以准确的处理人名。这样,用户搜索出的结果质量就有很大的提高(和IKAnalyzer分词器相比),也就是说要根据自己产品的特点去选择或者修改现有的分词器。最后说一个,在创建索引和对用户搜索词分词的时候,尽量使用同一个分词器。

    

    下面就举一个简单的实例:

 /**  
 *@Description: Document与各个类(数据结构)之间的转换
 */ 
package cn.yicha.novel.search.util;  

import org.apache.lucene.document.Document;
import org.apache.lucene.document.IntField;
import org.apache.lucene.document.StoredField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.document.Field.Store;

import cn.yicha.novel.search.model.NovelIndex;
  
public class ParseDocument {

	/**
	 * @param novelIndex
	 * @return Document
	 * @Date: 2013-11-1  
	 * @Author: lulei  
	 * @Description: 将NovelIndex对象转化为Document对象,如果NovelIndex为空或者不全,直接返回null
	 */
	public static Document parseNovelIndexToDocument(NovelIndex novelIndex){
		if (novelIndex == null || !novelIndex.isFull()){
			return null;
		}
		
		Document doc =  new Document();
		
		//StoredField
		if (novelIndex.getSourceSite() != null) {
			doc.add(new StoredField("sourceSite", novelIndex.getSourceSite()));
		}
		if (novelIndex.getChapterList() != null) {
			doc.add(new StoredField("chapterList", novelIndex.getChapterList()));
		}
		//StringField
		if (novelIndex.getUpdateTime() != null) {
			doc.add(new StringField("updateTime", novelIndex.getUpdateTime(), Store.YES));
		}
		if (novelIndex.getAuthor() != null) {
			doc.add(new StringField("author", novelIndex.getAuthor(), Store.YES));
		}
		if (novelIndex.getName() != null) {
			doc.add(new StringField("name", novelIndex.getName(), Store.YES));
		}
		if (novelIndex.getType() != null) {
			doc.add(new StringField("type", novelIndex.getType(), Store.YES));
		}
		if (novelIndex.getNid() != null) {
			doc.add(new StringField("nid", novelIndex.getNid(), Store.YES));
		}
		//IntField
		if (novelIndex.getChapterCount() != -1) {
			doc.add(new IntField("chapterCount", novelIndex.getChapterCount(), Store.YES));
		}
		if (novelIndex.getState() != -1) {
			doc.add(new IntField("state", novelIndex.getState(), Store.YES));
		}
		//TextField
		if (novelIndex.getDescription() != null) {
			doc.add(new TextField("description", novelIndex.getDescription(), Store.YES));
		}
		if (novelIndex.getKeyWords() != null) {
			TextField keyWords = new TextField("keyWords", novelIndex.getKeyWords(), Store.YES);
			keyWords.setBoost(1.5f);
			doc.add(keyWords);
		}
		return doc;
	}
}

    这就是自己现在测试项目中的一个用到的一个具体实例,当然细节还有待进一步的验证与调整。

 

    具体的业务就只对 keyWords 和 description 这两个字段做分词搜索,所以也就只有这两个字段采用 TextFiled 类型,其他字段都根据具体的业务选择了对应的类型。
 

  • 大小: 214.9 KB
分享到:
评论

相关推荐

    Lucene创建索引步骤

    Lucene创建索引步骤: 1、创建Directory(索引位置) 2、创建IndexWrite(写入索引) 3、创建Document对象 4、为Document添加Field(相当于添加属性:类似于表与字段的关系) 5、通过IndexWriter添加文档到索引中

    整理Lucene.net一些简单属性说明

    Document由多个字段(Field)组成,每个字段都有其特定的属性,如是否可搜索、可存储、可索引等。例如,`TextField`用于存储全文本内容,`StringField`用于存储固定长度的非可搜索字符串。 3. **IndexWriter**: 这...

    Lucene3.0创建索引

    - 对于每个文本文件,创建一个`Document`对象,并向其中添加字段。 - `Field("contents", new FileReader(files[i]))`:添加文件内容字段。 - `Field("filename", files[i].getName(), Field.Store.YES, Field....

    lucene 对 xml建立索引

    - 当使用SAX解析XML时,解析器会遍历XML文档并触发一系列回调方法,如`startDocument()`、`endDocument()`、`startElement()`等。 #### 三、建立索引的过程 1. **解析XML文档** - 在建立索引之前,需要先将XML...

    lucene3.5的创建和增删改查

    3. 创建Directory:Directory是Lucene存储索引的地方,可以选择不同的实现,如FSDirectory(文件系统目录)或RAMDirectory(内存目录)。 4. 创建IndexWriter:IndexWriter负责创建和更新索引,需要指定Directory和...

    lucene创建修改删除组合条件查询

    使用`Analyzer`对文本进行分词,然后使用`Document`对象存储字段和值。最后,通过`IndexWriter`将文档写入索引。 接下来,**删除文档**操作在索引维护中至关重要。在Lucene中,删除文档并不直接从磁盘上移除,而是...

    Lucene5学习之创建索引入门示例

    **Lucene5学习之创建索引入门示例** 在IT领域,搜索引擎的开发与优化是一项关键技术,而Apache Lucene作为一款高性能、全文本搜索库,是许多开发者进行文本检索的首选工具。本文将深入探讨如何使用Lucene5来创建一...

    Lucene索引器实例

    - 创建`Document`对象:为每个要索引的记录创建一个文档实例,并为其添加字段。 - 使用`addDocument`方法:通过`IndexWriter`将文档添加到索引中。 **4. 更新和删除文档** - 更新文档:Lucene不支持直接更新已存在...

    Lucene 索引的简单使用

    - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段(Field)。 - **字段(Field)**:字段是文档的组成部分,每个字段都有特定的类型(如文本、日期等),并可以被索引或...

    lucene for java 简单demo

    - **文档(Document)**:在Lucene中,每个文档都是一个包含多个字段(Field)的数据结构,字段可以设置为可搜索或非可搜索。 - **字段(Field)**:字段是文档的一部分,比如文章的标题、内容、作者等,每个字段都...

    Lucene建立索引及查询包含“java”关键字 示例代码

    5. **创建Document对象并添加字段**:每个Document代表一个要索引的记录,字段(Field)是Document的组成部分,如"content"字段用于存储文本内容。 6. **添加Document到索引**:使用IndexWriter的addDocument方法。...

    最新Lucene5.2.1实例(带Jar包)

    3. **文档对象模型**: 在Lucene中,数据被表示为`Document`对象,每个字段(如标题、内容等)被表示为`Field`。你可以自由定义文档的结构,添加必要的字段并设置它们的属性(是否存储、是否可搜索等)。 4. **索引...

    SpringBoot+Lucene搜索结果高亮显示Demo

    这个SpringBoot+Lucene的Demo为开发者提供了一个起点,可以在此基础上进一步扩展,比如增加对多字段的索引和搜索、支持多种类型的文档、优化查询性能等。通过熟练掌握这些知识,你可以构建出更加强大的全文搜索引擎...

    lucene 4.7.2 Demo

    本文将深入探讨Lucene 4.7.2的特性,包括创建、删除和修改索引,以及高级搜索功能如通用对象搜索、范围搜索、排序和高亮显示。 首先,让我们了解如何利用Lucene 4.7.2创建索引。创建索引是全文检索的基础,它涉及将...

    Lucene3总体图_建索引_查询_数据库索引

    - **Field**:表示文档中的一个字段或属性。 ##### 3. `index` 该模块负责索引的创建、读取及维护。关键类包括: - **IndexWriter**:用于创建、更新和优化索引。 - **IndexReader**:用于读取索引并支持删除操作...

    Lucene Demo(创建、增加、更新、删除索引等)

    `Document` 对象是一个容器,可以包含多个字段(Field),每个字段都有其特定的属性,如是否存储原始内容、是否可被搜索等。 **增加索引** 在已有索引的基础上增加新文档,可以直接调用 `IndexWriter` 的 `...

    lucene全文搜素实例 java lucene 实例

    文档由多个字段(Field)组成,每个字段有其特定的属性,如是否可搜索、是否存储原始内容等。 3. **字段(Field)**:文档中的每个部分都可以被定义为一个字段,如标题、内容、作者等。每个字段都有自己的索引和...

    lucene入门小例子

    Lucene是中国大百科全书式的全文检索库,它在...这些都是深入理解和运用Lucene时需要关注的点。 总之,Lucene是一个强大且灵活的全文检索工具,通过这个入门小例子,你可以逐步揭开其神秘的面纱,踏入文本搜索的世界。

    lucene对数据库操作

    2. **创建Lucene Document**:每个数据库记录对应一个Lucene Document对象,其中包含字段(Field)和值。例如,可以创建一个“title”字段用于存储数据库记录的标题,一个“content”字段用于存储正文内容。 3. **...

    Lucene简单实例记录

    1. **包导入**:首先,需要导入Lucene相关的包,包括`java.io`用于文件操作,`org.apache.lucene.analysis`用于文本分析,`org.apache.lucene.document`用于创建文档对象,以及`org.apache.lucene.index`用于索引...

Global site tag (gtag.js) - Google Analytics