2、Lucene 最简单的使用(小例子)

在了解了Lucene以后,我打算亲手来做一个Lucene的小例子,这个例子只是Lucene最简单的应用:使用Lucene实现标准的英文搜索;

1、下载Lucene

下载Lucene,到Lucene的官方下载http://lucene.apache.org/;

2、新建项目

新建一个Java Project 然后引入Lucene的jar 包:

因为要实现的功能非常简单,所以Jar包只引入了一部分,当然Lucene的jar包远远不止这些;

core包:Lucene的核心包

analyzers包:主要进行对采集的内容和用户输入的内容进行分词;

highlighter包:主要对搜索的结果进行高亮显示,就像百度搜索结果标红一样;

queries和queryparser包:搜索查询包,根据用户输入关键定去检索内容;

主要用到这三个包; 

 

3、准备数据源文件

要让用户搜索结果,首先得有数据源, 我准备了几个文本文档,里面全是英文内容:

将这些文本文件放在一个全英文的目录里面,同时还要建一些纯英文的目录用来存放索引文件;

4、对数据源进行索引

在用户进行搜索前,系统得先对数据源进行分析,排序,分词,创建索引;这是一步很关键的工作:

新建一个CreateIndex类,代码如下:

package com.lucene;
import java.io.File;
import java.util.Collection;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.document.Document;
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;
import org.junit.Test;

public class CreateIndex {
        /** 数据源目录 **/
        public static final String DATA_DIR="E:/data/lucene/en/data";
        /** 索引目录 **/
        public static final String INDEX_DIR="E:/data/lucene/en/index";
        @Test
        public void create(){
            try {
                Directory dir = FSDirectory.open(new File(INDEX_DIR));
                //4. 通过CharArraySet可以向分词中追加一些停止词(即排除检索的词)
                CharArraySet arrSet = new CharArraySet(Version.LUCENE_4_9, 0, false);
                //3. Analyzer 用于对数据源进行分词
                Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_9, arrSet);
                //2. IndexWriter的配置信息都存放在IndexWriterConfig中
                IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_9,analyzer);
                // OpenMode.CREATE_OR_APPEND 指定,该创建索引是可以在以后通过追加的方式向里面添加内容
                config.setOpenMode(OpenMode.CREATE_OR_APPEND);
                //1. 创建索引的入口,创建索引必须用IndexWriter进行创建或者追加
                IndexWriter writer = new IndexWriter(dir,config);
                File dataDir = new File(DATA_DIR);
                //5.得到数据源中所有的文件
                Collection<File> files = FileUtils.listFiles(dataDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
                for(File file : files){
                    //6. 通过向Writer追加Document的方式添加内容
                    Document doc = new Document();
                    doc.add(new StringField("filename",file.getName(), Store.YES));
                    String content = FileUtils.readFileToString(file);
                    doc.add(new TextField("content",content,Store.YES));
                    writer.addDocument(doc);
                }
                writer.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

在新建完CreateIndex类以后,可以使用Test运行一下,然后在索引目录就会生成一些这样的文件:

这就是Lucene创建完索引的索引数据库了;

5、创建检索

创建一个SearchIndex类,主要作用是通过用户输入内容分词,然后检索出用户想要的结果:

import java.io.File;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;

public class SearchIndex {
    @Test
    public void search(){
        try {
            String keyword = "java";
            // 在这里进行检索的时候,需要加载的目录就是创建索引的目录,创建索引以后,那些原数据源在Lucene上就暂时用不到了
            Directory directory = FSDirectory.open(new File(CreateIndex.INDEX_DIR));
            IndexReader reader = DirectoryReader.open(directory);
            // IndexSearcher 是Lucene的检索的入口点,所有检索都从这里入口
            IndexSearcher searcher = new IndexSearcher(reader);
            // 通过analyzer对用户输入的词进行分词
            StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_9);
            // 构建检索条件
            QueryParser parser = new QueryParser(Version.LUCENE_4_9, "content",analyzer);
            Query query = parser.parse(keyword);
            // 最后使用searcher.search检索,search方法的参数很多,还可以根据需求,取出相应的条数
            TopDocs topDocs = searcher.search(query, 20);
            // topDocs.totalHits 返回的是所有检索到记录的条数的总和
            ScoreDoc[] docs = topDocs.scoreDocs;
            System.out.println("关键词\" "+keyword+" \"共检索到 "+topDocs.totalHits+" 条相关的记录");
            System.out.println("被检索到记录,他们分别放在以下的文件中:");
            for(ScoreDoc doc : docs){
                int docId = doc.doc;
                Document document = reader.document(docId);
                System.out.println(document.get("filename"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

为了方便,我摸拟了一个搜索词“java” 看能查询出多少条数据,运行单元测试:

 

小结:这只是Lucene的最简单的用法,还有很多高深的用法,可以查看Lucene的官方文档,Lucene用来检索中文同样很厉害,大家快去试试吧;下小节我会贴出我写的使用Lucene来做一个千度搜索;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lucene.net 是一个开源的全文检索引擎库,它提供了一些基本的 API 来创建和维护索引,并且可以通过这些 API 来搜索索引中的文档。下面是一些使用 Lucene.net 的基本步骤: 1. 创建索引:使用 Lucene.net 的 API,可以创建一个空的索引。可以将文档添加到索引中,以便后续搜索。 2. 添加文档:使用 Lucene.net 的 API,可以将文档添加到索引中。可以为每个文档定义一个或多个字段。 3. 搜索索引:使用 Lucene.net 的 API,可以搜索索引中的文档。可以使用查询对象来指定搜索条件,例如搜索某个字段中包含特定关键字的文档。 4. 处理搜索结果:搜索结果是一组匹配查询条件的文档。可以使用 Lucene.net 的 API 来访问每个文档的字段,以便将搜索结果呈现给用户。 以下是一个简单的示例代码,可用于创建索引、添加文档和搜索索引: ``` // 创建索引 var indexDirectory = FSDirectory.Open(@"C:\myindex"); var analyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48); var indexConfig = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer); var writer = new IndexWriter(indexDirectory, indexConfig); // 添加文档 var doc = new Document(); doc.Add(new TextField("title", "Lucene.net tutorial", Field.Store.YES)); doc.Add(new TextField("content", "This is a tutorial on how to use Lucene.net for full text search.", Field.Store.YES)); writer.AddDocument(doc); // 搜索索引 var searcher = new IndexSearcher(writer.GetReader(true)); var queryParser = new QueryParser(LuceneVersion.LUCENE_48, "content", analyzer); var query = queryParser.Parse("full text search"); var topDocs = searcher.Search(query, 10); foreach (var scoreDoc in topDocs.ScoreDocs) { var doc = searcher.Doc(scoreDoc.Doc); Console.WriteLine(doc.Get("title")); } ``` 此示例创建一个名为“myindex”的索引目录,添加一个文档,然后搜索包含“full text search”关键字的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值