• Lucene入门案例


    1. 新建maven工程导入lucene相关依赖

        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <!-- mysql版本 -->
            <mysql.version>5.1.10</mysql.version>
            <!-- lucene版本 -->
            <lucene.version>4.10.3</lucene.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.6</version>
                <scope>provided</scope>
            </dependency>
            <!-- mysql数据库依赖 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <!--lucene依赖包 -->
            <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>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
            <!-- ik分词器 -->
            <dependency>
                <groupId>com.janeluo</groupId>
                <artifactId>ikanalyzer</artifactId>
                <version>2012_u6</version>
            </dependency>
        </dependencies>

     2.准备索引数据

    package com.pomelo.dao.impl;
    
    import com.pomelo.dao.BookDao;
    import com.pomelo.domain.Book;
    import org.junit.Test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    import java.util.List;
    
    //准备文档数据
    public class BookDaoImpl implements BookDao {
    
        @Override
        public List<Book> findAll() {
    
            List<Book> bookList = new ArrayList<>();
            Connection connection = null;
            PreparedStatement statement = null;
            ResultSet resultSet = null;
    
            try {
                //1.加载驱动
                Class.forName("com.mysql.jdbc.Driver");
                //2. 创建连接
                connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ssm", "root", "root");
                //3. 创建预编译对象
                statement = connection.prepareStatement("SELECT * from book");
                //4. 执行查询,得到结果集
                resultSet = statement.executeQuery();
    
                //5. 循环遍历,放入list容器
                while (resultSet.next()) {
                    Book book = new Book();
                    book.setId(resultSet.getInt("id"));
                    book.setBookName(resultSet.getString("bookname"));
                    book.setPrice(resultSet.getFloat("price"));
                    book.setPic(resultSet.getString("pic"));
                    book.setBookDesc(resultSet.getString("bookdesc"));
                    bookList.add(book);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                //6. 释放资源
                try {
                    if (connection != null) {
                        connection.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                try {
                    if (statement != null) {
                        statement.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                try {
                    if (resultSet != null) {
                        resultSet.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
            }
    
            return bookList;
        }
    
        //测试
        @Test
        public void findAllTest() {
            List<Book> bookList = findAll();
            System.out.println(bookList);
        }
    
    }

    3.创建索引库

    package com.pomelo.search;
    
    import com.pomelo.dao.BookDao;
    import com.pomelo.dao.impl.BookDaoImpl;
    import com.pomelo.domain.Book;
    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field.Store;
    import org.apache.lucene.document.TextField;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.apache.lucene.util.Version;
    import org.junit.Test;
    import org.wltea.analyzer.lucene.IKAnalyzer;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    //2. 创建索引
    public class IndexManagerDemo {
    
        @Test
        public void createIndex() throws IOException {
    
            //1. 采集文档数据
            BookDao bookDao = new BookDaoImpl();
            List<Book> bookList = bookDao.findAll();
    
            //2. 创建文档对象
            List<Document> documentList = new ArrayList<>();
            for (Book book : bookList) {
                Document document = new Document();
                /**
                 * IntField整型类型域,TextField文本类型域,FloatField浮点型类型域
                 * 参数1:域名--对应数据库中字段名
                 * 参数2:域值
                 * 参数3:是否存储--是否需要将该域对应的值存储到文档中
                 */
                document.add(new TextField("bookId", book.getId() + "", Store.YES));
                document.add(new TextField("bookName", book.getBookName(), Store.YES));
                document.add(new TextField("bookPrice", book.getPrice() + "", Store.YES));
                document.add(new TextField("bookPic", book.getPic(), Store.YES));
                document.add(new TextField("bookDesc", book.getBookDesc(), Store.YES));
    
                documentList.add(document);
            }
    
            //3. 创建分词器
            Analyzer analyzer = new IKAnalyzer();
    
            //4、创建文档索引配置对象
            IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
    
            //5、创建存放索引目录Directory,指定索引存放路径
            File file = new File("C:\tmp\lucene\book1");
            Directory directory = FSDirectory.open(file);
    
            //6、创建索引编写器
            IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
    
            //7、利用索引编写器写入文档到索引目录
            for (Document document : documentList) {
                //把文档对象写入到索引库中
                indexWriter.addDocument(document);
            }
    
            //8. 释放资源
            indexWriter.close();
    
        }
    
    }
     

    4.检索索引

    package com.pomelo.search;
    
    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.index.DirectoryReader;
    import org.apache.lucene.index.IndexReader;
    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.junit.Test;
    import org.wltea.analyzer.lucene.IKAnalyzer;
    
    import java.io.File;
    
    //3. 检索索引
    public class SearchManagerDemo {
    
        @Test
        public void searchIndex() throws Exception {
    
            //1. 创建分词器
            Analyzer analyzer = new IKAnalyzer();
    
            //2、创建查询对象Query
            //2.1、创建查询分析器;参数1:默认查询的域,参数2:分词器
            QueryParser queryParser = new QueryParser("bookName", analyzer);
            //2.2、创建Query对象
            Query query = queryParser.parse("java");
    
            //3、创建存放索引目录Directory,指定索引存放路径
            Directory directory = FSDirectory.open(new File("C:\tmp\lucene\book1"));
    
            //4、创建索引读对象IndexReader
            IndexReader indexReader = DirectoryReader.open(directory);
    
            //5、创建索引搜索对象IndexSearcher,执行搜索,返回结果
            IndexSearcher indexSearcher = new IndexSearcher(indexReader);
            /**
             * 参数1:查询对象
             * 参数2:查询前n个文档
             * 返回结果:得分文档(包含文档数组,总的命中数)
             */
            TopDocs topDocs = indexSearcher.search(query, 10);
            System.out.println("符合本次查询的总命中文档数为:" + topDocs.totalHits);
    
            //6、处理搜索结果
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            for (ScoreDoc scoreDoc : scoreDocs) {
                System.out.println("文档在Lucene中的id为:" + scoreDoc.doc + ";文档分值为:" + scoreDoc.score);
                //根据lucene中的文档id查询到文档
                Document document = indexSearcher.doc(scoreDoc.doc);
    
                System.out.println("文档id为:" + document.get("bookId"));
                System.out.println("名称为:" + document.get("bookName"));
                System.out.println("价格为:" + document.get("bookPrice"));
                System.out.println("图片为:" + document.get("bookPic"));
                System.out.println("描述为:" + document.get("bookDesc"));
                System.out.println("---------------------------------------");
            }
            //7、释放资源
            indexReader.close();
        }
    
    }
  • 相关阅读:
    Jenkins+gitlab自动化构建部署
    浅尝CI/CD,真香
    各种奇葩,我感觉我快窒息了,来吐吐槽...
    用SMART原则来创建一个好的OKR
    用OKR改变个人能力得不到明显提升的困境
    承诺型与愿景型,什么样的OKR适合你?
    OKR文化:关键成果必须具备的五个特点
    为什么不能完全用OKR替代KPI?
    OKR的激励方式应该注意什么?
    OKR如何与绩效考核并行?
  • 原文地址:https://www.cnblogs.com/pomelo-lemon/p/11425175.html
Copyright © 2020-2023  润新知