`
风-起-了
  • 浏览: 7123 次
  • 性别: 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添加文档到索引中

    lucene2.9.1所有最新开发包及源码及文档

    create为true时,原索引文件不存在就创建,存在就覆盖。 create为false时,原索引文件不存在就报错,存在就追加。 b) 常用方法: void addDocument(Document doc); //把指定文档添加到索引写出器中 void iw....

    最新Lucene教程

    3)document包相对而言比较简单,该包下面有3个类,document相对于关系型数据库的记录对象,Field主要负责字段的管理。 4)org.apache.1ucene.index索引管理,包括索引建立、删除等。索引包是整个系统核心,全文检索...

    集成Lucene和HBase

    Lucene简介Lucene中可搜索的实体都表现为文档(document),它由字段(field)和值(value)组成。每个字段值都由一个或多个可搜索的元素——即词汇(term)——组成。Lucene搜索基于反向索引,其中包含了关于可搜索...

    clucene-core lucene c

    总得来说用Lucene来进行建立 和搜索和操作数据库是差不多的(有点像),Document可以看作是 数据库的一行记录,Field可以看作是数据库的字段。用lucene实 现搜索引擎就像用JDBC实现连接数据库一样简单。

    重要lucene2.0 学习文档

    Lucene是apache组织的一个...总得来说用Lucene来进行建立和搜索和操作数据库是差不多的,Document可以看作是数据库的一行记录,Field可以看作是数据库的字段。用lucene实现搜索引擎就像用JDBC实现连接数据库一样简单。

    Lucene全文检索(一)

    Lucene实现全文检索的流程 创建索引 获得文档 原始文档:要基于那些数据来进行搜索,那么这些数据就是原始文档。 搜索引擎:使用爬虫获得原始文档 站内搜索:数据库中的数据。 本地搜索:直接使用io流读取磁盘上的...

    【分享:lucene学习资料】---<下载不扣分,回帖加1分,欢迎下载,童叟无欺>

    4.1. Document文档类 4 4.1.1. 常用方法 4 4.1.2. 示例 4 4.2. Field字段类 4 4.2.1. 构造方法 4 4.2.2. Store类 5 4.2.3. Index类 5 4.2.4. 示例 5 4.3. IndexWriter类 5 4.3.1. 构造方法 5 4.3.2. 添加文档 5 ...

    elasticsearch概述及应用.pdf

    Elasticsearch的核心概念主要包括索引(Index)、类型(Type)、文档(Document)和字段(Field)。索引是一个存储相关文档的容器,类似于关系型数据库中的数据库;类型类似于关系型数据库中的表,但在Elasticsearch...

    Solr全文搜索服务器-其他

    每个文档由一系列的Field构成,每个Field表示资源的一个属性Solr中的每个Document需要有能唯一标识其自身的属性,默认情况下这个属性的名字是id,在Schema配置文件中使用:id进行描述。 Solr是一个高性能,采用Java...

    基于javatcpsocket通信的拆包和装包源码-ik-elasticsearch:创建ik-elasticsearch的全过程

    基于java tcp socket通信的拆包和装包源码 ik-elasticsearch 需要了解Docker, 基础linux命令 概述 全文搜索引擎,可以快速地储存、搜索和...Document的集合 Elasticsearch 会索引所有字段,经过处理后写入一个反向索引

    Java EE常用框架.xmind

    这些数据库表由Actitviti创建,由Activiti维护。 部署完的工作流是需要手动去执行该工作流的。 根据由谁处理当前任务,我们就可以查询出具体的任务信息。 根据任务的id,我们就可以执行任务了。 细节 ...

    BabyGoogle:最简单的谷歌克隆

    宝贝谷歌### 任务:基于 Lucene 全文搜索制作一个简单的“Google”克隆。 要求:一个极其简单的 Web 应用程序,具有以下一组页面: 第 1 页: /index | (GET 方法)包含一个由文本字段和“索引”按钮组成的表单。 ...

    ZendFramework中文文档

    2.1.3. 创建访问控制列表(ACL) 2.1.4. 注册角色(Role) 2.1.5. 定义访问控制 2.1.6. 查询 ACL 2.2. 精细的访问控制 2.2.1. 精细的访问控制 2.2.2. 除去访问控制 2.3. 高级用法 2.3.1. 保存 ACL 数据确保持久...

Global site tag (gtag.js) - Google Analytics