package com.bjsxt.indexsearch;
import jeasy.analysis.MMAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Filter;
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.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.Scorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import com.bjsxt.utils.File2DocumentUtil;
public class IndexAndSearch {
/**
* @param args
*/
String filePath = "D:\\flexWorkespace\\LuceneDemo\\luceneDataSource\\小笑话_总统的房间 Room .txt";
String indexPath = "D:\\flexWorkespace\\LuceneDemo\\indexPath";
// Analyzer analyzer = new StandardAnalyzer();
Analyzer analyzer = new MMAnalyzer();
public static void main(String[] args) throws Exception {
// new IndexAndSearch().createIndexByDir();
new IndexAndSearch().search("房间");
}
public void createIndex() throws Exception {
// File file = new File(filePath);
Document doc = File2DocumentUtil.file2Document(filePath);
// IndexWriter 是用来操作(增删改)索引库的
IndexWriter iw = new IndexWriter(indexPath, analyzer, true,
MaxFieldLength.LIMITED);
iw.addDocument(doc);
iw.close();
}
public void createIndexByDir()throws Exception {
//1.创建时候载入文件系统里的索引
Directory fsDir = FSDirectory.getDirectory(indexPath);
Directory ramDir = new RAMDirectory(fsDir);
//new ramIndexWriter时不需要重新创建
IndexWriter ramIndexWriter = new IndexWriter(ramDir, analyzer, MaxFieldLength.LIMITED);
//添加document
Document doc = File2DocumentUtil.file2Document(filePath);
ramIndexWriter.addDocument(doc);
ramIndexWriter.close();
//2.退出时保存内存里的索引
//new fsIndexWriter时需要重新创建,即删除原来的索引文件
IndexWriter fsIndexWriter = new IndexWriter(fsDir, analyzer, true, MaxFieldLength.LIMITED);
// Directory[] dir = {ramDir};
//保存内存里的索引
fsIndexWriter.addIndexesNoOptimize(new Directory[]{ramDir});
//把内存里的东西提交后才优化
fsIndexWriter.commit();
// 优化索引文件,把多个cfs文件合并成一个
fsIndexWriter.optimize();
fsIndexWriter.close();
}
public void search(String queryStr) throws Exception {
String[] fields = { "content","name" };
QueryParser queryParser = new MultiFieldQueryParser(fields, analyzer);
Query query = null;
Filter filter = null;
query = queryParser.parse(queryStr);
IndexSearcher indexSearcher = null;
indexSearcher = new IndexSearcher(indexPath);
TopDocs topDocs = indexSearcher.search(query, filter, 1000);
System.out.println("总共有" + topDocs.totalHits + "条记录:");
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
int docNum = scoreDoc.doc;
Document doc = indexSearcher.doc(docNum);
//---------------------------准备高亮器
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>","</font>");
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter,scorer);
Fragmenter fragmenter = new SimpleFragmenter(50);
highlighter.setTextFragmenter(fragmenter);
//---------------------------
//--------------------------高亮
//将高亮后的结果返回,如果当前属性值中没有出现关键字,则返回空
String hc = highlighter.getBestFragment(analyzer, "content", doc.get("content"));
if(hc == null){
String content = doc.get("content");
int endIndex = Math.min(50,content.length());System.out.println(content.length());
hc = content.substring(0,endIndex);
}
doc.getField("content").setValue(hc);
//--------------------------
File2DocumentUtil.printDocumentInfo(doc);
}
}
public void searchByDir(String queryStr) throws Exception {
String[] fields = { "name", "content" };
QueryParser queryParser = new MultiFieldQueryParser(fields, analyzer);
Query query = null;
Filter filter = null;
query = queryParser.parse(queryStr);
IndexSearcher indexSearcher = null;
Directory fsDir = FSDirectory.getDirectory(indexPath);
indexSearcher = new IndexSearcher(fsDir);
TopDocs topDocs = indexSearcher.search(query, filter, 1000);
System.out.println("总共有" + topDocs.totalHits + "条记录:");
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
int docNum = scoreDoc.doc;
Document doc = indexSearcher.doc(docNum);
File2DocumentUtil.printDocumentInfo(doc);
}
}
}
分享到:
相关推荐
《Lucene+HighLighter高亮显示实例解析》 在信息技术领域,搜索引擎的构建与优化是至关重要的一环,其中,如何有效地对搜索结果进行高亮显示,以突出关键信息,是提升用户体验的关键因素之一。本篇文章将深入探讨...
"高亮插件效果模型高光闪烁"是一个专门用于提升模型表面高光效果的工具,它为开发者提供了更丰富的视觉表现力,使得游戏场景中的物体能呈现出更加生动、真实的效果。这款插件主要应用于3D模型的表面,通过相机的后...
通过以上内容,我们可以了解到在Lucene中使用IKAnalyzer进行中文分词和利用Highlighter高亮搜索结果的关键点。这两个工具对于构建一个高效的中文搜索系统至关重要,它们使得用户能够更直观、准确地获取所需信息。
我们还可以使用Highlighter高亮显示查询结果中的关键字。 6. **高亮显示**: 高亮关键字是提升用户体验的重要一环。使用Highlighter类,我们可以获取到每个匹配文档的高亮片段。首先,创建一个QueryScorer,然后...
6. 使用Highlighter高亮搜索结果的关键片段。 7. 实现分页逻辑,根据当前页数计算offset,然后调用search方法获取下一批ScoreDoc。 8. 渲染结果,展示高亮的搜索结果和分页导航。 五、总结 Lucene的高亮显示和分页...
《Visual Studio代码高亮插件Highlighter深度解析》 在编程世界中,代码的可读性和清晰度至关重要,尤其对于大型项目来说,良好的代码高亮能够显著提高开发效率,减少错误。Visual Studio(VS)作为一款强大的集成...
Highlighter.js 是一个小型(纯 javascript)的库,可以让你轻松导航、选择以及高亮 DOM 元素。用法:document.addEventListener("DOMContentLoaded", function() { var Highlighter = new window....
查询结果返回后,使用 Highlighter 高亮显示组件,可以将查询结果中的匹配词汇在原始文本中突出显示,使用户更容易理解搜索结果。 例如,当用户搜索“Java GUI”时,Lucene 高亮组件会在文档中找到“Java”和“GUI...
支架突出显示 括号突出显示与各种括号匹配,例如: [] , () , {} , "" , '' , <tag></tag>甚至自定义括号。 这最初是从pyparadigm的SublimeBrackets和SublimeTagmatcher (这两个都不再可用)中派生出来的。...
lucene-highlighter-3.5.0.jar lucene高亮包
AE脚本-文字层代码高亮突出颜色控制FUI脚本AEscripts ASH Syntax Highlighter 1.0.0AE脚本-文字层代码高亮突出颜色控制FUI脚本AEscripts ASH Syntax Highlighter 1.0.0AE脚本-文字层代码高亮突出颜色控制FUI脚本...
在进行文档检索时,我们使用Analyzer对内容进行分析,通过QueryScorer评估查询的相关性,并利用Highlighter高亮显示匹配的片段。此外,通过SimpleFragmenter设置每次返回的字符数,避免一次性展示大量数据,提高用户...
3. **增强编辑体验**:Multiple Cursors允许同时在多个位置编辑,AutoFileName在输入文件名时自动补全,BracketHighlighter高亮显示匹配的括号,提高编码准确性。 4. **性能优化**:SublimeCodeIntel提供了智能代码...
5. 结果处理:展示搜索结果,可使用Highlighter高亮关键词。 通过以上步骤,我们可以构建出一个基本的全文搜索引擎,满足日常的信息检索需求。对于开发者来说,理解和掌握Lucene的工作原理和使用方法,无疑将提升...
BracketHighlighter是一款非常实用的文本编辑器插件,主要用于编程时的括号匹配高亮显示。在编程过程中,正确地配对和管理括号是至关重要的,BracketHighlighter能够帮助开发者更加直观地看到代码中的括号对,提高...
在 Visual Studio Code (VSCode) 中,语法高亮和语义高亮是两种增强代码可读性和美观性的关键功能。这两种高亮方式帮助开发者更好地理解代码结构和含义,从而提高编程效率。 1. **语法高亮 (Syntax Highlight)** ...
10. **其他实用工具**:如ColorPicker方便选取颜色值,BracketHighlighter高亮显示匹配的括号,Status Bar Color Picker显示当前选择的颜色。 这些插件的集成,使得Sublime Text 3成为了一款强大的Web开发环境。...
- **常见插件举例**:如GitGutter显示版本控制差异,SideBarEnhancements增强侧边栏功能,Emmet加速HTML和CSS编写,ColorPicker快速选取颜色,BracketHighlighter高亮括号匹配等。 3. **自定义皮肤和字体** - **...
《Lucene Highlighter 3.4.0:搜索引擎中的文本高亮工具》 在信息爆炸的时代,搜索引擎成为了我们获取知识的重要途径。Apache Lucene,作为一款高性能、全文本搜索库,为开发者提供了强大的搜索功能。其中,Lucene ...
8. **生成高亮片段**: 使用Highlighter的`getBestFragments`方法,传入Query、Analyzer、FieldTermVector信息以及需要高亮的文本,得到高亮的片段。 **五、实例代码** ```java // 创建Analyzer Analyzer analyzer =...