Lucene 简单API使用
本demo 简单模拟实现一个图书搜索功能。
- 模拟向数据库添加数据的时候,添加书籍索引。
- 提供搜索接口,支持按照书名,作者,内容进行搜索。
- 按默认规则排序返回搜索结果。
Jar依赖:
<properties>
<lucene.version>4.6.1</lucene.version>
</properties> <!-- lucence jar -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>${lucene.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>${lucene.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>${lucene.version}</version>
</dependency>
核心类:
/**
* Alipay.com Inc.
* Copyright (c) 2004-2015 All Rights Reserved/
*/
package com.demo; import com.demo.convertor.BookConvertor;
import com.demo.domain.BookDO; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
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 org.apache.lucene.util.Version; import java.io.File;
import java.io.IOException;
import java.util.*; /**
* lucence 简单demo
*
* @author baoxing.gbx
* @version $Id:LucenceDemo.java, V 0.1 2015-11-11 14:15 baoxing.gbx Exp $$
*/
public class LucenceDemo { /** 索引库存目录 */
private Directory directory; /** 分词器 */
private Analyzer analyzer; /** 索引写 */
private IndexWriter indexWriter; /** 索引查询 */
private IndexWriterConfig indexWriterConfig; /** 索引查询 */
private IndexSearcher searcher; /** 模拟数据库 */
private static Map<String, Object> dataBase = new HashMap<String, Object>(); /**
* 初始化操作
*
* @throws IOException
*/
public void init() throws IOException { // 1. 获取lucence索引目录
Properties properties = new Properties();
properties
.load(LucenceDemo.class.getClassLoader().getResourceAsStream("lucence.properties"));
directory = FSDirectory.open(new File((String) properties.get("path")));
// 2. 构造分词器
analyzer = new StandardAnalyzer(Version.LUCENE_40); // 3. 构造索引输入
indexWriterConfig = new IndexWriterConfig(Version.LUCENE_40, analyzer);
indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
indexWriter = new IndexWriter(directory, indexWriterConfig); } /**
* 模拟数据库添加,同时添加索引
*
* @param bookDO
* @throws IOException
*/
public void addDoc(BookDO bookDO) throws IOException { // 数据库操作
dataBase.put(bookDO.getId() + "", bookDO);
// 索引操作
Document document = BookConvertor.convert2Doc(bookDO);
indexWriter.addDocument(document);
} /**
* 搜索
*
* @param keyword
* @return
* @throws Exception
*/
public List<BookDO> search(String keyword) throws Exception {
// 构造查询
IndexReader indexReader = IndexReader.open(directory);
searcher = new IndexSearcher(indexReader); // 支持书名, 作者, 内容搜索
String[] fields = { "name", "author", "content" };
QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_40, fields, analyzer);
queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
Query query = queryParser.parse(keyword); // 最多给5个
TopDocs topdocs = searcher.search(query, 5);
ScoreDoc[] scoreDocs = topdocs.scoreDocs; System.out.println("查询结果总数---" + topdocs.totalHits + "最大的评分--" + topdocs.getMaxScore()); List<BookDO> result = new ArrayList<BookDO>();
for (int i = 0; i < scoreDocs.length; i++) {
int doc = scoreDocs[i].doc;
Document document = searcher.doc(doc); System.out.println("docId--" + scoreDocs[i].doc + "---scors--" + scoreDocs[i].score
+ "---index--" + scoreDocs[i].shardIndex); result.add((BookDO) dataBase.get(document.get("id")));
}
return result;
} /**
* Getter method for property <tt>analyzer</tt>.
*
* @return property value of analyzer
*/ public Analyzer getAnalyzer() {
return analyzer;
} /**
* Setter method for property <tt>analyzer</tt>.
*
* @param analyzer value to be assigned to property analyzer
*/
public void setAnalyzer(Analyzer analyzer) {
this.analyzer = analyzer;
} /**
* Getter method for property <tt>dataBase</tt>.
*
* @return property value of dataBase
*/ public Map<String, Object> getDataBase() {
return dataBase;
} /**
* Setter method for property <tt>dataBase</tt>.
*
* @param dataBase value to be assigned to property dataBase
*/
public void setDataBase(Map<String, Object> dataBase) {
this.dataBase = dataBase;
} /**
* Getter method for property <tt>directory</tt>.
*
* @return property value of directory
*/ public Directory getDirectory() {
return directory;
} /**
* Setter method for property <tt>directory</tt>.
*
* @param directory value to be assigned to property directory
*/
public void setDirectory(Directory directory) {
this.directory = directory;
} /**
* Getter method for property <tt>indexWriter</tt>.
*
* @return property value of indexWriter
*/ public IndexWriter getIndexWriter() {
return indexWriter;
} /**
* Setter method for property <tt>indexWriter</tt>.
*
* @param indexWriter value to be assigned to property indexWriter
*/
public void setIndexWriter(IndexWriter indexWriter) {
this.indexWriter = indexWriter;
} /**
* Getter method for property <tt>indexWriterConfig</tt>.
*
* @return property value of indexWriterConfig
*/ public IndexWriterConfig getIndexWriterConfig() {
return indexWriterConfig;
} /**
* Setter method for property <tt>indexWriterConfig</tt>.
*
* @param indexWriterConfig value to be assigned to property indexWriterConfig
*/
public void setIndexWriterConfig(IndexWriterConfig indexWriterConfig) {
this.indexWriterConfig = indexWriterConfig;
} /**
* Getter method for property <tt>searcher</tt>.
*
* @return property value of searcher
*/ public IndexSearcher getSearcher() {
return searcher;
} /**
* Setter method for property <tt>searcher</tt>.
*
* @param searcher value to be assigned to property searcher
*/
public void setSearcher(IndexSearcher searcher) {
this.searcher = searcher;
} }
测试类:
/**
* Alipay.com Inc.
* Copyright (c) 2004-2015 All Rights Reserved/
*/
package com.demo; import com.demo.domain.BookDO; import org.junit.Test; import junit.framework.TestCase; import java.util.List; /**
*
* @author baoxing.gbx
* @version $Id:LucenceDemoTest.java, V 0.1 2015-11-11 15:21 baoxing.gbx Exp $$
*/
public class LucenceDemoTest extends TestCase { LucenceDemo lucenceDemo = null; @Override
protected void setUp() throws Exception { // 数据准备
lucenceDemo = new LucenceDemo(); lucenceDemo.init(); // 循环添加100本书
for (int i = 1; i <= 2; ++i) { BookDO bookDO = new BookDO();
bookDO.setId(i);
bookDO.setAuthor("zhangsan" + i);
bookDO.setName("Java program" + i);
bookDO.setContent("Java是一种可以撰写跨平台应用程序的面向对象的程序设计开发语言");
lucenceDemo.addDoc(bookDO);
} for (int i = 3; i <= 4; ++i) {
BookDO bookDO = new BookDO();
bookDO.setId(i);
bookDO.setAuthor("lisi" + i);
bookDO.setName("Java program" + i);
bookDO.setContent("Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网");
lucenceDemo.addDoc(bookDO);
} for (int i = 5; i <= 6; ++i) {
BookDO bookDO = new BookDO();
bookDO.setId(i);
bookDO.setAuthor("wangwu" + i);
bookDO.setName("Java program" + i);
bookDO.setContent("同时拥有全球最大的开发者专业社");
lucenceDemo.addDoc(bookDO);
} for (int i = 7; i <= 8; ++i) { BookDO bookDO = new BookDO();
bookDO.setId(i);
bookDO.setAuthor("xiaoming" + i);
bookDO.setName("C++ program" + i);
bookDO.setContent("C++是在C语言的基础上开发的一种面向对象编程语言");
lucenceDemo.addDoc(bookDO);
}
} /**
* 测试根据书名查找
*/
@Test
public void testNameSearch() { try { lucenceDemo.getIndexWriter().close(); List<BookDO> bookDOs = lucenceDemo.search("Java"); System.out.println("查询到" + bookDOs.size() + "本相关书籍。 详细信息如下:");
for (int i = 0; i < bookDOs.size(); ++i) {
System.out.println(bookDOs.get(i).toString());
} } catch (Exception e) {
assertTrue(e.getMessage(), false);
}
} /**
* 测试根据作者查找
*/
@Test
public void testAuthorSearch() { try { lucenceDemo.getIndexWriter().close(); List<BookDO> bookDOs = lucenceDemo.search("zhangsan1"); System.out.println("查询到" + bookDOs.size() + "本相关书籍。 详细信息如下:");
for (int i = 0; i < bookDOs.size(); ++i) {
System.out.println(bookDOs.get(i).toString());
} } catch (Exception e) {
assertTrue(e.getMessage(), false);
}
} /**
* 测试根据内同查找
*/
@Test
public void testContentSearch() { try { lucenceDemo.getIndexWriter().close(); List<BookDO> bookDOs = lucenceDemo.search("开发"); System.out.println("查询到" + bookDOs.size() + "本相关书籍。 详细信息如下:");
for (int i = 0; i < bookDOs.size(); ++i) {
System.out.println(bookDOs.get(i).toString());
} } catch (Exception e) {
assertTrue(e.getMessage(), false);
}
} /**
* 测试多条件查找
*/
@Test
public void testMutiSearch() { try { lucenceDemo.getIndexWriter().close(); List<BookDO> bookDOs = lucenceDemo.search("zhangsan1 C++"); System.out.println("查询到" + bookDOs.size() + "本相关书籍。 详细信息如下:");
for (int i = 0; i < bookDOs.size(); ++i) {
System.out.println(bookDOs.get(i).toString());
} bookDOs = lucenceDemo.search("zhangsan1 Java"); System.out.println("查询到" + bookDOs.size() + "本相关书籍。 详细信息如下:");
for (int i = 0; i < bookDOs.size(); ++i) {
System.out.println(bookDOs.get(i).toString());
} } catch (Exception e) {
assertTrue(e.getMessage(), false);
}
}
}
代码地址 :https://github.com/EstarG/lucenceDemo
Lucene 简单API使用的更多相关文章
- HDFS基本命令行操作及上传文件的简单API
一.HDFS基本命令行操作: 1.HDFS集群修改SecondaryNameNode位置到hd09-2 (1)修改hdfs-site.xml <configuration> //配置元数据 ...
- Lucene 简单手记http://www.cnblogs.com/hoojo/archive/2012/09/05/2671678.html
什么是全文检索与全文检索系统? 全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查 ...
- Lucene简单介绍
[2016.6.11]以前写的笔记,拿出来放到博客里面~ 相关软件: Solr, IK Analyzer, Luke, Nutch;Tomcat; 1.是什么: Lucene是apache软件基金会j ...
- Lucene简单总结
Lucene API Document Document:文档对象,是一条原始数据 文档编号 文档内容 1 谷歌地图之父跳槽FaceBook 2 谷歌地图之父加盟FaceBook 3 谷歌地图创始人拉 ...
- 安装比特币区块链钱包API(Blockchain Wallet用户发送和接收比特币的简单API)
区块链钱包API提供了一个简单的界面,商家可以用它以编程方式与钱包进行交互. 安装:要使用此API,您需要运行负责管理区块链钱包的小型本地服务. 您的应用程序通过HTTP API调用在本地与此服务进行 ...
- lucene简单使用
lucene7以上最低要求jdk1.8 lucene下载地址: http://archive.apache.org/dist/lucene/java/ <dependency> <g ...
- 在CentOS7部署zookeeper集群以及简单API使用
一.部署zookeeper集群 zookeeper是一个针对大型分布式系统的协调系统,提供的功能有统一名称服务.分布式同步等. 1.上传zk安装包 2.解压 tar -xzvf zookeep ...
- lucene简单搜索demo
方法类 package com.wxf.Test; import com.wxf.pojo.Goods; import org.apache.lucene.analysis.standard.Stan ...
- 简单API练手:(1)复制自身程序到windows目录和系统目录下;(2)获得系统的相关信息。
1.复制自身程序到windows目录和系统目录下: #include <windows.h> #include <stdio.h> #include <string.h& ...
随机推荐
- OpenXml Sdk 根据Word模板导出到word
一:OpenXml Sdk 简介 Open XML标准的简单介绍:Ecma Office Open XML(“Open XML”)是针对字处理文档.演示文稿和电子表格的国际化开放标准,可免费供多个应用 ...
- The connection to adb is down, and a severe error has occured.(转)
启动android模拟器时.有时会报The connection to adb is down, and a severe error has occured.的错误.在网友说在任务管理器上把所有ad ...
- LDAP的Schema
Schema是LDAP的一个重要组成部分,类似于数据库的模式定义,LDAP的Schema定义了LDAP目录所应遵循的结构和规则,比如一个 objectclass会有哪些属性,这些属性又是什么结构等等, ...
- C++动态加载DLL调用方法
一.构建DLL路径 char szTmp[_MAX_PATH]; char* szPath = getcwd(szTmp, _MAX_PATH);//获取当前工作目录 //构建dll路径 strc ...
- 第一部分:连接MYSQL数据库代码
<?php $connec=mysql_connect("localhost","root","root") or die(" ...
- Android 开发基础及环境配置
2011年买了第一部安卓操作系统的手机,当时势头正盛的HTC不可思议(incredible),当时的想法就是想学习下智能手机开发,但是由于各种原因,客观上是公司的项目太忙了,忙于项目管理.团队建设.客 ...
- 目标检测方法总结(R-CNN系列)
目标检测方法系列--R-CNN, SPP, Fast R-CNN, Faster R-CNN, YOLO, SSD 目录 相关背景 从传统方法到R-CNN 从R-CNN到SPP Fast R-CNN ...
- 简单而又复杂的jsp(小知识)
JSP中的page标签中的pageEncoding属性和contentType属性 pageEncoding的默认值为ISO-8859-1 contentType的默认属性为:text/html; c ...
- phpcms V9 常用函数 及 代码整理
常用函数 及 常用代码 总结如下 <?php //转换字符串或者数组的编码 str_charset($in_charset, $out_charset, $str_or_arr) //获取菜单 ...
- icon fonts
iconfont网站 http://www.iconfont.cn(推荐) http://fontello.com/ http://fontawesome.io/ https://icomoon. ...