`

lucene第一步---4.Field.Store解析

阅读更多
lucene第一步---4.Field.Store解析

Store
      COMPRESS:压缩保存。用于长文本或二进制数据
      YES:保存
      NO:不保存
具体理解当然是给出示例了:
package demo.first;

import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.store.LockObtainFailedException;

public class TestFieldStore {
	/**
	 * 索引文件的存放位置
	 */
	String path = "D://workspace//fwk//lucenedemo//firstLuceneIndex";
	
	public void createLuceneIndex(){
		try {
			IndexWriter iw = new IndexWriter(path,new StandardAnalyzer(),true);
			Document doc = new Document();
			//Store.YES 保存 可以查询 可以打印内容
			Field storeYes = new Field("storeyes","storeyes",Store.YES,Index.TOKENIZED);
			//Store.NO 不保存 可以查询 不可打印内容 由于不保存内容所以节省空间
			Field storeNo = new Field("storeno","storeno",Store.NO,Index.TOKENIZED);
			//Store.COMPRESS 压缩保存 可以查询 可以打印内容 可以节省生成索引文件的空间			Field storeCompress = new Field("storecompress","storecompress",Store.COMPRESS,Index.TOKENIZED);
			doc.add(storeYes);
			doc.add(storeNo);
			doc.add(storeCompress);
			iw.addDocument(doc);
			iw.optimize();
			iw.close();
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void testSearch(){
		try {
			IndexSearcher iser = new IndexSearcher(path);

			/*
			 * Store.YES 采用保存模式,可以查询到,并且可以打印出内容
			 */
			System.out.println("---storeYes");
			QueryParser queryParser1 = new QueryParser("storeyes",new StandardAnalyzer());
			Hits hits1 = iser.search(queryParser1.parse("storeyes"));
			for(int i = 0;i<hits1.length();i++){
				System.out.println("id :"+hits1.id(i));
				System.out.println("doc :"+hits1.doc(i));
				System.out.println("context :"+hits1.doc(i).get("storeyes"));
				System.out.println("score :"+hits1.score(i));
			}
			
			/*
			 * Store.NO 采用不保存模式,可以查询到,但是不能打印出内容
			 */
			System.out.println("---storeNo");
			QueryParser queryParser2 = new QueryParser("storeno",new StandardAnalyzer());
			Hits hits2 = iser.search(queryParser2.parse("storeno"));
			for(int i = 0;i<hits2.length();i++){
				System.out.println("id :"+hits2.id(i));
				System.out.println("doc :"+hits2.doc(i));
				System.out.println("context :"+hits2.doc(i).get("storeno"));
				System.out.println("score :"+hits2.score(i));
			}
			
			/*
			 * Store.COMPRESS 采用压缩保存模式,可以查询到,并且可以打印出内容
			 */
			System.out.println("---storeCompress");
			QueryParser queryParser3 = new QueryParser("storecompress",new StandardAnalyzer());
			Hits hits3 = iser.search(queryParser3.parse("storecompress"));
			for(int i = 0;i<hits3.length();i++){
				System.out.println("id :"+hits3.id(i));
				System.out.println("doc :"+hits3.doc(i));
				System.out.println("context :"+hits3.doc(i).get("storecompress"));
				System.out.println("score :"+hits3.score(i));
			}
			
			iser.close();
		} catch (CorruptIndexException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		TestFieldStore tfs = new TestFieldStore();
		tfs.createLuceneIndex();
		tfs.testSearch();
	}
}


由此可以看出Field.Store的设置与否与是否可以搜索到无关。
这里整理一下
Field.Store
     :YES 可以搜索,保存原值
      :NO  可以搜索,不保存原值
     :COMPRESS 可以搜索,压缩保存原值
这里需要注意的是在实际使用中,并不建议使用COMPRESS,存在压缩和解压过程,效率低下,对于大文本尽量使用NO
还有一点就是是否可被搜索与Store无关,只与Index有关。
这里使用的是lucene 2.3.2
本系列教程如果没有明确指出都是沿用此版本
分享到:
评论

相关推荐

    Annotated Lucene 中文版 Lucene源码剖析

    - 创建一个简单的索引,并进行基本的查询操作,这是入门Lucene的第一步。 - **Lucene Roadmap**: - 了解Lucene的发展历程及其未来规划对于开发者来说非常重要。 #### 索引文件结构 - **索引数据术语和约定**:...

    第一个lucene程序

    1. **创建索引**:这是Lucene工作的第一步,它会把文档内容解析成一系列的术语(tokens),然后为每个术语建立倒排索引。倒排索引是一种数据结构,它允许快速查找包含特定术语的文档。 2. **索引写入**:在创建索引...

    Lucene.Net-2.9.2 c#源码

    1. 分词器(Tokenizer):分词器是Lucene处理文本的第一步,负责将输入的字符串分解为一系列的词元(Token)。Lucene.Net包含多种预定义的分词器,如StandardAnalyzer用于英文,而ChineseAnalyzer适用于中文。 2. ...

    Lucene 索引的简单使用

    - **分词器(Tokenizer)**:分词器将输入的文本分解为一系列的词语,这是建立索引的第一步。 - **分析器(Analyzer)**:分析器结合了分词器、过滤器等,负责对文本进行预处理,如去除停用词、词形还原等。 ### 2...

    lucene2.9开发指南

    - **建立索引**:这是Lucene搜索的第一步,涉及将数据转换为可搜索的索引结构。这通常包括读取数据源(如文件或数据库),然后将内容解析为文档,并使用分析器对文档内容进行分词。 - **搜索索引**:一旦索引建立...

    lucene实例

    - **分词**: Lucene使用Analyzer进行分词,将文本分解为关键词,这是建立索引的第一步。 - **倒排索引**: Lucene最核心的索引结构,它将每个关键词与包含该关键词的文档对应起来,便于快速找到包含特定关键词的文档...

    lucene3.0全文检索入门实例

    创建索引是全文检索的第一步。在 Lucene 3.0 中,使用 `IndexWriter` 类来写入文档到索引中。相比于 2.0 版本,3.0 引入了更高级的分析器(Analyzer)和文档(Document)处理,使得对文本的预处理更为精细,支持更多...

    Lucene入门源码

    创建索引是Lucene的第一步,主要涉及以下步骤: 1. **初始化Directory对象**:用于存储索引,可以选择不同的实现,如FSDirectory(文件系统目录)或RAMDirectory(内存目录)。 2. **创建IndexWriter对象**:配置...

    lucene的列子

    创建索引是使用Lucene的第一步。你需要创建一个`IndexWriter`对象,指定一个目录(如本地文件系统或分布式存储),这将是存储索引的地方。然后,你可以使用`Document`对象来表示你要索引的每个文档,添加字段(如...

    搜索引擎Lunce快速入门

    创建索引是Lunce的第一步。以下是一个简单的示例,演示如何索引一个文件: 1. 导入必要的库: ```java import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document...

Global site tag (gtag.js) - Google Analytics