lucene 用法 ,我自己的demo,慢慢完善

package searchMysql;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import jeasy.analysis.MMAnalyzer;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.NumberTools;
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.RangeFilter;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
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.junit.Test;

import searchMysql.creatIndex.CreateIndex;
import searchMysql.toDoc.ToDoc;

public class search {
String filePath = "E:\\lucene\\LuceneDemoSrc\\luceneDatasource\\test_test.txt";
String indexPath = "D:\\workspace\\myLucene\\mysqlIndexPath";
Analyzer analyzer = new MMAnalyzer();

@Test
public void test() throws Exception {

Document doc = ToDoc.File2Doc(filePath);
// 创建索引
CreateIndex.save(doc, indexPath);

// 查询*****

String queryString = "总统";

// 1,把要搜索的文本解析为 Query
String[] fields = { "neirong" };// 选择要查询的filed 里面的的字段
QueryParser queryParser = new MultiFieldQueryParser(fields, analyzer);

// 查询方式在这里
Query query = queryParser.parse(queryString);

// 2,进行查询
IndexSearcher indexSearcher = new IndexSearcher(indexPath);

// 过滤规则
Filter filter = null;
// Filter filter = new RangeFilter("title",
// NumberTools.longToString(200),NumberTools.longToString(2000), true,
// true);
// 解析:RangeFilter(String fieldName, String lowerTerm, String upperTerm,
// boolean includeLower, boolean includeUpper)

// sort参数设置
Sort sort = new Sort();
sort.setSort(new SortField("neirong"));

/**
*
* 这里的search 参数不同,决定不同的搜索方法 通过带不同的参数把不同的搜索设置加进去
*
* 字段解析 query: 查询方式 filter: 过滤 n:记录条数 sort:类别
*
* filter 子类 BooleanFilter, CachingWrapperFilter, ChainedFilter,
* DuplicateFilter, PrefixFilter, QueryWrapperFilter, RangeFilter,
* RemoteCachingWrapperFilter, SpanFilter, TermsFilter
*
*
*
* TopDocs topDocs = indexSearcher.search(query, filter, n, sort);
*
* TopDocs topDocs = indexSearcher.search(query, filter, n) ;
*
* TopDocs topDocs = indexSearcher.search(query, n) ;
*
*/

// 关键查询语句
TopDocs topDocs = indexSearcher.search(query, filter, 10000);
// =================

// topDocs.scoreDocs //Expert: The top hits for the query. ScoreDoc[]
// topDocs.totalHits //Expert: The total number of hits for the query.
// int

String text = doc.get("neirong"); // 文章内容
System.out.println("总共有【" + topDocs.totalHits + "】条匹配结果");

// 3,打印结果
// 高亮器 固定写法
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>",
"</font>");
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter, scorer);
Fragmenter fragmenter = new SimpleFragmenter(500); // 显示文件的长度!!
highlighter.setTextFragmenter(fragmenter);
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
int docSn = scoreDoc.doc; // 文档内部编号

// 高亮
// 返回高亮结果,要是没有关键词 返回null
// String hc = highlighter.getBestFragment(analyzer, fieldName,
// text)
String hc = highlighter.getBestFragment(analyzer, "neirong", text);
if (hc == null) {
String neirong = doc.get("neirong");
int endIndex = Math.max(50, neirong.length());
hc = neirong.substring(0, endIndex);
}
// doc.getField("neirong").setValue(hc);
//
// 高亮方式二!
TokenStream tokenStream = analyzer.tokenStream("neirong",
new StringReader(text));
String highLightText = highlighter.getBestFragment(tokenStream,
text);
System.out.println("!-------" + hc + "---!");
System.out.println("!-------" + highLightText + "---!!");
System.out.println(indexSearcher.doc(docSn).get("neirong"));
System.out.println(indexSearcher.doc(docSn).get("title"));

}

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值