Lucene的使用

一、到依赖:

<!--导入lucence核心依赖-->
<dependencies>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-core</artifactId>
            <version>4.10.2</version>
        </dependency>

        <!--分词依赖-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-common</artifactId>
            <version>4.10.2</version>
        </dependency>

        <!--lucence搜索核心依赖-->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queryparser</artifactId>
            <version>4.10.2</version>
        </dependency>

        <!--IK分词器-->
        <dependency>
            <groupId>com.jianggujin</groupId>
            <artifactId>IKAnalyzer-lucene</artifactId>
            <version>4.1.0</version>
        </dependency>
 <dependencies>

二、写入数据:

package com.chinasofti.lucene.demo;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.*;
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.wltea.analyzer.lucene.IKAnalyzer;

import java.io.File;


public class WriteDocument {
    public static void main(String[] args) throws Exception {
        //创建文档对象
        Document document = new Document();

        //创建文档字段
        //TextField - 建立索引,并分词;StringField - 建立索引,不分词
        document.add(new LongField("id",1473155181, Field.Store.YES));
        document.add(new TextField("title","中软国际飞利浦 (X1560) 黑色+香槟色 移动联通2G手机 双卡双待", Field.Store.YES));
        document.add(new StringField("sellpoint","畅销!智能机的好伴侣,可以充电的手机!最长可达100天!键盘金属工艺,移动电源功能!", Field.Store.YES));
        document.add(new LongField("price",369000, Field.Store.YES));
        document.add(new IntField("num",99999, Field.Store.YES));
        document.add(new StringField("image","http://image.chinasofti.com/group1/691c77d0ed13417da7cf59b8bd1e3bab.jpg", Field.Store.YES));
        document.add(new LongField("cid",560, Field.Store.YES));

        //定义当前文档保存的位置   (根目录下:workspace/)
        Directory directory = FSDirectory.open(new File("./sqlData"));

        //创建分词器对象(标准分词器)
//        Analyzer analyzer = new StandardAnalyzer();

        //IK中文分词器
        Analyzer analyzer = new IKAnalyzer();

        //创建索引配置
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_2,analyzer);

        //创建出索引所用到的对象
        IndexWriter writer = new IndexWriter(directory,config);
        //添加自己创建的文档对象
        writer.addDocument(document);
        writer.commit();
        writer.close();
        System.out.println("创建成功!");
    }
}

三、查询数据:

package com.chinasofti.lucene.demo;

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.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

import java.io.File;
import java.io.IOException;

public class SearchDocument {
    public static void main(String[] args) throws IOException {
        // 首先获取到定义的保存目录
        Directory dir = FSDirectory.open(new File("./testProductsData"));

        //创建阅读器
        IndexReader indexReader = DirectoryReader.open(dir);

        //创建索引的检索对象
        IndexSearcher searcher = new IndexSearcher(indexReader);

        //构造查询条件(普通查询)
        Query query = new TermQuery(new Term("title","飞"));
        
        //查询数据   参数一:查询条件; 参数二:查询结果最多显示的数量
        TopDocs result = searcher.search(query, 50000);

        System.out.println("查询总数:"+result.totalHits);

        //获取文档内容
        ScoreDoc[] scoreDocs = result.scoreDocs;
        for(ScoreDoc sd : scoreDocs){
            System.out.println("权重:"+sd.score);
            Document document = searcher.doc(sd.doc);
            System.out.println(document.getField("id"));
            System.out.println(document.getField("title"));
            System.out.println(document.getField("sellpoint"));
            System.out.println(document.getField("price"));
            System.out.println(document.getField("num"));
            System.out.println(document.getField("image"));
            System.out.println(document.getField("cid"));
        }

        indexReader.close();
    }
}

附件:springboot+httpClient+lucene

添加几个依赖
<!--httpclient依赖-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
<!--导入json转换工具包-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.4.2</version>
        </dependency>
写入数据:
package com.chinasofti.lucene.demo;

import com.chinasofti.entity.Product;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.*;
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.wltea.analyzer.lucene.IKAnalyzer;

import java.io.File;
import java.io.IOException;
import java.util.List;

public class ImportDBToIndex {

    private static final ObjectMapper MAPPER = new ObjectMapper();

    public static void main(String[] args) {
        String url = "http://open.chinasofti.com/api/restful/product";
        try {
            String result = doGet(url);
            if(result != null){
                JavaType type = MAPPER.getTypeFactory().constructParametricType(List.class, Product.class);
                List<Product> productList = MAPPER.readValue(result, type);

                //定义当前文档保存的位置   (根目录下:workspace/)
                Directory directory = FSDirectory.open(new File("./testProductsData"));

                //IK中文分词器
                Analyzer analyzer = new IKAnalyzer();

                //创建索引配置
                IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_2,analyzer);

                //创建出索引所用到的对象
                IndexWriter writer = new IndexWriter(directory,config);

                for(Product p : productList){
                    //创建文档对象
                    Document document = new Document();
                    document.add(new LongField("id",p.getId(), Field.Store.YES));
                    document.add(new TextField("title",p.getTitle(), Field.Store.YES));
                    document.add(new StringField("sellpoint",p.getSellpoint(), Field.Store.YES));
                    document.add(new LongField("price",p.getPrice(), Field.Store.YES));
                    document.add(new IntField("num",p.getNum(), Field.Store.YES));
                    document.add(new StringField("image",p.getImage(), Field.Store.YES));
                    document.add(new LongField("cid",p.getCid(), Field.Store.YES));
                    writer.addDocument(document);
                    writer.commit();
                }
                System.out.println("写入成功");
                writer.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String doGet(String url) throws Exception{
        // 创建 HttpClient 对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        // 创建请求对象, get、 post、put、delete
        HttpGet httpGet = new HttpGet(url);

        // 创建输出对象
        CloseableHttpResponse response = null;

        try {
            // 执行请求
            response = httpClient.execute(httpGet);

            // 获取状态信息
            // response.getStatusLine().getStatusCode() - 获取状态信息
            if(response.getStatusLine().getStatusCode() == 200){
                // 请求成功
                String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                return content;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(response !=null){
                response.close();
            }
            httpClient.close();
        }
        return null;

    }
}
查询数据:
package com.chinasofti.lucene.demo;

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.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

import java.io.File;
import java.io.IOException;

public class SearchDocument {
    public static void main(String[] args) throws IOException {
        // 首先获取到定义的保存目录
        Directory dir = FSDirectory.open(new File("./testProductsData"));

        //创建阅读器
        IndexReader indexReader = DirectoryReader.open(dir);

        //创建索引的检索对象
        IndexSearcher searcher = new IndexSearcher(indexReader);

        //构造查询条件(普通查询)
//        Query query = new TermQuery(new Term("title","飞"));
        //范围搜索:NumericRangeQuery
//        Query query = NumericRangeQuery.newLongRange("id",1473158183L,1473158243L,true,true);
        //匹配所有搜索:MatchAllDocsQuery
//        Query query = new MatchAllDocsQuery();
        //模糊搜索:WildcardQuery
//        Query query = new WildcardQuery(new Term("title","飞利浦*"));

        //相似搜索:参数1--->Term;参数2---->允许词条错误的个数  【注意:范围为0-2,不然报错】
//        Query query = new FuzzyQuery(new Term("title","appls"),2);


        //布尔值搜索
        BooleanQuery query = new BooleanQuery();
        query.add(new TermQuery(new Term("title","老人")),BooleanClause.Occur.MUST);
        query.add(new TermQuery(new Term("title","apple")),BooleanClause.Occur.MUST_NOT);


        //查询数据   参数一:查询条件; 参数二:查询结果最多显示的数量
        TopDocs result = searcher.search(query, 50000);

        System.out.println("查询总数:"+result.totalHits);

        //获取文档内容
        ScoreDoc[] scoreDocs = result.scoreDocs;
        for(ScoreDoc sd : scoreDocs){
            System.out.println("权重:"+sd.score);
            Document document = searcher.doc(sd.doc);
            System.out.println(document.getField("id"));
            System.out.println(document.getField("title"));
            System.out.println(document.getField("sellpoint"));
            System.out.println(document.getField("price"));
            System.out.println(document.getField("num"));
            System.out.println(document.getField("image"));
            System.out.println(document.getField("cid"));
        }

        indexReader.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值