lucene创建索引

简介: 上篇博客写了信息检索的基本知识和lucene架构,这篇博客记录一下如何在eclipse中创建索引.1.lucene下载.

上篇博客写了信息检索的基本知识和lucene架构,这篇博客记录一下如何在eclipse中创建索引.

1.lucene下载.

下载地址:http://archive.apache.org/dist/lucene/java/.
lucene不同版本之间有不小的差别,这里下载的是lucene 4.3.

2.导入jar包

打开eclipse,新建dynamic web project.解压下载的lucene压缩包,依次找到下面几个jar包,加到/WebContent/WEB-INF/lib目录下,然后Add to Build Path:

包名 位置
lucene-analyzers-common-4.3.0.jar lucene-4.3.0/analysis/common
lucene-analyzers-smartcn-4.3.0.jar lucene-4.3.0/analysis/smartcn
lucene-core-4.3.0.jar lucene-4.3.0/core
lucene-highlighter-4.3.0.jar lucene-4.3.0/highlighter
lucene-queries-4.3.0.jar lucene-4.3.0/queries
lucene-queryparser-4.3.0.jar lucene-4.3.0/queryparser

3.创建索引

package ac.ucas.lucene;

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

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.IntField;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class IndexCreate {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 创建标准分词器
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
        // 创建indexwriter配置信息
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_43, analyzer);
        // 设置索引的打开方式
        indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
        // 索引的存储路径
        Directory directory = null;
        // 索引的增删改由indexWriter创建
        IndexWriter indexWriter = null;

        try {
            directory = FSDirectory.open(new File("/Users/yaopan/Documents/eclipseworkspace/test"));
            if (indexWriter.isLocked(directory)) {//若indexWriter锁定则解锁
                indexWriter.unlock(directory);
            }

            //实例化indexWriter
            indexWriter = new IndexWriter(directory, indexWriterConfig);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Document doc1 = new Document();
        //添加三个域
        doc1.add(new StringField("id", "abcde", Store.YES));
        doc1.add(new TextField("content", "极客学院", Store.YES));
        doc1.add(new IntField("num", 1, Store.YES));

        // 写入索引
        try {
            indexWriter.addDocument(doc1);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Document doc2 = new Document();
        doc2.add(new StringField("id", "addff", Store.YES));
        doc2.add(new TextField("content", "LUCENE案例", Store.YES));
        doc2.add(new IntField("num", 2, Store.YES));

        // 写入索引
        try {
            indexWriter.addDocument(doc2);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }

        try {
            indexWriter.commit();

            indexWriter.close();
            directory.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("index ceate complete!");
    }
}

4.lucene分词器

{%codeblock lang:java lucene分词器 %}
package ac.ucas.lucene;

import java.io.IOException;
import java.io.StringReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.core.KeywordAnalyzer;
import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.analysis.core.StopAnalyzer;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.util.Version;

import sun.dc.pr.PRError;

public class AnalyerStudy {

private static String str = "lucene, 全文检索框架";
public static void print(Analyzer analyzer){
    StringReader stringReader=new StringReader(str);
    try {
        TokenStream tokenStream=analyzer.tokenStream(str, stringReader);
        tokenStream.reset();
        CharTermAttribute term=tokenStream.getAttribute(CharTermAttribute.class);
        System.out.println("分词技术:"+analyzer.getClass());
        while(tokenStream.incrementToken()){
            System.out.print(term.toString()+" | ");
        }
        System.out.println("\n");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public static void main(String[] args) {
    Analyzer analyzer=null;
    //标准分词
    analyzer=new StandardAnalyzer(Version.LUCENE_43);
    print(analyzer);


    //空格分词
    analyzer =new WhitespaceAnalyzer(Version.LUCENE_43);
    print(analyzer);

    //简单分词
    analyzer=new SimpleAnalyzer(Version.LUCENE_43);
    print(analyzer);

    //二分法
    analyzer=new CJKAnalyzer(Version.LUCENE_43);
    print(analyzer);

    //关键字
    analyzer=new KeywordAnalyzer();
    print(analyzer);

    //
    analyzer=new StopAnalyzer(Version.LUCENE_43);
    print(analyzer);
}

}

{% endcodeblock %}

分词结果:
分词技术:class org.apache.lucene.analysis.standard.StandardAnalyzer
lucene | 全 | 文 | 检 | 索 | 框 | 架 |
分词技术:class org.apache.lucene.analysis.core.WhitespaceAnalyzer

lucene, | 全文检索框架 |
分词技术:class org.apache.lucene.analysis.core.SimpleAnalyzer
lucene | 全文检索框架 |
分词技术:class org.apache.lucene.analysis.cjk.CJKAnalyzer
lucene | 全文 | 文检 | 检索 | 索框 | 框架 |
分词技术:class org.apache.lucene.analysis.core.KeywordAnalyzer
lucene, 全文检索框架 |
分词技术:class org.apache.lucene.analysis.core.StopAnalyzer
lucene | 全文检索框架 |

5. 使用luke打开索引

Luke是一个用于Lucene搜索引擎的,方便开发和诊断的第三方工具,它可以访问现有Lucene的索引.
luke下载地址:https://github.com/DmitryKey/luke/releases

目录
相关文章
|
8月前
|
缓存 运维 监控
用『逐步排除法』定位Java服务线上系统性故障(二)
用『逐步排除法』定位Java服务线上系统性故障
|
6月前
|
SQL 弹性计算 自然语言处理
AIGC-知识库-LLM:在云上从0开始搭建智能问答机器人Streamlit网页版
本文描述在阿里云上从0开始构建个人/企业专属,具备私域知识库+LLM智能问答能力的网页版聊天机器人。网页采用streamlit实现,知识库技术方案使用了Lindorm AI数据服务平台知识库能力,LLM使用了开源ChatGLM2-6B。 Streamlit使用起来非常简便,可以让开发者快速(短则几十分钟即可)搭建一个具备公网访问能力的网页。尤其在人工智能开发上,可使用Streamlit快速搭建应用环境,让开发人员将更多精力集中在人工智能本身,本文从0开始详细讲解整个应用的构建过程,代码实现了一个简洁的具备公网访问能力的网页版聊天机器人。
|
11月前
|
Python
用Flask框架将你的python脚本变成服务
用Flask框架将你的python脚本变成服务
|
容灾 数据处理
ES高可用集群规模实战介绍
ES高可用集群规模实战介绍
965 0
|
存储 负载均衡 监控
ES节点角色深层解读,及高可用集群架构角色设计
ES节点角色深层解读,及高可用集群架构角色设计
|
SQL 关系型数据库 MySQL
Flink同步RDS数据到Elasticsearch实践
Flink同步RDS数据到Elasticsearch实践
|
Oracle 关系型数据库 Java
介绍MyBatis之分页插件PageHelper。中国程序员有强!
这篇文章主要给大家介绍MyBatis分页插件PageHelper
介绍MyBatis之分页插件PageHelper。中国程序员有强!
|
JSON Java fastjson
【问题排查】fastjson线上排坑记
版本上线时发现fastjson的toString方法的返回的字符串与与之前版本的toString方法返回的字符串不相同,这导致依赖toString进行md5计算所得到的结果不相同,更进一步导致其他依赖该md5值的插件发现和之前的md5值不相等而重启,导致数据存在丢失情况。
288 0
|
存储 安全 算法
用 HTTPS 就安全了?HTTPS 会被抓包吗?
随着 HTTPS 建站的成本下降,现在大部分的网站都已经开始用上 HTTPS 协议。大家都知道 HTTPS 比 HTTP 安全,也听说过与 HTTPS 协议相关的概念有 SSL 、非对称加密、 CA证书等,但对于以下灵魂三拷问可能就答不
用 HTTPS 就安全了?HTTPS 会被抓包吗?
|
存储 弹性计算 安全
DDD领域驱动设计实战-聚合(Aggregate)和聚合根(AggregateRoot)(下)
DDD领域驱动设计实战-聚合(Aggregate)和聚合根(AggregateRoot)
1005 0