自定义评分

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 高级搜索的更多相关文章

  1. Google高级搜索语法

    Google高级搜索语法   Google搜索果真是一个强悍的不得了的搜索引擎,今天转了一些 google的高级搜索语法 希望能帮助到大家. 一.allinanchor: anchor是一处说明性的文 ...

  2. 如何使用GOOGLE高级搜索技巧

    如何使用GOOGLE高级搜索技巧 一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发 ...

  3. google、baidu高级搜索技巧

    1.baidu(可以去高级搜索查看更多信息) intitle搜索范围限定在网页标题:intitle:和后面的关键词之间不要有空格----intitle:中国 site搜索范围限定在特定站点中:“sit ...

  4. SEO-搜索引擎高级搜索指令

    搜索引擎高级搜索指令 1.双引号 把搜索词放在双引号中,代表完全匹配搜索,也就是说搜索结果返回的页面包含双引号中出现的所有的词,连顺序也必须完全匹配.bd和Google 都支持这个指令.例如搜索: & ...

  5. lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5.5.3

    前言: 前面几章已经很详细的讲解了如何创建索引器对索引进行增删查(没有更新操作).如何管理索引目录以及如何使用分词器,上一章讲解了如何生成索引字段和创建索引文档,并把创建的索引文档保存到索引目录,到这 ...

  6. lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3

    前言:上一章中我们已经实现了索引器的创建,但是我们没有索引文档,本章将会讲解如何生成字段.创建索引文档,给字段加权以及保存文档到索引器目录 luncene5.5.3集合jar包下载地址:http:// ...

  7. lucene全文搜索之二:创建索引器(创建IKAnalyzer分词器和索引目录管理)基于lucene5.5.3

    前言: lucene全文搜索之一中讲解了lucene开发搜索服务的基本结构,本章将会讲解如何创建索引器.管理索引目录和中文分词器的使用. 包括标准分词器,IKAnalyzer分词器以及两种索引目录的创 ...

  8. lucene全文搜索之一:lucene的主要功能和基本结构(基于lucene5.5.3)

    前言:lucene并不是像solr或elastic那样提供现成的.直接部署可用的系统,而是一套jar包,提供了一些常见语言分词.构建索引和创建搜索器等等功能的API,我们常用到的也就是分词器.索引目录 ...

  9. Google高级搜索技巧十则

    前言:多数人在使用Google搜索的过程是非常低效和无谓的,如果你只是输入几个关键词,然后按搜索按钮,你将是那些无法得到Google全部信息的用户,在这篇文章中,Google搜索专家迈克尔.米勒将向您 ...

随机推荐

  1. git pull 发生冲突解决办法

    冲突原因:远程仓库的同一个文件的代码,和本地的文件代码不一样 解决办法 : 1.git stash (把本地冲突的代码隐藏) 2.git pull 3.git stash pop (将隐藏的和pull ...

  2. Js错误: obj.parents is not a function

    代码:      (1)  <div class="ViewMore" id="viewmore${i}" onclick="CLICK(thi ...

  3. 树莓派ubuntu系统下修改config.txt文件 树莓派config.txt文件修改记录

    原文:https://www.raspberrypi.org/documentation/configuration/config-txt.md译文:http://my.oschina.net/fun ...

  4. Home Assistant系列 -- 设置界面语言与地理位置

    Home Assistant 安装的时候会自动根据你的系统语言设置默认语言,安装完成以后也可以根据需要自己设置选择语言.启动 Home Assistant ,浏览器打开web 界面,点击左上角的用户图 ...

  5. django中的auth详解

     Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等 ...

  6. firefox burp ssl证书配置

    打开浏览器 设置->证书->证书频发机构->添加证书 添加成功->找到位置->编辑信任->信任->查看证书 导出-> win下可直接安装证书->受 ...

  7. express添加权限拦截

    express通过中间件的方式添加权限拦截 示例代码如下 app.get('/logout', checkLogin); app.get('/logout', function(req, res) { ...

  8. Oracle入门第三天(上)——多表查询与分组函数

    一.多表查询 所有的连接分析,参考之前随笔:http://www.cnblogs.com/jiangbei/p/7420136.html 1.笛卡尔积 select last_name, depart ...

  9. 【Hutool】Hutool工具类之日期时间工具——DateUtil

    一.用于取代Date对象的DateTime对象 再也不用Date SimpleDateFormat Calendar之间倒腾来倒腾去了!日期创建-获取-操作一步到位! 如果JDK版本更新到了8及以上, ...

  10. 20155331 实验四 Android开发基础

    20155331丹增旦达实验四报告 实验四 Android程序设计-1 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java ...