• lucene简单搜索demo


    方法类

    package com.wxf.Test;
    import com.wxf.pojo.Goods;
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.document.StringField;
    import org.apache.lucene.document.TextField;
    import org.apache.lucene.index.*;
    import org.apache.lucene.queryparser.classic.ParseException;
    import org.apache.lucene.queryparser.classic.QueryParser;
    import org.apache.lucene.search.*;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import java.io.IOException;
    import java.nio.file.Paths;
    
    
    /**
     * @Auther: wxf
     * @Date: 2018/6/29 15:40
     */
    public class IndexCRUD {
        private Directory dir;
        {
            try {
                dir = FSDirectory.open(Paths.get( System.getProperty("user.dir")+"\src\main\resources\index"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * 获取IndexWriter实例
         * @return
         * @throws Exception
         */
        public IndexWriter getWriter()throws Exception{
            //中文分词器
            StandardAnalyzer standardAnalyzer = new StandardAnalyzer();
            IndexWriterConfig iwc=new IndexWriterConfig(standardAnalyzer);
            IndexWriter writer=new IndexWriter(dir, iwc);
            return writer;
        }
    
    
        public void setUp() throws Exception {
            Goods goods=new Goods("123","红色强化门",360);
            Goods goods2=new Goods("223","黑色强化门",370);
            Goods goods3=new Goods("333","白色强化门",380);
             String skuid[]={"123","223","333"};
             String name[]={"红色强化门","黑色强化门","白色强化门"};
             Object obj[]={goods,goods2,goods3};
            IndexWriter writer=getWriter();
            for(int i=0;i<skuid.length;i++){
                Document doc=new Document();
                doc.add(new StringField("skuid", skuid[i], Field.Store.YES));
                doc.add(new TextField("name",name[i],Field.Store.YES));
                doc.add(new TextField("obj", obj[i].toString(), Field.Store.YES));
                writer.addDocument(doc); // 添加文档
            }
            writer.close();
        }
    
    
        /**
         * 测试写了几个文档
         * @throws Exception
         */
        public void testIndexWriter()throws Exception{
            IndexWriter writer=getWriter();
            System.out.println("写入了"+writer.numDocs()+"个文档");
            writer.close();
        }
    
        /**
         * 测试读取文档
         * @throws Exception
         */
        public void testIndexReader()throws Exception{
            IndexReader reader=DirectoryReader.open(dir);
            System.out.println("最大文档数:"+reader.maxDoc());
            System.out.println("实际文档数:"+reader.numDocs());
            reader.close();
        }
    
        /**
         * 查询
         * @return
         */
        public void select(String str1,String str2) throws IOException, ParseException {
            //得到读取索引文件的路径
            Directory dir = FSDirectory.open(Paths.get(System.getProperty("user.dir")+"\src\main\resources\index"));
            IndexReader ireader = DirectoryReader.open(dir);
            IndexSearcher searcher = new IndexSearcher(ireader);
            StandardAnalyzer standardAnalyzer = new StandardAnalyzer();
            /**
             * 第一个参数是要查询的字段;
             * 第二个参数是分析器Analyzer
             * */
            QueryParser parser = new QueryParser(str1, standardAnalyzer);
            //根据传进来的str2查找
            Query query = parser.parse(str2);
            //计算索引开始时间
            long start = System.currentTimeMillis();
            /**
             * 第一个参数是通过传过来的参数来查找得到的query;
             * 第二个参数是要出查询的行数
             * */
            TopDocs rs = searcher.search(query, 10);
            long end = System.currentTimeMillis();
            System.out.println("匹配"+str2+",总共花费了"+(end-start)+"毫秒,共查到"+rs.totalHits+"条记录。");
            for (int i = 0; i < rs.scoreDocs.length; i++) {
                Document doc = searcher.doc(rs.scoreDocs[i].doc);
                System.out.println("skuid:" + doc.getField("skuid").stringValue());
                System.out.println("name:" + doc.getField("name").stringValue());
                System.out.println("obj:" + doc.getField("obj").stringValue());
            }
        }
    }

    测试类

    package com.wxf.Test;
    /**
     * @Auther: wxf
     * @Date: 2018/6/29 15:46
     */
    public class Test {
        public static void main(String[] args) throws Exception {
            IndexCRUD indexCRUD=new IndexCRUD();
          // indexCRUD.setUp();
            indexCRUD.testIndexWriter();
            indexCRUD.testIndexReader();
             indexCRUD.select("name", "黑");
        }
    }
    

      

    indexCRUD.setUp() 这个方法 调一次就可以了 
    结果如下

    这次换个范围大的查询参数

    public class Test {
        public static void main(String[] args) throws Exception {
            IndexCRUD indexCRUD=new IndexCRUD();
          // indexCRUD.setUp();
            indexCRUD.testIndexWriter();
            indexCRUD.testIndexReader();
             indexCRUD.select("name", "强化");
        }
    }
    

      结果如下:

    这里采用一元分词 可以随意匹配 
  • 相关阅读:
    结对 总结
    ”耐撕“团队 2016.3.29 站立会议
    词频统计 List Array
    基本数据结构简述
    深入理解HashMap
    常用排序算法Java实现
    Spring核心组件知识梳理
    HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法
    Nginx是什么东东?
    Java中常用的四种线程池
  • 原文地址:https://www.cnblogs.com/wxf-com/p/9260209.html
Copyright © 2020-2023  润新知