码迷,mamicode.com
首页 > Web开发 > 详细

Lucene学习笔记(一)

时间:2016-04-21 01:11:27      阅读:332      评论:0      收藏:0      [点我收藏+]

标签:

 

 

一、什么是lucene

  官方的理解:全文检索首先是将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的目的,这种先建立索引,在根据索引搜索文档的过程叫做全文检索

  1. 自身理解:也就类似于使用字典的过程,而索引就是字典的索引目录,方便我们来查询汉字。
  2. Lucene是什么:Lucene是appache下的一个开源全文检索的引擎工具包,通过这个简单易用的工具包,可以快速开发全文检索应用。
  3. 全文检索应用:搜索引擎(例如:百度,谷歌)、站内搜索(京东的商品搜索)、文件搜索等。
  • Lucene和全文检索应用的区别:

    1、Lucene其实就是一套完整的jar包,可以让程序员使用它来实现全文检索应用的开发

    2、全文检索应用,它是完整的索引系统

二、Lucene实现全文检索的流程

技术分享

全文检索分为两大流程

1、索引的流程  采集数据---创建索引文档---保存索引到索引库

2、搜索流程 创建查询对象---通过searcher查询索引---从索引库中获取搜索结果---展示搜索结果

注意:Lucene是不具备搜索结果的页面展示功能

三、索引流程实现

  分析

技术分享

indexWriter对象是索引流程的核心组建,我们可以使用该组件对索引库进行增删改操作

indexWriter不能直接操作索引库,需要通过Directory操作索引库

Directory主要描述了索引库所在的位置,它是抽象类,其中最主要有两种自实现:FSDirectory(文件系统目录)、RAMDirectory(内容的存储目录)

四、为什么我们要采集数据

全文检索要搜索的数据,格式多种多样,比如互联网中网页信息、MP3、avi格式。

这些多种多样的格式的数据,叫非结构化数据。 

非结构化数据:格式不固定、长度不固定的数据。比如:互联网数据、word、邮件。

结构化数据:格式固定、长度固定的数据,比如数据库数据。

对于结构化数据的搜索:

由于结构化的数据格式是固定的,所以可以针对固定的格式设置一些算法。比如sql中的like查询。

对于非结构化的数据搜索:

将非结构化数据,转成结构化数据。需要进行数据采集,采集到本地,进行一些处理,转成结构化数据。 

五、索引文件的逻辑结构

技术分享

六、代码实现

 

package my.dizang.po;

/**
 * 
 * @Title: Book.java
 * @Package my.dizang.po
 * @Description: TODO(用一句话描述该文件做什么)
 * @author 地藏 1281782012@qq.com
 * @date 2016-4-19 下午6:48:15
 * @version V1.0
 */
public class Book {
    // 图书ID
    private Integer id;
    // 图书名称
    private String name;
    // 图书价格
    private Float price;
    // 图书图片
    private String pic;
    // 图书描述
    private String description;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }

    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}
package my.dizang.dao;

import java.util.List;

import my.dizang.po.Book;

/**
 * 
 * @Title: BookDao.java 
 * @Package my.dizang.dao 
 * @Description: 接口
 * @author 地藏 1281782012@qq.com   
 * @date 2016-4-19 下午6:54:25 
 * @version V1.0
 */
public interface BookDao {

    public List<Book> queryBookList();
}
package my.dizang.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import my.dizang.po.Book;


/**
 * 
 * @Title: BookDaoImpl.java
 * @Package my.dizang.dao
 * @Description: BookDao实现类
 * @author 地藏 1281782012@qq.com
 * @date 2016-4-19 下午6:57:17
 * @version V1.0
 */
public class BookDaoImpl implements BookDao {

    @Override
    public List<Book> queryBookList() {
        // 使用JDBC获取采集数据
        // 数据库连接
        Connection connection = null;
        // 预编译statement
        PreparedStatement preparedStatement = null;
        // 结果集
        ResultSet resultSet = null;
        // 图书列表
        List<Book> list = new ArrayList<Book>();
        try {
            // 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 连接数据库
            connection = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/mybatis", "root", "1234");

            // SQL语句
            String sql = "SELECT * FROM book";
            // 创建preparedStatement
            preparedStatement = connection.prepareStatement(sql);

            // 获取结果集
            resultSet = preparedStatement.executeQuery();

            // 结果集解析
            while (resultSet.next()) {
                Book book = new Book();
                book.setId(resultSet.getInt("id"));
                book.setName(resultSet.getString("name"));
                book.setPrice(resultSet.getFloat("price"));
                book.setPic(resultSet.getString("pic"));
                book.setDescription(resultSet.getString("description"));
                list.add(book);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return list;
    }

}
package my.dizang.index;

import java.io.File;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.NumericRangeQuery;
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.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test;

/**
 * 
 * @Title: IndexSearch.java
 * @Package my.dizang.index
 * @Description: 搜索测试类 注意:搜索时的分词器必须和索引的分词器一致
 * @author 地藏 1281782012@qq.com
 * @date 2016-4-20 上午10:50:57
 * @version V1.0
 */
public class IndexSearch {

    @Test
    public void createIndex() throws Exception{
        
        //采集数据
        BookDao dao = new BookDaoImpl();
        List<Book> bookList = dao.queryBookList();
        //创建Document
        List<Document> docList = new ArrayList<>();
        Document document;
        for (Book book : bookList) {
            document = new Document();
            
            //创建Field域
            //Store :表示是否存储到文档域
            //商品ID
            Field idField = new TextField("id",book.getId().toString(),Store.YES);
            
            //商品名称
            Field nameField = new TextField("name",book.getName(),Store.YES);
            
            //商品价格
            Field priceField = new TextField("price",book.getPrice().toString(),Store.YES);
            
            //商品图片地址
            Field picField = new TextField("pic",book.getPic(),Store.YES);
            
            //商品描述
            Field descField = new TextField("description",book.getDescription(),Store.YES);
            
            document.add(idField);
            document.add(nameField);
            document.add(priceField);
            document.add(picField);
            document.add(descField);
            
            docList.add(document);
        }
        
        //进行分词处理
        Analyzer analyzer = new StandardAnalyzer();
        
        //创建Directory
        //指定索引库所在的路径
        Directory directory = FSDirectory.open(new File("E:\\11-index\\1223\\"));
        //创建IndexWriterConfig
        IndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
        //创建IndexWriter
        IndexWriter writer = new IndexWriter(directory, cfg);
        //通过IndexWriter经做过分词处理的Document对象存储到索引库
        for (Document doc : docList) {
            writer.addDocument(doc);
        }
        //关闭资源
        writer.close();
    }

}

使用luke工具查询索引

技术分享

技术分享

技术分享

技术分享

Lucene学习笔记(一)

标签:

原文地址:http://www.cnblogs.com/dizang/p/5410908.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!