Lucene 高级搜索
自定义评分

public class MyScoreQuery {
public void searchByScoreQuery(){
try {
IndexSearcher searcher=new IndexSearcher(IndexReader.open(FileIndexUtils.getDirectory()));
Query q=new TermQuery(new Term("content","java"));
//创建一个评分
FieldScoreQuery fd=new FieldScoreQuery("score",Type.INT);
//2 根据评分域和原有的Query创建自定义的Query对象
MyCustomScoreQuery query=new MyCustomScoreQuery(q,fd);
TopDocs tds=null;
tds=searcher.search(query, 100);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:ss");
for(ScoreDoc sd:tds.scoreDocs){
Document d=searcher.doc(sd.doc);
System.out.println(sd.doc+"("+sd.score+")"+
"["+d.get("filename")+"【"+d.get("path")+"】--->"+d.get("score")+"--->"+
d.get("size")+" "+sdf.format(new Date(Long.valueOf(d.get("date"))))+"]");
}
searcher.close();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void searchByFileScoreQuery(){
try {
IndexSearcher searcher=new IndexSearcher(IndexReader.open(FileIndexUtils.getDirectory()));
Query q=new TermQuery(new Term("content","java"));
FilenameScoreQuery query=new FilenameScoreQuery(q);
TopDocs tds=null;
tds=searcher.search(query, 100);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:ss");
for(ScoreDoc sd:tds.scoreDocs){
Document d=searcher.doc(sd.doc);
System.out.println(sd.doc+"("+sd.score+")"+
"["+d.get("filename")+"【"+d.get("path")+"】--->"+d.get("score")+"--->"+
d.get("size")+" "+sdf.format(new Date(Long.valueOf(d.get("date"))))+"]");
}
searcher.close();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private class DateScoreProvider extends CustomScoreProvider{
long[] dates=null;
public DateScoreProvider(IndexReader reader) {
super(reader);
//通过域缓存获取文件名
try {
dates=FieldCache.DEFAULT.getLongs(reader, "date");
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public float customScore(int doc, float subQueryScore, float valSrcScore) throws IOException {
//如何个格局doc的名称获取相应的field的值
/*
* 在reader在没有关闭之前,所有的数据会存储在一个域缓存中,可以通过域缓存获取很多有用的信息
*/
long date=dates[doc];
long today=new Date().getTime();
long year=1000*60*60*24*365;
//表示的是这一年之内的
if(today-date<=year){
//为其加分
}
return subQueryScore/1.5f;
}
}
@SuppressWarnings("serial")
private class FilenameScoreQuery extends CustomScoreQuery{
public FilenameScoreQuery(Query subQuery) {
super(subQuery);
}
@Override
protected CustomScoreProvider getCustomScoreProvider(IndexReader reader) throws IOException {
return new FilenameScoreProvider(reader);
}
}
private class FilenameScoreProvider extends CustomScoreProvider{
String[] filenames=null;
public FilenameScoreProvider(IndexReader reader) {
super(reader);
//通过域缓存获取文件名
try {
filenames=FieldCache.DEFAULT.getStrings(reader, "filename");
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public float customScore(int doc, float subQueryScore, float valSrcScore) throws IOException {
//如何个格局doc的名称获取相应的field的值
/*
* 在reader在没有关闭之前,所有的数据会存储在一个域缓存中,可以通过域缓存获取很多有用的信息
*/
String filename=filenames[doc];
System.out.println(filename);
if(filename.endsWith("注解")|| filename .endsWith(".ini")){
return subQueryScore*1.5f;
}
return subQueryScore/1.5f;
}
}
private class MyCustomScoreQuery extends CustomScoreQuery{
public MyCustomScoreQuery(Query subQuery, ValueSourceQuery valSrcQuery) {
super(subQuery, valSrcQuery);
}
@Override
protected CustomScoreProvider getCustomScoreProvider(IndexReader reader) throws IOException {
//默认情况实现的评分是通过原有的评分 传入进来的评分域所获取的评分来确定最终打分
//为了根据不同的需求进行评分,需要自己进行评分设定
/**
* 自定评分的步骤
* 创建一个类继承于CustomScoreProvider
* 覆盖customScore方法
*/
return new MyCustomScoreProvider(reader);
}
}
private class MyCustomScoreProvider extends CustomScoreProvider{
public MyCustomScoreProvider(IndexReader reader) {
super(reader);
// TODO Auto-generated constructor stub
}
/**
* subQueryScore 表示默认文档的打分
* valScrScore 表示的评分域的打分
*/
@Override
public float customScore(int doc, float subQueryScore, float valSrcScore) throws IOException {
// TODO Auto-generated method stub
return subQueryScore/valSrcScore;
}
}
}
自定义Queryparser

public class CustomParser extends QueryParser {
public CustomParser(Version matchVersion, String f, Analyzer a) {
super(matchVersion, f, a);
}
@Override
protected org.apache.lucene.search.Query getFuzzyQuery(String field, String termStr, float minSimilarity)
throws ParseException {
throw new ParseException("由于性能原因,已经禁用了模糊查询,请输入更精确的信息进行查询");
}
@Override
protected org.apache.lucene.search.Query getWildcardQuery(String field, String termStr) throws ParseException {
throw new ParseException("由于性能原因,已经禁用了通配符查询,请输入更精确的信息进行查询");
}
@Override
protected org.apache.lucene.search.Query getRangeQuery(String field, String arg1, String arg2, boolean arg3)
throws ParseException {
//
if(field.equals("size")){
return NumericRangeQuery.newIntRange(field, Integer.parseInt(arg1), Integer.parseInt(arg2), arg3, arg3);
}else if(field.equals("date")){
//格式化日期
String dateType="yyyy-MM-dd";
Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
if(pattern.matcher(arg1).matches() && pattern.matcher(arg2).matches()){
SimpleDateFormat sdf=new SimpleDateFormat(dateType);
try {
long start=sdf.parse(arg1).getTime();
long end=sdf.parse(arg2).getTime();
return NumericRangeQuery.newLongRange(field, start, end, arg3, arg3);
} catch (java.text.ParseException e) {
e.printStackTrace();
}
}
}
return new TermRangeQuery(field,arg1,arg2,arg3,arg3);
}
}
Lucene 高级搜索的更多相关文章
- Google高级搜索语法
Google高级搜索语法 Google搜索果真是一个强悍的不得了的搜索引擎,今天转了一些 google的高级搜索语法 希望能帮助到大家. 一.allinanchor: anchor是一处说明性的文 ...
- 如何使用GOOGLE高级搜索技巧
如何使用GOOGLE高级搜索技巧 一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发 ...
- google、baidu高级搜索技巧
1.baidu(可以去高级搜索查看更多信息) intitle搜索范围限定在网页标题:intitle:和后面的关键词之间不要有空格----intitle:中国 site搜索范围限定在特定站点中:“sit ...
- SEO-搜索引擎高级搜索指令
搜索引擎高级搜索指令 1.双引号 把搜索词放在双引号中,代表完全匹配搜索,也就是说搜索结果返回的页面包含双引号中出现的所有的词,连顺序也必须完全匹配.bd和Google 都支持这个指令.例如搜索: & ...
- lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5.5.3
前言: 前面几章已经很详细的讲解了如何创建索引器对索引进行增删查(没有更新操作).如何管理索引目录以及如何使用分词器,上一章讲解了如何生成索引字段和创建索引文档,并把创建的索引文档保存到索引目录,到这 ...
- lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3
前言:上一章中我们已经实现了索引器的创建,但是我们没有索引文档,本章将会讲解如何生成字段.创建索引文档,给字段加权以及保存文档到索引器目录 luncene5.5.3集合jar包下载地址:http:// ...
- lucene全文搜索之二:创建索引器(创建IKAnalyzer分词器和索引目录管理)基于lucene5.5.3
前言: lucene全文搜索之一中讲解了lucene开发搜索服务的基本结构,本章将会讲解如何创建索引器.管理索引目录和中文分词器的使用. 包括标准分词器,IKAnalyzer分词器以及两种索引目录的创 ...
- lucene全文搜索之一:lucene的主要功能和基本结构(基于lucene5.5.3)
前言:lucene并不是像solr或elastic那样提供现成的.直接部署可用的系统,而是一套jar包,提供了一些常见语言分词.构建索引和创建搜索器等等功能的API,我们常用到的也就是分词器.索引目录 ...
- Google高级搜索技巧十则
前言:多数人在使用Google搜索的过程是非常低效和无谓的,如果你只是输入几个关键词,然后按搜索按钮,你将是那些无法得到Google全部信息的用户,在这篇文章中,Google搜索专家迈克尔.米勒将向您 ...
随机推荐
- 一条常用的 Sql
select * from table where 条件1 .... group by 字段...... Having 条件1.....Limit 0,10; 1. 根据where ...
- 【原创】CRM 2015/2016,SSRS 生成PDF文件,幷以附件的形式发送邮件
主要步骤如下: 生成一条邮件记录 生成一条ActivityParty记录 生成PDF文件,并以Base64添加到ActivityMimeAttachment 中去 打开发送邮件窗口,以便编辑及发送邮件 ...
- 11-while循环基本使用
hm_02_第一个while循环.py def main(): i = 1 while i <= 3: print(i, 'Hello world') i += 1 print(i) 1 Hel ...
- Creating Isomorphic Apps with Node.js, React, and Express
In this article, we’re going to use following software: React: the UI framework that can rendered on ...
- JQuery补充——获取与设置表单值
//写jQuery代码时注意前面一定要记得加$(function(){});,在文档加载完成后进行代码的编写 使用jQuery的表单对象属性来选择被选中的项::checked,详见文档选择器部分 根据 ...
- 20155227 2016-2017-2 《Java程序设计》第三周学习总结
20155227 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 类与对象 使用Java撰写程序几乎都在使用对象,要产生对象必须先定义类,类是对象的设计图,对 ...
- 预备作业03:虚拟机安装及Linux操作系统练习
安装虚拟机 安装时遇到的问题 在打开虚拟机时出现以下问题: 经查询该问题只需要更改其兼容性,使其"以管理员身份运行". 常用的Linux命令 $ who am i:查看当前伪终端的 ...
- 20155308 2016-2017-2 《Java程序设计》实验3
20155308 2016-2017-2 <Java程序设计>实验3 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 敏捷开发是一种以人为核心.迭代.循序渐进的 ...
- PyQt5 结合 matplotlib 时,如何显示其 NavigationToolbar
本文目的:展示 PyQt5 结合 matplotlib 时,如何显示其 NavigationToolbar. 本人搜遍所有网络无果,没办法,查看PyQt5源代码,最终才搞明白...特此留记. 〇.Py ...
- 【NOIP2018】提高组题解
[NOIP2018]提高组题解 其实就是把写过的打个包而已 道路铺设 货币系统 赛道修建 旅行 咕咕咕 咕咕咕