Lucene查询索引
索引创建
以新闻文档为例,每条新闻是一个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查询索引的更多相关文章
- lucene查询索引库、分页、过滤、排序、高亮
2.查询索引库 插入测试数据 xx.xx. index. ArticleIndex @Test public void testCreateIndexBatch() throws Exception{ ...
- lucene查询索引之QueryParser解析查询——(八)
0.语法介绍:
- lucene查询索引之Query子类查询——(七)
0.文档名字:(根据名字索引查询文档)
- 搜索引擎学习(三)Lucene查询索引
一.查询理论 创建查询:构建一个包含了文档域和语汇单元的文档查询对象.(例:fileName:lucene) 查询过程:根据查询对象的条件,在索引中找出相应的term,然后根据term找到对应的文档i ...
- Lucene查询索引(分页)
分页查询只需传入每页显示记录数和当前页就可以实现分页查询功能 Lucene分页查询是对搜索返回的结果进行分页,而不是对搜索结果的总数量进行分页,因此我们搜索的时候都是返回前n条记录 package c ...
- 第六步:Lucene查询索引(优化一)
package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...
- 第六步:Lucene查询索引
package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...
- Lucene实现索引和查询
0引言 随着万维网的发展和大数据时代的到来,每天都有大量的数字化信息在生产.存储.传递和转化,如何从大量的信息中以一定的方式找到满足自己需求的信息,使之有序化并加以利用成为一大难题.全文检索技术是现如 ...
- 学习笔记CB011:lucene搜索引擎库、IKAnalyzer中文切词工具、检索服务、查询索引、导流、word2vec
影视剧字幕聊天语料库特点,把影视剧说话内容一句一句以回车换行罗列三千多万条中国话,相邻第二句很可能是第一句最好回答.一个问句有很多种回答,可以根据相关程度以及历史聊天记录所有回答排序,找到最优,是一个 ...
随机推荐
- 使用Markup解析xml文件
1:怎么获取Markup.cpp 和 Markup.h 首先到http://www.firstobject.com/dn_markup.htm链接下,下载Release 11.5 zip (579k) ...
- 开源纯C#工控网关+组态软件(九)定制Visual Studio
一. 引子 因为最近很忙(lan),很久没发博了.不少朋友对那个右键弹出菜单和连线的功能很感兴趣,因为VS本身是不包含这种功能的. 大家想这是什么鬼,怎么我的设计器没有,其实这是一个微软黑科技 ...
- How to preview html file in our browser at sublime text?
sublime preview html.md open In Browser what should we do if we want to preview html file in our bro ...
- [ZJOI 2007]Hide 捉迷藏
Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双 ...
- luogu2252 取石子游戏
题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完 ...
- [SHOI2008]小约翰的游戏John
Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取 的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不 ...
- codeforces 842C Ilya And The Tree
Ilya is very fond of graphs, especially trees. During his last trip to the forest Ilya found a very ...
- 【Ural1277】 Cops and Thieves 无向图点连通度问题
1277. Cops and Thieves Time limit: 1.0 secondMemory limit: 64 MB The Galaxy Police (Galaxpol) found ...
- [4.14校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. hzwer又出丧题虐人 4道noi.... 很奇怪 每次黄学长出题总有一题我做过了. 嗯题目你们自己看看呗 好难解释 ----- ...
- bzoj2839: 集合计数 容斥+组合
2839: 集合计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 523 Solved: 287[Submit][Status][Discuss] ...