Lucene7.1.0的简单使用方法

1 篇文章 0 订阅
1 篇文章 0 订阅

添加依赖

		<!--对分词索引查询解析-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queryparser</artifactId>
            <version>7.1.0</version>
        </dependency>
        <!--smartcn 中文分词器 SmartChineseAnalyzer  smartcn分词器 需要lucene依赖 且和lucene版本同步-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-smartcn</artifactId>
            <version>7.1.0</version>
        </dependency>

创建索引

	/*索引路径*/
    static String indexDir = "D:\\index\\user";
    //中文分词器
    static Analyzer analyzer = new SmartChineseAnalyzer();

    //保存索引
    public void write(){
        /*索引存放的位置*/
        Directory directory = null;
        IndexWriterConfig config = null;
        IndexWriter writer = null;
        try {
            directory = FSDirectory.open(Paths.get(indexDir));//磁盘目录,RAMDirectory内存
            config = new IndexWriterConfig(analyzer);
            writer = new IndexWriter(directory,config);
            Integer count = dao.findCount();
            Integer offset = 0;
            Integer row = 10;
            while (offset <= count){
                List<Map<String,Object>> queryResult = dao.findUserName(offset,row);
                for (int i=0;i<queryResult.size();i++){
                    Map<String,Object> data = queryResult.get(i);
                    //创建Document
                    Document doc = new Document();
                    //创建Field
                    Field userid = new Field("userid",data.get("nid").toString(),TextField.TYPE_STORED);
                    Field username = new Field("username",data.get("susername").toString(),TextField.TYPE_STORED);
                    Field truename = new Field("truename",data.get("struename").toString(),TextField.TYPE_STORED);
                    //填充Document
                    doc.add(userid);
                    doc.add(username);
                    doc.add(truename);
                    //创建索引库
                    writer.addDocument(doc);
                    /*提交事务*/
                    writer.commit();
                }
                offset = offset + row;
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            /*关闭流*/
            try {
                writer.close();
                System.out.println("writer流已关闭。。。");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

查询索引

 /**
     * 查询索引
     * @param field
     * @param value
     * @return
     */
    public List<Map<String,Object>> read(String field,String value){
        List<Map<String,Object>> list = new ArrayList<>();
        try {
            Directory directory = FSDirectory.open(Paths.get(indexDir));
            DirectoryReader reader = DirectoryReader.open(directory);
            IndexSearcher searcher = new IndexSearcher(reader);
//            QueryParser parser = new QueryParser(field,analyzer);
            Query query = getBooleanQuery();
            TopDocs topDocs = searcher.search(query,5);
            Long count = topDocs.totalHits;
            System.out.println("总共查到"+count+"个文档");
            for (ScoreDoc doc : topDocs.scoreDocs){
                Document document = searcher.doc(doc.doc);
                System.out.println(document.get(field)+"评分是"+doc.score);
                Map<String,Object> map = new HashMap<>();
                map.put("userid",document.get(field));
                list.add(map);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 通配符搜索,?表示一个字符,*表示0或多个
     * 作用和数据库模糊搜索的like相似
     * @param field
     * @param value
     * @return
     */
    private Query getWildcardQuery(String field,String value){
        String keyword = "*"+value+"*";
        Term term = new Term(field,keyword);
        WildcardQuery query = new WildcardQuery(term);
        return query;
    }

    /**
     * 模糊搜索
     * @param field
     * @param value
     * @return
     */
    private Query getFuzzyQuery(String field,String value){
        Term term = new Term(field,value);
        FuzzyQuery query = new FuzzyQuery(term);
        return query;
    }

    /**
     * 精确搜索
     * @param field
     * @param value
     * @return
     */
    private Query getTermQuery(String field,String value){
        Term term = new Term(field,value);
        TermQuery query = new TermQuery(term);
        return query;
    }

    /**
     * 多条件查询
     * @return
     */
    private Query getBooleanQuery(){
        String field1 = "userid";
        String value1 = "231";
        String field2 = "username";
        String value2 = "admin";
        Query query1 = new TermQuery(new Term(field1,value1));
        Query query2 = new TermQuery(new Term(field2,value2));
        BooleanQuery.Builder builder = new BooleanQuery.Builder();
        //SHOULD+SHOULD,表示“or”
//        builder.add(query1,BooleanClause.Occur.SHOULD);
//        builder.add(query2,BooleanClause.Occur.SHOULD);
        //MUST+MUST,表示“and”
//        builder.add(query1,BooleanClause.Occur.MUST);
//        builder.add(query2,BooleanClause.Occur.MUST);
        //MUST+MUST_NOT,表示MUST查询的结果不包含MUST_NOT查询的结果
//        builder.add(query1,BooleanClause.Occur.MUST);
//        builder.add(query2,BooleanClause.Occur.MUST_NOT);
        //FILTER,通过过滤将评分改为0.0
//        builder.add(query1,BooleanClause.Occur.FILTER);
        BooleanQuery booleanQuery = builder.build();
        return booleanQuery;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值