三、搜索引擎篇-lucene入门代码示例
一、lucene是什么?
最受欢迎的java开源全文搜索引擎开发工具包。提供了完整的查询引擎和索引引擎, 部分文本分词引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包, 以方便在目标系统中实现全文检索功能, 或者是以此为基础建立起完整的全文检索引擎。
二、lucene代码示例:
package com.javaxiaobang.es.lucene;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.util.IOUtils;
import com.javaxiaobang.es.constant.EsConstants;
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;
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.IndexableField;
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.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 功 能:lucene
* 作 者:java潇邦
* 时 间:2020/5/4
*/
public class LuceneMain {
/**
* 源码地址:https://gitee.com/sunrisexq/es
*/
public static void main(String[] args) {
//1、创建索引
createIndex(EsConstants.INDEX_DATA_DIR);
//2、添加索引文档
addIndexDoc(EsConstants.INDEX_DATA_DIR, EsConstants.JSON_CONTENT);
//3、查询内容
query(EsConstants.INDEX_DATA_DIR, "歌手","杰伦");
}
/**
* 创建索引
*
* @param indexDir 索引存放位置
*/
public static void createIndex(String indexDir) {
IndexWriter writer = null;
try {
//获取目录
Directory directory = FSDirectory.open(Paths.get(indexDir));
//设置分词器
Analyzer analyzer = new StandardAnalyzer();
//准备config
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
//创建lucene实例
writer = new IndexWriter(directory, indexWriterConfig);
System.out.println("索引创建成功");
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.close(writer);
}
}
/**
* 添加索引文档
*
* @param indexDir 索引存放位置
* @param jsonContent json内容
*/
public static void addIndexDoc(String indexDir, String jsonContent) {
IndexWriter writer = null;
try {
//获取目录
Directory directory = FSDirectory.open(Paths.get(indexDir));
//设置分词器
Analyzer analyzer = new StandardAnalyzer();
//准备config
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
//创建lucene实例
writer = new IndexWriter(directory, indexWriterConfig);
Document document = jsonToDoc(jsonContent);
writer.addDocument(document);
System.out.println("索引文档添加成功");
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.close(writer);
}
}
/**
* json内容转document文档
*
* @param jsonContent json内容
* @return
*/
public static Document jsonToDoc(String jsonContent) {
Document document = new Document();
JSONObject jsonObj = JSONObject.parseObject(jsonContent);
Set<Map.Entry<String, Object>> entrySet = jsonObj.entrySet();
for (Map.Entry<String, Object> entry : entrySet) {
document.add(new TextField(entry.getKey(), entry.getValue() == null ? "" : entry.getValue().toString(), Field.Store.YES));
}
return document;
}
/**
* 查询文档
* @param indexDir 索引存放位置
* @param queryParam 查询条件
* @param queryContent 查询单词内容
* @return
*/
public static String query(String indexDir, String queryParam, String queryContent) {
StringBuilder result = new StringBuilder();
IndexReader reader = null;
try {
//获取目录
Directory directory = FSDirectory.open(Paths.get((indexDir)));
//获取reader
reader = DirectoryReader.open(directory);
//获取索引实例
IndexSearcher searcher = new IndexSearcher(reader);
//设置分词器
Analyzer analyzer = new StandardAnalyzer();
//创建解析器
QueryParser queryParser = new QueryParser(queryParam, analyzer);
Query query = queryParser.parse(queryContent);
TopDocs topDocs = searcher.search(query, 10);
System.out.println("topDocs内容:" + JSON.toJSONString(topDocs));
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
//拿到文档实例
Document document = searcher.doc(scoreDoc.doc);
//获取所有文档字段
List<IndexableField> fieldList = document.getFields();
//处理文档字段
for (IndexableField field:fieldList){
result.append(field.name());
result.append(":");
result.append(field.stringValue());
result.append(",\r\n");
}
}
System.out.println("查询结果:"+result);
} catch (Exception e) {
e.printStackTrace();
}finally {
IOUtils.close(reader);
}
return result.toString();
}
}
https://gitee.com/sunrisexq/es