lucene学习 - 2 - 一个示例

接下来我会写一个lucene的实例。实际上在搜索引擎上随便搜索下都能找到这样的东西。不过还是写一下吧,这也是我学习的经历。

package com.zhyea.doggie;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
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.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
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.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class LuceneTest {

    public static void main(String[] args) {
        // 要用来检索的样本文件存储路径
        String docPath = "D:\\aqsiqDevelop\\workspace3\\doggie\\WebContent\\docs";
        // 索引文件存储路径
        String indexPath = "D:\\aqsiqDevelop\\workspace3\\doggie\\WebContent\\index";
        try {
            // 分析器,这里使用了标准分析器
            Analyzer analyzer = new StandardAnalyzer();
            // 准备好索引存储目录
            Directory dir = FSDirectory.open(new File(indexPath));
            // 创建IndexWriter(索引写入器)配置,
            // 在配置中指明创建IndexWriter使用的lucene的版本及使用的分析器
            IndexWriterConfig config = new IndexWriterConfig(Version.LATEST,
                    analyzer);
            // 创建IndexWriter(索引写入器),并指明索引存储路径和配置文件
            IndexWriter writer = new IndexWriter(dir, config);
            // 使用IndexWriter(索引写入器)创建索引,这里另外创建一个方法
            addDocuments(docPath, writer);

            /* -------------创建索引结束,以下是进行搜索------------ */
            // 创建索引读出器
            IndexReader reader = DirectoryReader.open(dir);
            // 创建搜索器
            IndexSearcher seacher = new IndexSearcher(reader);
            // 创建搜索对象
            Query query = new TermQuery(new Term("content", "杨过"));
            // 执行搜索,并返回结果
            TopDocs topDocs = seacher.search(query, 10000);
            // 展示搜索结果
            Document doc;
            for(ScoreDoc tmp : topDocs.scoreDocs){
                doc = reader.document(tmp.doc);
                System.out.println("书名:" + doc.get("name")
                                 + "---------------------"
                                 + "路径:" + doc.get("path"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 遍历样本文本所在的目录,进行分析。
     * 这里采用的样本文本是金庸的三部小说:神雕、射雕和笑傲江湖。
     * @param docPath
     *            样本文本存储路径
     * @param writer
     *            索引写入器
     * @throws IOException
     */
    private static void addDocuments(String docPath, IndexWriter writer)
            throws IOException {
        File dir = new File(docPath);
        for (File tmp : dir.listFiles()) {
            //创建Document对象,代表一个被索引的基本单元
            Document doc = new Document();
            String fileName = tmp.getName();
            String filePath = tmp.getCanonicalPath();
            String fileContent = readTxt(tmp);
            //创建Field,并加入Document
            doc.add(new StringField("name", fileName,   Field.Store.YES));
            doc.add(new StringField("path", filePath,   Field.Store.YES));
            doc.add(new TextField("content",fileContent,Field.Store.YES));
            //将Document从内存写入真实目录
            writer.addDocument(doc);
            //提交索引,将索引写入索引文件,这个别忘了
            writer.commit();
        }
    }

    /**
     * 换行标志符
     */
    static final String NEWLINE = System.getProperty("line.separator");

    /**
     * 读取txt文件
     *
     * @param file
     *            txt文件对象
     * @return
     * @throws IOException
     */
    private static String readTxt(File file) throws IOException {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(file));
            StringBuilder builder = new StringBuilder();
            String line;
            while (null != (line = br.readLine())) {
                builder.append(line).append(NEWLINE);
            }
            return builder.toString();
        } finally {
            if (null != br) br.close();
        }
    }
}

执行代码,发现没有任何输出。用luke进行查看索引目录,发现content对应的是乱码:

在读取txt文件时,需要调整编码格式,或者直接调整txt的编码格式与工作空间默认编码相同即可。

这里就不写出了。

调整乱码后,再次执行程序,发现还是不能检索出什么东西。再次查看索引目录:

所有的中文字符都被分开成为单独的Term。这次需要调整分析器,将分析器调整为CJKAnalyzer。这次能够检索出结果了:

实际上,影响查询结果的不只是分析器,还有这一句:

new TermQuery(new Term("content", "杨过"));

好了,这些可以留到以后再说。

all。

时间: 2024-11-02 21:44:49

lucene学习 - 2 - 一个示例的相关文章

lucene学习笔记(三)

好几天没更新了.更新一下,方便自己和大家学习. 这是最基本的代码 package index; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document;

lucene学习笔记(二)

package index; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.CorruptIn

Python3.5 数据处理 –jieba + sklearn库安装及第一个示例

一,安装pip3: #sudo apt-get install pip3 二,安装jieba: #sudo pip3 install jieba 三,安装sklearn: #sudo pip3 install scikit-learn 四,安装sklearn依赖(numpy,scipy): #sudo pip3 install numpy #sudo pip3 install scipy eg:国内安装时可能出现time-out错误-解决办法如下: #sudo pip3 install -i h

lucene学习-创建索引

本文的lucene是基于lucene3.5版本. 使用lucene实现搜索引擎开发,核心的部分是建立索引和搜索.本节主要是记录创建索引部分的内容. 创建的索引结构如图所示. 创建索引的步骤分为以下几个步骤: 1.建立索引器IndexWriter 2.创建文档对象Document 3.建立信息对象字段Field 4.将Field对象添加到Document 5.将Document对象添加到IndexWriter对象中 下面简要介绍几个核心对象. (1).创建IndexWriter对象. IndexW

Lucene 5.2.1 + jcseg 1.9.6中文分词索引(Lucene 学习序列2)

Lucene 5.2.1 + jcseg 1.9.6中文分词索引(Lucene 学习序列2) jcseg是使用Java开发的一个开源的中文分词器,使用流行的mmseg算法实现.是一款独立的分词组件,不是针对lucene而开发,但是提供了最新版本的lucene和solr分词接口. Java Code <span style="font-size:14px;">package com.qiuzhping.lucene; import java.sql.Connection; i

Lucene学习笔记(1)

下载:http://lucene.apache.org lucene项目的Java子项目:http://lucene.apache.org/java Lucene学习笔记 查询者输入查询条件,条件之间可以通过特定运算符进行运算,比如查询希望查询到与“中国”和“北京”相关的记录,但不希望结果中包括“海淀区中关村”,于是输入条件为“中国+北京-海淀区中关村”: 把IndexWriter想象成让你可以对索引进行写操作的对象. 在一个文档被索引之前,首先需要对文档内容进行分词处理,并且而剔除一些冗余的词

Lucene学习笔记: 五,Lucene搜索过程解析

一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: IndexReader打开索引文件,读取并打开指向索引文件的流. 用户输入查询语句 将查询语句转换为查询对象Query对象树 构造Weight对象树,用于计算词的权重Term Weight,也即计算打分公式中与仅与搜索语句相关与文档无关的部分(红色部分). 构造Scorer对象树,用于计算打分(T

突发奇想想学习做一个HTML5小游戏

前言: 最近一期文化馆轮到我分享了,分享了两个,一个是关于童年教科书的回忆,一个是关于免费电子书的.最后我觉得应该会不敌web,只能说是自己在这中间回忆了一下那个只是会学习的年代,那个充满梦想的年代.有人说如果一个人开始回忆童年的时候,那么他开始变老了,不知道是不是这样一个原因,我突然想起了很多以前的老朋友,开始想起了一些童年时期的玩伴.也就想做这样一款简单的游戏,也只是单纯的想回忆一下童年. 计划: 游戏其实很简单,我们把它叫着裤裆棋,又叫什么狗卵坨还是什么的,有些记忆模糊了,反正大致是这样子

Android学习--写一个发送短信的apk,注意布局文件的处理过程!!!

刚开始写Android程序如图发现使用了findViewById方法之后输出的话居然是null(空指针错误),也就是说这个方法没有成功.网上说这样写是在activity_main .xml去找这个ID所代表的控件,而现在使用的ADT在layout下除了activity_main .xml还多生成了一个fragment_main.xml.我就是把控件写在了后一个布局文件中.想请问下,使用什么样的方法是在fragment_main.xml去寻找控件呢? 回答:在PlaceHolderFragment