SpringBoot中Lucene的简单使用

Lucene简单使用

什么是Lucene?

Lucene是apache下的一个开放源代码的全文检索工具包。提供了完整的搜索引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,方便的在目标系统中实现全文检索功能。

全文检索的应用场景

对于数据量大、非结构化数据的查询。

  • 搜索引擎 Google 百度 …
  • 站内搜索 京东 招聘网站 …
  • 垂直搜索 类似于视频网站,公司之间共用一家索引库,可以实现公司之间互相搜索内容

通过对数据分词后创建索引,再对索引进行搜索的过程就叫全文检索,虽然创建索引的过程是非常耗时的,但是索引一旦创建后可以多次使用,全文检索主要处理的是查询,所以消耗时间来创建索引为此增加数据检索的效率是值得的。

简单使用Lucene

SpringBoot中Lucene的简单使用_第1张图片
创建索引

  • 获取原始文档

搜索引擎原始文档 —> 互联网的页面

站内原始文档 —> 指的是MySQL

  • 构建文档对象

文档对象是Lucene中的Document对象

  • 分析文档(分词)
  • 保存就是一个一个的term(由域名和分词后的内容组成的),是Lucene中存储的最小单元,在存储时每一个term都会对应所属的document

由一个term查询到document文档, 这种结构称为倒排索引结构

查询索引

  • 创建用户接口:提供用户输入关键字的地方
  • 创建查询,查询的域名或关键字
  • 执行查询
  • 渲染结果

使用SpringBoot 操作 lucene

  1. 创建一个Maven工程。

省略…

  1. 导入相关依赖。
	<parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-parentartifactId>
        <version>2.1.3.RELEASEversion>
    parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starterartifactId>
        dependency>
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>5.1.47version>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
        dependency>
        <dependency>
            <groupId>tk.mybatisgroupId>
            <artifactId>mapper-spring-boot-starterartifactId>
            <version>2.1.4version>
        dependency>
        
        <dependency>
            <groupId>org.apache.lucenegroupId>
            <artifactId>lucene-coreartifactId>
            <version>4.10.3version>
        dependency>
        
        <dependency>
            <groupId>org.apache.lucenegroupId>
            <artifactId>lucene-analyzers-commonartifactId>
            <version>4.10.3version>
        dependency>
        
        <dependency>
            <groupId>com.janeluogroupId>
            <artifactId>ikanalyzerartifactId>
            <version>2012_u6version>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
        dependency>
    dependencies>
  1. 创建SpringBoot引导类。
@SpringBootApplication
@MapperScan("com.cml.mappers")//映射路径
public class LuceneApplication {
   public static void main(String[] args) {
       SpringApplication.run(LuceneApplication.class,args);
   }
}
  1. 配置yml文件。

省略…(配置一下数据库的路径)

  1. 创建索引。
@RunWith(SpringRunner.class)
@SpringBootTest
@Component
public class LuceneDemo {

    @Autowired //依赖注入,集成了通用mapper的接口,方便从数据库中那数据
    private JobInfoMapper jobInfoMapper;
    @Test
    public void save() throws Exception {

		//Directory d,  目录,把索引放在什么位置
        Directory directory = FSDirectory.open(new File("D:\\luceneIndex"));
		//IndexWriterConfig conf 配置
        //Version matchVersion  版本
        // Analyzer analyzer 分词器
        Analyzer analyzer = new IKAnalyzer(); //中文分词器
        /*
        如果不使用ik分词器,搜索中文的时候会出现问题
        */
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LATEST, analyzer);


        //保存文件的对象
        IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);

        //从数据库中查找准备好的数据
        List<JobInfo> jobInfoList = jobInfoMapper.selectAll();

        //循环添加到document中
        for (JobInfo jobInfo : jobInfoList) {
            Document document = new Document();


            String companyName = jobInfo.getCompanyName();
            String jobName = jobInfo.getJobName();
            Integer salary = jobInfo.getSalary();
            String url = jobInfo.getUrl();
			//参数1:域名
			//参数2:保存内容
			//参数3: 是否保存原文件
            document.add(new TextField("companyName", companyName, Field.Store.YES));
            document.add(new TextField("jobName", jobName, Field.Store.YES));
            document.add(new IntField("salary", salary, Field.Store.YES));
            document.add(new StringField("url", url, Field.Store.YES));
			//将数据保存到数据库
            indexWriter.addDocument(document);
        }

        indexWriter.close();
    }

    @Test
    public void find() throws Exception {

        //获得索引库的位置
        Directory directory = FSDirectory.open(new File("D:\\luceneIndex"));
        //创建文件读取对象
        IndexReader indexReader = DirectoryReader.open(directory);
        //获得索引查询对象
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
		//new Term(域名,查询内容,最多显示数量)
        TopDocs topDocs = indexSearcher.search(new TermQuery(new Term("companyName", "北京")), 10);
        int totalHits = topDocs.totalHits;
        System.out.println("总数:" + totalHits);
		
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;

        for (ScoreDoc scoreDoc : scoreDocs) {
        	//获得每一个Document的id
            int docId = scoreDoc.doc;
			//根据id查找每一个documented对象
            Document doc = indexSearcher.doc(docId);
            System.out.println(doc.get("companyName"));
            System.out.println(doc.get("jobName"));
            System.out.println(doc.get("salary"));
            System.out.println(doc.get("url"));
            System.out.println("---------------------------------------------------");

        }
        indexReader.close();
    }
}

以上是Lucene的简单使用,但是项目中不会使用Lucene这种原生代码的方式,所以需要借助一个成熟的项目或软件来实现,目前比较有名是Solr和ElasticSearch。

你可能感兴趣的:(java,lucene,spring,boot)