索引创建

以新闻文档为例,每条新闻是一个document,新闻有news_id、news_title、news_source、news_url、news_abstract、news_keywords这6个域,添加两个news document到索引中,下面再贴一下创建索引的代码:

package ucas.ir.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.Field.Store;
import org.apache.lucene.document.*;
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 CreateIndex { public static void main(String[] args) {
// 第一步:创建分词器
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
// 第二步:创建indexWriter配置信息
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_43, analyzer);
// 第三步:设置索引的打开方式
indexWriterConfig.setOpenMode(OpenMode.CREATE);
// 第四步:设置索引第路径
Directory directory = null;
// 第五步:创建indexWriter,用于索引第增删改.
IndexWriter indexWriter = null; try {
File indexpath = new File("/Users/yp/Documents/workspace/UCASIR/WebContent/index");
if (indexpath.exists() != true) {
indexpath.mkdirs();
}
directory = FSDirectory.open(indexpath);
if (indexWriter.isLocked(directory)) {
indexWriter.unlock(directory);
}
indexWriter = new IndexWriter(directory, indexWriterConfig); } catch (IOException e) {
e.printStackTrace();
} Document doc1 = new Document();
doc1.add(new IntField("news_id", 1, Store.YES));
doc1.add(new TextField("news_title", "围棋界对阿法狗集体服软 柯洁能成为人脑救星吗", Store.YES));
doc1.add(new TextField("news_source", "搜狐体育", Store.YES));
doc1.add(new TextField("news_url", "http://sports.sohu.com/20160316/n440533081.shtml", Store.YES));
doc1.add(new TextField("news_abstract",
"2016年3月16日 - 阿法狗4比1大胜李世石,它的表现几乎征服了整个围棋界,世界冠军级棋手们纷纷表示自己不是阿法狗的对手", Store.YES));
doc1.add(new TextField("news_keywords", "阿法狗,李世石,柯洁", Store.YES)); Document doc2 = new Document();
doc2.add(new IntField("news_id", 2, Store.YES));
doc2.add(new TextField("news_title", "任志强违纪究竟违反了什么?内幕惊动党中央", Store.YES));
doc2.add(new TextField("news_source", "西陆频道", Store.YES));
doc2.add(new TextField("news_url", "http://www.xilu.com/20160302/1000010000932707.html", Store.YES));
doc2.add(new TextField("news_abstract",
"2016年3月2日 - 核心:任志强在公开场合发表坚持资产阶级自由化立场、反对四项基本原则、反对党的改革开放决策的言论,妄议中央大政方针,公开与中央唱反调,背离了党的根本宗...",
Store.YES));
doc2.add(new TextField("news_keywords", "任志强,微博,被关", Store.YES)); try {
indexWriter.addDocument(doc1);
indexWriter.addDocument(doc2);
indexWriter.commit();
indexWriter.close();
directory.close();
} catch (IOException e) {
e.printStackTrace();
} System.out.println("index create success!");
}
}

再luke中查看:

检索索引

索引创建好以后,查询可分为以下几个步骤:

1.设置查询索引的目录(这里就是上面创建索引的目录).

2.创建indexSearcher.

3.设置query的分词方式

4.设置查询域(比如查询域为”news_title”,那么就到新闻标题域去比对)

5.设置查询字符串,也就是要查询的关键词.

6.返回结果是一个文档集合,放在TopDocs中,通过循环TopDocs数组输出查询结果.

package ucas.ir.lucene;

import java.io.File;
import java.io.IOException; import javax.print.Doc; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.core.KeywordAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
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 IndexSearch { public static void main(String[] args) {
Directory directory = null;
try {
File indexpath = new File("/Users/yp/Documents/workspace/UCASIR/WebContent/index");
if (indexpath.exists() != true) {
indexpath.mkdirs();
}
//设置要查询的索引目录
directory = FSDirectory.open(indexpath);
//创建indexSearcher
DirectoryReader dReader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(dReader);
//设置分词方式
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43); //设置查询域
QueryParser parser = new QueryParser(Version.LUCENE_43, "news_title", analyzer);
// 查询字符串
Query query = parser.parse("阿法狗");
System.out.println("query:"+query.toString());
// 返回前10条
TopDocs topDocs = searcher.search(query, 10);
if (topDocs != null) {
System.out.println("符合条件第文档总数:" + topDocs.totalHits); for (int i = 0; i < topDocs.scoreDocs.length; i++) {
Document doc = searcher.doc(topDocs.scoreDocs[i].doc);
System.out.println("news_id= " + doc.get("news_id"));
System.out.println("news_title= " + doc.get("news_title"));
System.out.println("news_source=" + doc.get("news_source"));
System.out.println("news_url=" + doc.get("news_url"));
System.out.println("news_abstract=" + doc.get("news_abstract"));
System.out.println("news_keywords=" + doc.get("news_keywords"));
}
} directory.close();
dReader.close();
} catch (Exception e) {
e.printStackTrace();
}
} }

这个例子中设置的查询域为news_title,查询词为”阿法狗”,那么新闻标题中有”阿法狗”的就会被返回。

结果:

query:news_title:阿 news_title:法 news_title:狗
符合条件第文档总数:1
news_id= 1
news_title= 围棋界对阿法狗集体服软 柯洁能成为人脑救星吗
news_source=搜狐体育
news_url=http://sports.sohu.com/20160316/n440533081.shtml
news_abstract=2016年3月16日 - 阿法狗4比1大胜李世石,它的表现几乎征服了整个围棋界,世界冠军级棋手们纷纷表示自己不是阿法狗的对手
news_keywords=阿法狗,李世石,柯洁

查询域设置为news_keywords,查询词设置为微博,检索结果:

query:news_keywords:微 news_keywords:博
符合条件第文档总数:1
news_id= 2
news_title= 任志强违纪究竟违反了什么?内幕惊动党中央
news_source=西陆频道
news_url=http://www.xilu.com/20160302/1000010000932707.html
news_abstract=2016年3月2日 - 核心:任志强在公开场合发表坚持资产阶级自由化立场、反对四项基本原则、反对党的改革开放决策的言论,妄议中央大政方针,公开与中央唱反调,背离了党的根本宗...
news_keywords=任志强,微博,被关

总结

Lucene有多种分词方式和查询方式,上面的例子索引创建和索引查询都用的标准分词,后面会继续学习。

Lucene查询索引的更多相关文章

  1. lucene查询索引库、分页、过滤、排序、高亮

    2.查询索引库 插入测试数据 xx.xx. index. ArticleIndex @Test public void testCreateIndexBatch() throws Exception{ ...

  2. lucene查询索引之QueryParser解析查询——(八)

    0.语法介绍:

  3. lucene查询索引之Query子类查询——(七)

    0.文档名字:(根据名字索引查询文档)

  4. 搜索引擎学习(三)Lucene查询索引

    一.查询理论 创建查询:构建一个包含了文档域和语汇单元的文档查询对象.(例:fileName:lucene) 查询过程:根据查询对象的条件,在索引中找出相应的term,然后根据term找到对应的文档i ...

  5. Lucene查询索引(分页)

    分页查询只需传入每页显示记录数和当前页就可以实现分页查询功能 Lucene分页查询是对搜索返回的结果进行分页,而不是对搜索结果的总数量进行分页,因此我们搜索的时候都是返回前n条记录 package c ...

  6. 第六步:Lucene查询索引(优化一)

    package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...

  7. 第六步:Lucene查询索引

    package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...

  8. Lucene实现索引和查询

    0引言 随着万维网的发展和大数据时代的到来,每天都有大量的数字化信息在生产.存储.传递和转化,如何从大量的信息中以一定的方式找到满足自己需求的信息,使之有序化并加以利用成为一大难题.全文检索技术是现如 ...

  9. 学习笔记CB011:lucene搜索引擎库、IKAnalyzer中文切词工具、检索服务、查询索引、导流、word2vec

    影视剧字幕聊天语料库特点,把影视剧说话内容一句一句以回车换行罗列三千多万条中国话,相邻第二句很可能是第一句最好回答.一个问句有很多种回答,可以根据相关程度以及历史聊天记录所有回答排序,找到最优,是一个 ...

随机推荐

  1. 原生JS实现几个常用DOM操作API

    原生实现jQuery的sibling方法 <body> <span>我是span标签</span> <div>我是一个div</div> & ...

  2. vscode设置出错, 无法自动补全

    问题: 之前设置的没问题, vscode重装后, 发现vscode里面的设置还在, 但敲代码却无法识别虚拟环境中的包了, 因此相关的内容也无法自动补全. 解决: 后来发现, 实际上设置没有出错, 但重 ...

  3. 使用poi导出数据到excel

    一.首先是导入poi所需要的jar包,我是用的是maven,添加jar包依赖 <dependency> <groupId>org.apache.poi</groupId& ...

  4. springaop问题——Cannot subclass final class org.springframework.boot.autoconfigure.AutoConfigurationPackages$BasePackages

    问题描述: 在使用springaop对目标对象增强时,若切点的条件过于宽泛就会出现以下异常! 如: @Before("execution(* *(..))") @Before(&q ...

  5. Bootstrap File Input 中文文档

    手动安装 您也可以手动地安装插件到你的项目中.只要下载源ZIP或TAR球和提取资产(CSS和JS插件文件夹)到你的项目中. 使用 步骤1:在你页面头部加载以下类库. <link href=&qu ...

  6. [ABP]浅谈工作单元 在整个 ABP 框架当中的应用

    ABP在其内部实现了工作单元模式,统一地进行事务与连接管理. 其核心就是通过 Castle 的 Dynamic Proxy 进行动态代理,在组件注册的时候进行拦截器注入,拦截到实现了 Unit Of ...

  7. 微信小程序之Todo

    wxAppTodos   todomvc提供了在当今大多数流行的JavaScript MV*框架概念实现的相同的Todo应用程序,觉得这个小项目挺有意思,最近在学习微信小程序,故用小程序做一版Todo ...

  8. Ajax/XHR/HTTP/jQuery Ajax

    Ajax即通过XHR API使用js发起的异步网络请求,它不会导致页面刷新,因此是现代Web App的关键技术. HTTP协议是Web开发中最重要的网络协议,HTTP协议详细规定了请求和响应报文. 请 ...

  9. [HNOI 2016]大数

    Description 题库链接 给你一个长度为 \(n\) ,可含前导零的大数,以及一个质数 \(p\) . \(m\) 次询问,每次询问你一个大数的子区间 \([l,r]\) ,求出子区间中有多少 ...

  10. ●Codevs 4158 残缺的字符串

    题链: http://codevs.cn/problem/4158/ 题解: FFT. 定义两个相同长度的字符串s1,s2的距离为 $$dis(s1,s2)=\sum_{i=0}^{len-1}(s1 ...