`
wutao8818
  • 浏览: 618347 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

lucene几个类的含义

阅读更多

		IndexSearcher searcher = new IndexSearcher(path);
		//搜索字段。值
		Term t=new Term(searchType,searchKey);
		//term产生query
		Query q=new TermQuery(t);
		//<document,frequency>枚举对象TermDocs
		TermDocs termDocs=searcher.getIndexReader().termDocs(t);
		
		while(termDocs.next()){
			System.out.println(termDocs.freq());//searchKey在文档中出现次数
			//包含searchKey的文档。
			System.out.println(searcher.getIndexReader().document(termDocs.doc()));
			
		}



引用
Field

Store.COMPRESS//被压缩后存储
Store.YES //被存储
Store.NO //不被存储

Index.NO//不索引
Index.TOKENIZED//分词后索引
Index.UN_TOKENIZED//不分词索引
Index.NO_NORMS//不使用Analyzer来索引Field


引用
IndexWriter(String path,Analyzer a,boolean create);

IndexWriter有三个构造器,第一个参数都差不多的意思,路径。关键的第三个参数要小心一些。如果是第一次创建设置为true,如果是爹如此更新就应该设置为false,否则原来创建的索引就被删除了!




		Directory ram = new RAMDirectory();
		IndexWriter writer = new IndexWriter(ram, new StandardAnalyzer(), true,
				MaxFieldLength.UNLIMITED);

		List<String> valueList = new ArrayList<String>();
		valueList.add("Dell");
		valueList.add("eDll");
		valueList.add("ledl");
		valueList.add("llDe");

		for (int i = 0; i < 100; i++) {
			Document doc = new Document();
			Field field = new Field("name", valueList.get(Double.valueOf(
					Math.random() * 4).intValue()), Field.Store.NO,
					Field.Index.NOT_ANALYZED);
			doc.add(field);
			writer.addDocument(doc);
			System.out.println(doc);
		}
		writer.close();

		Searcherd searcherd = new Searcherd();
		searcherd.setDirectory(ram);
		searcherd.search("name", "Dell");
	


引用
writer.close();
关闭索引器,并将在IO缓存上的数据都写入磁盘,关闭流。如果没有关闭,索引目录除了segments外一无所有。忘记关闭,将导致索引数据滞留在缓存中,未写入磁盘,有可能导致目录锁未释放,导致下一次加入索引文件时,无法加入。


写入锁
package org.apache.lucene.index.IndexWriter

IndexWriter的构造器都调用这个方法。

  private void init(Directory d, Analyzer a, final boolean create, boolean closeDir, 
                    IndexDeletionPolicy deletionPolicy, boolean autoCommit, int maxFieldLength,
                    IndexingChain indexingChain, IndexCommit commit)
    throws CorruptIndexException, LockObtainFailedException, IOException {
    this.closeDir = closeDir;
    directory = d;
    analyzer = a;
    setMessageID(defaultInfoStream);
    this.maxFieldLength = maxFieldLength;

    if (indexingChain == null)
      indexingChain = DocumentsWriter.DefaultIndexingChain;

    if (create) {
      // Clear the write lock in case it's leftover:
      directory.clearLock(WRITE_LOCK_NAME);
    }


    Lock writeLock = directory.makeLock(WRITE_LOCK_NAME);

    if (!writeLock.obtain(writeLockTimeout)) // obtain write lock
      throw new LockObtainFailedException("Index locked for write: " + writeLock);
    this.writeLock = writeLock;                   // save it

    try {
      if (create) {
        // Try to read first.  This is to allow create
        // against an index that's currently open for
        // searching.  In this case we write the next
        // segments_N file with no segments:
        boolean doCommit;
        try {
          segmentInfos.read(directory);
          segmentInfos.clear();
          doCommit = false;
        } catch (IOException e) {
          // Likely this means it's a fresh directory
          doCommit = true;
        }

        if (autoCommit || doCommit) {
          // Always commit if autoCommit=true, else only
          // commit if there is no segments file in this dir
          // already.
          segmentInfos.commit(directory);
          synced.addAll(segmentInfos.files(directory, true));
        } else {
          // Record that we have a change (zero out all
          // segments) pending:
          changeCount++;
        }
      } else {
        segmentInfos.read(directory);

        if (commit != null) {
          // Swap out all segments, but, keep metadata in
          // SegmentInfos, like version & generation, to
          // preserve write-once.  This is important if
          // readers are open against the future commit
          // points.
          if (commit.getDirectory() != directory)
            throw new IllegalArgumentException("IndexCommit's directory doesn't match my directory");
          SegmentInfos oldInfos = new SegmentInfos();
          oldInfos.read(directory, commit.getSegmentsFileName());
          segmentInfos.replace(oldInfos);
          changeCount++;
          if (infoStream != null)
            message("init: loaded commit \"" + commit.getSegmentsFileName() + "\"");
        }

        // We assume that this segments_N was previously
        // properly sync'd:
        synced.addAll(segmentInfos.files(directory, true));
      }

      this.autoCommit = autoCommit;
      setRollbackSegmentInfos(segmentInfos);

      docWriter = new DocumentsWriter(directory, this, indexingChain);
      docWriter.setInfoStream(infoStream);
      docWriter.setMaxFieldLength(maxFieldLength);

      // Default deleter (for backwards compatibility) is
      // KeepOnlyLastCommitDeleter:
      deleter = new IndexFileDeleter(directory,
                                     deletionPolicy == null ? new KeepOnlyLastCommitDeletionPolicy() : deletionPolicy,
                                     segmentInfos, infoStream, docWriter);

      if (deleter.startingCommitDeleted)
        // Deletion policy deleted the "head" commit point.
        // We have to mark ourself as changed so that if we
        // are closed w/o any further changes we write a new
        // segments_N file.
        changeCount++;

      pushMaxBufferedDocs();

      if (infoStream != null) {
        message("init: create=" + create);
        messageState();
      }

    } catch (IOException e) {
      this.writeLock.release();
      this.writeLock = null;
      throw e;
    }
  


引用
限制每个Field中词条的数量

因为在分析和存储前,信息都占据于内存空间,巨大的数据会导致内存不足。
IndexWriter.setMaxFieldLength设置。立即生效。


writer.addDocument
writer.setMaxFieldLength
writer.addDocument

第三行已经生效。

分享到:
评论

相关推荐

    lucene源码和程序

    在Lucene中,主要涉及以下几个核心概念: 1. **文档(Document)**:在Lucene中,文档是信息的基本单位,可以代表网页、电子邮件或者其他形式的数据。文档由一系列字段(Field)组成,每个字段有名称和内容,比如...

    Lucene加庖丁解牛测试类

    在“Lucene加庖丁解牛测试类”中,我们可以从以下几个方面进行实践: 1. **索引构建**:测试类应包含创建索引的代码,这通常涉及Analyzer的选择(如StandardAnalyzer)、Document的构建以及IndexWriter的使用。...

    lucene_demo例子

    这些示例通常会涵盖以下几个关键知识点: 1. **安装与配置**:Lucene的下载、构建环境的搭建,包括引入相应的Maven或Gradle依赖,以及设置Java开发环境。 2. **索引创建**:Lucene是如何通过Analyzer分析文本,将...

    lucene 入门

    Lucene 的核心组件包括以下几个部分: 1. **索引(Indexing)**:Lucene 首先将非结构化的文本数据转化为结构化的索引,以便于快速检索。这个过程包括分词(Tokenization)、词干提取(Stemming)、停用词处理...

    Lucene中文分词器组件

    在Lucene中,常见的中文分词器组件有以下几个: 1. **IK Analyzer**:IK Analyzer是一个开源的、基于Java实现的中文分词工具,支持多种分词模式,包括精确模式、全模式、最短路径模式等。它可以根据实际需求进行...

    lucene1.0.doc

    Lucene的核心组件包括以下几个部分: 1. 文档(Document):代表要索引的数据源,可以是网页、文章、数据库记录等。 2. 字段(Field):文档中的数据被划分为不同的字段,每个字段具有特定的含义和处理方式。 3. ...

    lucene文档--

    Lucene的核心概念包括以下几个方面: 1. **索引**:在Lucene中,索引是将非结构化的文本数据转化为可搜索的形式。它通过分词器(Tokenizer)将文本拆分成单词,然后对这些单词创建倒排索引。倒排索引是一种数据结构...

    Lucene检索算法的改进.pdf

    文章详细阐述了一个改进后的系统模型,该模型主要包括以下几个关键步骤: 1. **天网源数据**:指原始的网页数据来源,是整个检索系统的基础。 2. **数据转换**:通过网页分析器和XML转换器将原始网页数据转换成...

    一个例子教你学懂搜索引擎(lucene)

    在给定的文件“luceneTest”中,可能包含了示例代码或者配置文件,这通常包括以下几个步骤: 1. 初始化索引目录:创建一个FSDirectory对象,指定用于存储索引的物理路径。 2. 创建索引写入器:使用...

    PanGu.Lucene.Analyzer.rar

    Pangu分析器的核心功能包括以下几个方面: 1. **中文分词**:中文不同于英文,单词之间没有明显的边界。Pangu分析器采用了先进的分词算法,能够准确识别和切割中文词语,如使用字典匹配、基于统计的模型等方法。 2...

    Lucene 原理与代码分析完整版1

    在索引中,主要存储的是以下几个关键元素: 1. **文档(Document)**:这是索引的基本单位,可以是一篇文章、一封邮件或其他任何包含文本的数据。在Lucene中,文档由一系列字段(Field)组成,每个字段都有其特定的...

    lucene索引

    创建索引是 Lucene 的核心步骤,包括以下几个阶段: #### 2.1 初始化索引目录 首先,需要创建一个索引目录,这可以是本地文件系统、网络共享目录,甚至是内存中的索引。 ```java Directory directory = ...

    java拼车网雏形(Ext2.0+SSH+oracle10g+lucene2.4)

    【标题】"java拼车网雏形(Ext2.0+SSH+oracle10g+lucene2.4)" 涉及的核心技术是Java Web开发中的几个关键组件,包括ExtJS 2.0前端框架,Spring、Struts2和Hibernate(SSH)后端框架,Oracle 10g数据库以及Lucene ...

    java大数据作业_7Flume、Kafka、Sqoop、Lucene

    建立索引的过程通常包括以下几个步骤: 1. **创建索引器**:首先需要创建一个 IndexWriter 对象,用于管理索引的写入操作。 2. **文档解析**:将要索引的文档转换为 Document 对象,每个文档包含多个 Field。 3. **...

    我自己的demo例子

    从提供的文件名"sample.ck.paper.lucene3"来看,我们可以推断出几个关键信息: 1. **sample**:这个词通常用来表示示例或样例,这与标题中的“demo例子”相吻合,表明这是一个用来演示或教学的例子。 2. **ck**:...

    Manning Taming Text How to Find, Organize, and Manipulate It. Jan.2013.pdf

    2. 描述部分提到的关键词“lucene solr search NLP”指向了文档讨论的几个核心主题: - Lucene:这是由Apache软件基金会支持的一个高性能的、可伸缩的全文检索库,广泛用于搜索引擎和文档检索系统。它以Java编写,...

    Solr-ik分词

    在Solr中配置Ik分词器,通常需要以下几个步骤: 1. 下载ikanalyzer-solr5版本的分词器库,并将其添加到Solr的lib目录下,确保Solr启动时能够加载到这个库。 2. 在Solr的schema.xml文件中,定义一个字段类型(Field...

    重复数字统计器 .e文件

    使用ES配合“重复数字统计器.e”有以下几个优点: 1. **分布式存储**:ES具有强大的横向扩展能力,能轻松处理PB级别的数据。 2. **实时分析**:ES的实时索引和搜索功能,使得用户可以在数据输入的同时获得统计结果。...

    Android 智能问答机器人的实现

    博客实例代码中的"zhy_robot_01"可能包含以下几个关键部分: 1. **用户界面(UI)设计**:包括输入框供用户输入问题,以及显示答案的区域。可以使用Android Studio提供的布局设计工具创建。 2. **事件监听器**:监听...

    基于HDFS、ElasticSearch、Spark和TensorFlow的文本分析中台基础架构.pptx

    该文本分析中台的基础架构主要包括以下几个部分: 1. **数据收集层**:通过日志采集工具(如 Flume、Logstash 等)将各类文本数据收集起来,存储至 HDFS。 2. **数据处理层**:利用 Spark 进行数据预处理,包括数据...

Global site tag (gtag.js) - Google Analytics