赞
踩
全文检索首先对要搜索的文档进行分词,然后形成索引,通过查询索引来查询文档。先创建索引,然后根据索引来进行搜索。比如查字典,字典的偏旁部首就类似于索引,字典的具体内容则类似于文档内容。
应用场景:
Lucene是Apache的一个全文检索引擎工具包,通过Lucene可以让程序员快速开发一个全文检索功能。Lucene不是搜索引擎,仅仅是一个工具包。它不能独立运行,不能单独对外提供服务(Solr、ElasticSearch)。
注:Lucene本身不能进行视图渲染。
文档域:文档域存储的信息就是采集到的信息,通过Document对象来存储,具体说是通过Document对象中Field域来存储数据。比如:数据库中一条记录会存储一个一个Document对象,数据库中一列会存储成Document中一个Field域。Field域的name为字段名,value则为具体值。文档域中,Document对象之间是没有关系的,而且每个Document中的Field域也不一定一样。
索引域:主要是为了搜索使用的,索引域的内容是经过Lucene分词之后存储的。
倒排索引表:传统方法是先找到文件,如何在文件中找内容,在文件内容中匹配搜索关键字,这种方法是顺序扫描方法,数据量大就搜索慢。 倒排索引结构是根据内容(词语)找文档,包括索引和文档两部分。索引即词汇表,它是在索引中匹配搜索关键字,由于索引内容量有限并且采用固定优化算法搜索速度很快,先找到索引中的词汇,词汇又与文档关联,从而最终找到了文档。
使用Lucene完成对数据库中商品信息的索引和搜索功能。
需要导入如下依赖jar包:
其中,Analysis包、Core包和QueryParse包分别在lucene-7.4.0\analysis\common、lucene-7.4.0\core和lucene-7.4.0\queryparser文件夹下,最终工程结构如下:
这里的数据主要来源于数据库商品表,需要通过Jdbc查询数据库准备数据。
Product实体类:
public class Product {
private Long id;
private String title;
private String sellPoint;
private Long price;
private int num;
private String barcode;
private String image;
private Long cid;
private int status;
private Date created;
private Date updated;
/** getter and setter **/
}
ProductDao数据库查询:
public class ProductDao {
public List<Product> queryProducts() {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
List<Product> products = new ArrayList<>();
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/taotao", "root", "1234");
String sql = "SELECT * FROM tb_item";
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
// 结果集解析
while (resultSet.next()) {
Product product = new Product();
product.setId(resultSet.getLong("id"));
product.setTitle(resultSet.getString("title"));
product.setSellPoint(resultSet.getString("sell_point"));
product.setBarcode(resultSet.getString("barcode"));
product.setImage(resultSet.getString("image"));
product.setPrice(resultSet.getLong("price"));
product.setCid(resultSet.getLong("cid"));
product.setNum(resultSet.getInt("num"));
product.setStatus(resultSet.getInt("status"));
product.setCreated(resultSet.getDate("created"));
product.setUpdated(resultSet.getDate("updated"));
products.add(product);
}
} catch (Exception e) {
e.printStackTrace();
}
return products;
}
}

IndexWriter是索引过程的核心组件,通过IndexWriter可以创建新索引、更新索引、删除索引操作。IndexWriter需要通过Directory对索引进行存储操作。
Directory描述了索引的存储位置,底层封装了I/O操作,负责对索引进行存储。它是一个抽象类,它的子类常用的包括FSDirectory(在文件系统存储索引)、RAMDirectory(在内存存储索引)。
@Test
public vo
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。