Lucene4.3开发之增删改查例子

package com.jiepu.lucene_49;

import java.util.HashMap;

public interface LuceneDao {

	void add(String indexWriterPath);

	void delete(String indexPath, String id);

	void updateByID(String indexPath, String docID, HashMap map);

}
package com.jiepu.lucene_49;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
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.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

/**
 *LuceneDao接口的实现类
 * **/
public class LuceneDaoImpl implements LuceneDao {
	/**
	 * 抽象的父类文件夹
	 * */
	public static Directory directory;

	/**
	 * 返回IndexWriter
	 * */
	public static IndexWriter getWriter() throws Exception {
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);// 设置标准分词器
																	// ,默认是一元分词
		IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_43,
				analyzer);// 设置IndexWriterConfig
		// iwc.setRAMBufferSizeMB(3);//设置缓冲区大小
		return new IndexWriter(directory, iwc);
	}

	/***
	 * @param indexPath
	 *            查询的路径
	 * @param field
	 *            查询的字段类型
	 * @param searchText
	 *            搜索的文本
	 *
	 *
	 * **/
	public void searchTermQuery(String indexPath, String field,
			String searchText) {
		try {
			directory = FSDirectory.open(new File(indexPath));// 打开索引库
			IndexReader reader = DirectoryReader.open(directory);// 流读取
			IndexSearcher search = new IndexSearcher(reader);// 搜索
			// Query q=new PhraseQuery();//查询实例
			Query q = new TermQuery(new Term(field, searchText));
			// q.add();
			TopDocs td = search.search(q, 1000);// 获取最高得分命中
			for (ScoreDoc doc : td.scoreDocs) {
				Document d = search.doc(doc.doc);
				System.out.println("id:" + d.get("id"));
				System.out.println("name:" + d.get("name"));
				System.out.println("content:" + d.get("content"));
			}
			reader.close();// 关闭读取流
			directory.close();// 文件夹
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 添加的方法
	 * */
	@Override
	public void add(String indexWriterPath) {
		IndexWriter writer = null;
		try {
			directory = FSDirectory.open(new File(indexWriterPath));// 打开存放索引的路径
			writer = getWriter();
			Document doc = new Document();
			doc.add(new StringField("id", "5", Store.YES));// ID类型不分词存储
			doc.add(new TextField("name", "秋去春来,几多愁", Store.YES));// name使用默认一元分词
			doc.add(new TextField("content", "命运总是颠沛流离,命运总是崎岖厉害", Store.YES));// 存储
			// doc.add(new StringField("id", "1", Store.YES));//存储
			// doc.add(new StringField("name", "张飞", Store.YES));//存储
			// doc.add(new StringField("content", "也许放弃,才能靠近你!",
			// Store.YES));//存储
			writer.addDocument(doc);// 添加进写入流里
			writer.forceMerge(1);// 优化压缩段,大规模添加数据的时候建议,少使用本方法,会影响性能
			writer.commit();// 提交数据
			System.out.println("添加成功");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (writer != null) {
				try {
					writer.close();// 关闭流
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	/***
	 * 简单查询的方法
	 * 
	 * @param indexReadPath
	 *            读取的索引路径
	 * @param filed
	 *            查询的字段类型
	 * @param searchText查询的文本
	 * */
	public void simpleSearch1(String indexReadPath, String field,
			String searchText) {
		try {
			directory = FSDirectory.open(new File(indexReadPath));// 打开索引文件夹
			IndexReader reader = DirectoryReader.open(directory);// 读取目录
			IndexSearcher search = new IndexSearcher(reader);// 初始化查询组件
			// Query query=new TermQuery(new Term(field, searchText));//查询
			QueryParser parser = new QueryParser(Version.LUCENE_43, field,
					new StandardAnalyzer(Version.LUCENE_43));// 标准分析器查询时候一元分词效果
			Query query = parser.parse(searchText);
			TopDocs td = search.search(query, 10000);// 获取匹配上元素的一个docid
			ScoreDoc[] sd = td.scoreDocs;// 加载所有的Documnet文档
			System.out.println("本次命中数据:" + sd.length);
			for (int i = 0; i < sd.length; i++) {
				int z = sd[i].doc;// 获取每一个文档编号
				Document doc = search.doc(z);// 获取文档
				System.out.println("id:" + doc.get("id"));
				System.out.println("name:" + doc.get("name"));
				System.out.println("content:" + doc.get("content"));
			}
			reader.close();// 关闭资源
			directory.close();// 关闭连接
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/***
	 * 查询数据总量
	 * 
	 * @param indexFile
	 *            索引路径
	 * */
	public int findIndexDbCount(String indexFile) {
		int total = 0;
		try {
			Directory dir = FSDirectory.open(new File(indexFile));// 打开文件夹
			IndexReader reader = DirectoryReader.open(dir);// 读取数据
			total = reader.numDocs();// 数据总量
			reader.close();// 释放资源
			dir.close();// 释放资源
		} catch (Exception e) {
			e.printStackTrace();
		}
		return total;
	}

	/***
	 * 删除方法
	 * 
	 * @param indexPath
	 *            索引路径
	 * @param id
	 *            根据ID删除
	 * */
	@Override
	public void delete(String indexPath, String id) {
		try {
			directory = FSDirectory.open(new File(indexPath));// 打开文件索引目录
			IndexWriter writer = getWriter();
			IndexReader reader = DirectoryReader.open(directory);// 读取目录
			Query q = new TermQuery(new Term("id", id));
			writer.deleteDocuments(q);// 删除指定ID的Document
			writer.commit();// 提交
			writer.close();// 关闭
			reader.close();// 关闭
			System.out.println("删除id为" + id + "的记录成功");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/***
	 * 根据ID进行更行的方法
	 *
	 * */
	@Override
	public void updateByID(String indexPath, String docID, HashMap map) {
		try {
			directory = FSDirectory.open(new File(indexPath));// 打开文件索引目录
			IndexWriter writer = getWriter();
			// IndexReader reader=DirectoryReader.open(directory);//读取目录
			// Document doc=reader.document(Integer.parseInt(docID));
			Document d = new Document();
			d.add(new StringField("id", map.get("id").toString(), Store.YES));
			d.add(new TextField("name", map.get("name").toString(), Store.YES));
			d.add(new TextField("content", map.get("content").toString(),
					Store.YES));
			writer.updateDocument(new Term("id", docID), d);
			writer.commit();
			writer.close();// 关闭
			directory.close();// 关闭
			System.out.println("更新成功!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
package com.jiepu.lucene_49;

import java.util.HashMap;

public class LuceneMain {

	public static void main(String[] args) {
		
		LuceneDaoImpl dao=new LuceneDaoImpl();
		String indexPath="d:/fuck/index";
		dao.add(indexPath);
		dao.searchTermQuery(indexPath, "id", "5");
		int ret=dao.findIndexDbCount(indexPath);
		System.out.println(ret);
		dao.delete(indexPath, "5");
		ret=dao.findIndexDbCount(indexPath);
		System.out.println(ret);
		dao.add(indexPath);
		HashMap<String, String> map=new HashMap<String, String>();
		map.put("id", "6");
		map.put("name", "fuck");
		map.put("content", "内容");
		dao.updateByID(indexPath, "5", map);
		dao.searchTermQuery(indexPath, "name", "fuck");
	}
}


Elasticsearch是一个基于Lucene的全文搜索引擎,支持各种复杂查询,并提供实时索引、搜索功能。以下是关于在Elasticsearch中执行基本操作“增删改查”的简要介绍: ### **增加数据(Insert)** 在 Elasticsearch 中添加文档通常涉及创建一个新的索引文件,将数据作为 JSON 格式的文档插入到相应的索引中。 ```bash POST /my_index/_doc { "name": "John Doe", "age": 30, "occupation": "Engineer" } ``` 这将在名为 `my_index` 的索引下创建一个新的文档。 ### **删除数据(Delete)** 从 Elasticsearch 删除数据相对简单,需要指定文档的ID以及它所在的索引名称。 ```bash DELETE /my_index/_doc/1 ``` 这里的 `/1` 表示要删除索引 `my_index` 下 ID 为 `1` 的文档。 ### **修改数据(Update)** 更新文档可以覆盖整个文档,也可以仅更新部分字段。为了更新现有文档并保持其原始状态,可以使用 `_source` 参数。 ```bash PUT /my_index/_update/1?pretty { "doc" : { "age": 45 } } ``` 或者更详细地更新特定字段: ```bash PUT /my_index/_update/1?pretty { "script" : "_source.age = doc.age + 15" } ``` 这里使用了脚本语言来计算新年龄值。 ### **查询数据(Query)** 查询功能允许通过复杂的条件搜索文档,可以使用 DSL(Domain Specific Language)来进行。例如,查找所有年龄大于30的工程师: ```bash GET /my_index/_search { "query": { "bool": { "must": [ { "match": { "occupation": "Engineer" } }, { "range": { "age": { "gt": 30 } } } ] } } } ``` 这个查询返回了满足条件的所有文档。 ### 相关问题: 1. **如何优化 Elasticsearch 查询性能**? 2. **Elasticsearch 如何处理大数据量的实时搜索需求**? 3. **如何监控 Elasticsearch 集群的状态及性能指标**? 这四个问题涵盖了从基础操作到高级管理和优化的主题,深入探讨了如何更好地利用 Elasticsearch 解决实际的搜索和分析场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值