`
Mr_Tank_
  • 浏览: 21302 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

【Lucene】近实时搜索

 
阅读更多

近实时搜索:可以使用一个打开的IndexWriter快速搜索索引的变更内容,而不必首先关闭writer,或者向该writer提交;这是2.9版本之后推出的新功能。

代码示例(本例参考《Lucene In Action》):

package com.tan.code;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class NearRealTimeTest {

	public static final String INDEX_DIR_PATH = "E:\\indexDir";

	private Analyzer analyzer = null;

	private File indexFile = null;

	private Directory directory = null;

	private IndexReader indexReader = null;

	private IndexSearcher indexSearcher = null;
	private IndexWriter indexWriter = null;

	public void nearRealTime() throws IOException {

		analyzer = new IKAnalyzer(true);
		indexFile = new File(INDEX_DIR_PATH);
		directory = new SimpleFSDirectory(indexFile);

		indexWriter = new IndexWriter(directory, new IndexWriterConfig(
				Version.LUCENE_43, analyzer));
		for (int i = 0; i < 10; i++) {
			Document document = new Document();
			document.add(new StringField("id", "id" + i, Store.YES));
			document.add(new TextField("name", "my name is tank" + i, Store.YES));
			document.add(new TextField("content", "content" + i, Store.YES));
			indexWriter.addDocument(document);
		}

		// indexReader = DirectoryReader.open(directory);

		// 3.x 旧版本中使用indexWriter.getReader()创建近实时reader,本示例代码使用的是4.3.1版本

		indexReader = DirectoryReader.open(indexWriter, true);
		indexSearcher = new IndexSearcher(indexReader);

		Query query = new TermQuery(new Term("name", "name"));
		TopDocs topDocs = indexSearcher.search(query, 100);
		System.out.println("命中数:" + topDocs.totalHits);

		/*
		 * 建立索引变更,但是不提交
		 */
		Query q = new TermQuery(new Term("id", "id1"));
		indexWriter.deleteDocuments(q);// 根据id删除一个文档

		// 再添加10个
		for (int i = 10; i < 20; i++) {
			Document document = new Document();
			document.add(new StringField("id", "id" + i, Store.YES));
			document.add(new TextField("name", "my name is tank" + i, Store.YES));
			document.add(new TextField("content", "content" + i, Store.YES));
			indexWriter.addDocument(document);
		}
		//

		// reader.reopen();
		// 读入新增加的增量索引内容,满足实时索引需求
		//
		IndexReader newReader = DirectoryReader.openIfChanged(
				(DirectoryReader) indexReader, indexWriter, true);

		indexReader.close();

		Query query2 = new TermQuery(new Term("name", "name"));
		indexSearcher = new IndexSearcher(newReader);

		TopDocs topDocs2 = indexSearcher.search(query2, 100);
		System.out.println("命中数:" + topDocs2.totalHits);

		newReader.close();
		indexWriter.close();
	}
}

测试代码:

package com.tan.test;

import static org.junit.Assert.*;

import java.io.IOException;

import org.junit.Test;

import com.tan.code.NearRealTimeTest;

public class MyTest {

	@Test
	public void test() throws IOException {
		//fail("Not yet implemented");
		NearRealTimeTest nearRealTimeTest=new NearRealTimeTest();
		nearRealTimeTest.nearRealTime();
	}

}

测试结果(建议使用Luke查看索引结果):


【推荐博客:http://qindongliang1922.iteye.com/category/282568

分享到:
评论

相关推荐

    lucene近实时搜索

    lucene 近实时搜索 很清楚的解释了关于lucene近实时搜索的代码。很值得学习

    Lucene 3.6 学习笔记

    目录 序言: 1 第一章 LUCENE基础 2 1.1 索引部分的核心类 2 1.2 分词部分的核心类 2 1.3 搜索部分的核心类 2 第二章 索引建立 3 2.1 创建Directory 3 2.2 创建Writer 3 ...(2) 近实时搜索的使用 67

    近实时搜索SearcherManager

    近实时搜索SearcherManager和NRTManager的使用

    全文检索 lucene

    作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种...同样,Lucene是当前与近几年内非常流行的免费的Java信息搜索(IR)库。

    lucene4.6例子

    创建索引,查询,过滤,同义词,近及时搜索,里面有4.6与5.0的jar文件,请自行引入

    curso_lucene-elasticsearch:Lucene和Elasticsearch课程

    弹性搜索 ElasticsearchJS Spring Data Elasticsearch ##资源Lucene标准分析仪vs Snowball Lucene:分析器,提取和搜索类似文档 Lucene的近实时搜索速度很快! 西蒙(Simon)说:优化对您不利... Solr vs. 弹性...

    十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统.pdf

    Elasticsearch 是一个开源的高度可扩展的全文搜索和分析引擎,拥有查询近实时的超强性能。 大名鼎鼎的Lucene 搜索引擎被广泛用于搜索领域,但是操作复杂繁琐,总是让开发者敬而远之。而 Elasticsearch将 Lucene 作为...

    elasticsearch源码.rar

    Elasticsearch(ES)是一个基于Lucene的近实时分布式存储及搜索分析系统,其应用场景广泛,可应用于日志分析、全文检索、结构化数据分析等多种场景,既可作为NoSQL数据库,也可作为搜索引擎。由于ES具备如此强悍的能力...

    Elasticsearch顶尖高手系列课程-核心知识篇-课程资料.zip

    相对于Spark Streaming、Storm等大数据实时计算引擎来说,Elasticsearch天生为分布式执行数据分析操作而生的架构,海量数据量级下的近实时(秒级)性能支持,以及无比强大的搜索和聚合分析的语法支持,让ES更加适合...

    Tantivy是受Apache Lucene启发并以Rust编写的全文本搜索引擎库-C/C++开发

    从某种意义上说,它不是现成的搜索引擎服务器,而是一个可用于构建这样的搜索引擎的板条箱,它与Apache Lucene的距离比与Elasticsearch或Apache Solr的距离更近。 实际上,Tantivy受到Lucene设计的强烈启发。 基准...

    ElasticSearch 可扩展的开源弹性搜索解决方案

    它提供了一个可扩展的搜索解决方案,内置支持近实时搜索和多租户。  《ElasticSearch 可扩展的开源弹性搜索解决方案》将教你如何构建一个快速、灵活、可扩展的搜索解决方案,通过建立自定义集群进入ElasticSearch的...

    es搜索引擎.doc

    elasticsearch是一个基于Lucene的高扩展的分布式搜索服务器,支持开箱即用。 2、elasticsearch隐藏了Lucene的复杂性,对外提供Restful 接口来操作索引、搜索。...2.近实时的去索引数据、搜索数据。

    elk-stack-guide-cn.pdf

    其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索...

    ELK使用简介

    它有配置简单、集群主机自动发现、索引自动分片、索引副本机制、RESTful风格接口、多数据源、自动搜索负载均衡等特点,能够提供稳定可靠的近实时搜索能力。 Logstash是一款分布式日志收集程序,它支持多输入源,并...

    solr-7.0.0.tgz

    Cloudera Search 使用的...Cloudera Search提供近实时(Near-Real-Time)数据访问服务,允许非技术人员通过简单的全文搜索接口,实现快速查询、浏览存储在Hadoop和Hase上的数据,而不需要掌握SQL、编程技能就可以使用。

    ES 的使用安装删除、各种操作配置代码

    ES是一个高度可伸缩的开源的全文检索和分析引擎,它允许你以近实时的方式快速存储、搜索、分析大量数据,ES是基于Lucence开发,隐藏其复杂性,提供了简单易用的restful api接口、Java api接口 1)、高度的可伸缩性 ...

    elasticsearch设计思路

    介绍elasticsearch如何实现一个分布式近实时的搜索引擎的

    ElasticSearch介绍

    Elasticsearch是一个高扩展的、开源的、全文检索的、建立在Apache Lucene基础上的搜索引擎,它提供了近实时的索引、搜索、分析功能。

Global site tag (gtag.js) - Google Analytics