接下来我会写一个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。

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

  1. SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)

    SQL 数据库 学习 007 通过一个示例简单介绍什么是字段.属性.列.元组.记录.表.主键.外键 (上) 我们来介绍一下:数据库是如何存储数据的. 数据库是如何存储数据的 来看一个小例子 scott ...

  2. lucene创建索引简单示例

    利用空闲时间写了一个使用lucene创建索引简单示例, 1.使用maven创建的项目 2.需要用到的jar如下: 废话不多说,直接贴代码如下: 1.创建索引的类(HelloLucene): packa ...

  3. Lucene学习总结之七:Lucene搜索过程解析

    一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...

  4. Lucene学习总结之六:Lucene打分公式的数学推导

    在进行Lucene的搜索过程解析之前,有必要单独的一张把Lucene score公式的推导,各部分的意义阐述一下.因为Lucene的搜索过程,很重要的一个步骤就是逐步的计算各部分的分数. Lucene ...

  5. Lucene学习总结之四:Lucene索引过程分析

    对于Lucene的索引过程,除了将词(Term)写入倒排表并最终写入Lucene的索引文件外,还包括分词(Analyzer)和合并段(merge segments)的过程,本次不包括这两部分,将在以后 ...

  6. Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息

    Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...

  7. 6、GNU makefile工程管理学习的一个例子

    在之前我们已经学习了一个文件的编译过程,但是做过项目的都知道,一个工程中的源文件不计其数,其按类型.功能.模块会分别放在若干个目录中,而这些文件如何编译就需要有一个编译规则,虽然现在很多大型的项目都是 ...

  8. Lucene学习入门——下载初识

    本文从官网下载Lucene开始,一步一步进行Lucene的应用学习研究.下载初识Snowball Stemmer 1.下载 (1)首先,去Lucne的Apache官网主页 http://lucene. ...

  9. Lucene学习总结之七:Lucene搜索过程解析 2014-06-25 14:23 863人阅读 评论(1) 收藏

    一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...

随机推荐

  1. ubuntu首次给root用户设置密码和root用户登录设置

    1 ubuntu首次给root用户设置密码 给root用户设置密码输入命令sudo passwd,然后系统会让你输入密码,这时输入的密码就是root用户的密码了,设置完成之后就可以切换root用户登录 ...

  2. C# 利用StringBuilder提升字符串拼接性能

    一个项目中有数据图表呈现,数据量稍大时显得很慢. 用Stopwatch分段监控了一下,发现耗时最多的函数是SaveToExcel 此函数中遍列所有数据行,通过Replace替换标签生成Excel行,然 ...

  3. <2014 05 16> 线性表、栈与队列——一个环形队列的C语言实现

    栈与队列都是具有特殊存取方式的线性表,栈属于先进后出(FILO),而队列则是先进先出(FIFO).栈能够将递归问题转化为非递归问题,这是它的一个重要特性.除了FILO.FIFO这样的最普遍存取方式外, ...

  4. Hidden String---hdu5311(字符串处理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5311 题意:从给出的串 s 中找到3个子串然后把他们连在一起问是否能够成anniversary #in ...

  5. CNI bridge 插件实现代码分析

    对于每个CNI 插件在执行函数cmdAdd之前的操作是完全一样的,即从环境变量和标准输入内读取配置.这在http://www.cnblogs.com/YaoDD/p/6410725.html这篇博文里 ...

  6. mysql 中sum (if()) 用法

    原表: id    fenlei     time 1      分类1      20130316 2      分类2      20130316 3      分类3      20130317 ...

  7. mysq查询语句包含中文以及中文乱码,字符集 GBK、GB2312、UTF8的区别

    一.查看mysql 字符集设置情况 使用Navicat for Mysql查看工具,打开命令列界面,输入show variables like '%char%';如下图,查看当前mysql字符集设置情 ...

  8. 005-环境安装【docker、fabric】

    1.参考地址:https://hyperledger-fabric.readthedocs.io/en/latest/prereqs.html#install-curl 一.前置条件和系统配置 1.安 ...

  9. 使用Kotlin进行Android开发

     Kotlin是一门基于JVM的编程语言,它正成长为Android开发中用于替代Java语言的继承者.Java是世界上使用最多的编程语言之一,当其他编程语言为更加便于开发者使用而不断进化时,Java并 ...

  10. shell脚本调用传参【转载】

    转自:https://www.cnblogs.com/cisum/p/8010658.html 1.直接使用$0,$1,$2,$3 $0是脚本的名字,就是按顺序来 #!/bin/bash # auth ...