自定义评分

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. 嵌入式nand flash详解

    一.s3c2440启动后会将nand flash的前4K程序复制到内部的sram中,这个过程是硬件自动完成的,但是如果我们的程序远远大于4K,这个时候就需要将程序从flash拷贝到内存中来运行了. 二 ...

  2. python学习之网络编程基础

    引入场景:客户与银行关系 银行职员负责给客户提供取钱服务,客户通过账户密码跟银行职员建立合作关系.此时银行职员就可以作为服务器,当用户A取完钱后他需要等待下一个用户的接入,用户的账号密码就是建立合作关 ...

  3. 详解 Python3 正则表达式(三)

    上一篇:详解 Python3 正则表达式(二) 本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些批注和修改 ^_^ 模块级别的函数 ...

  4. PICT工具一键生成正交试验用例

    PICT工具一键生成正交试验用例 作用: 1.解决手动设计大量测试用例.或覆盖不全面问题,提高测试效率 2.读取excel,将生成的参数组合自动带入脚本,进行接口自动化测试 一.PICT简介 PICT ...

  5. go语言Mutex与RWMutex用法

    Mutex(互斥锁) Lock()加锁,Unlock()解锁 适用于读写不确定,并且只有一个读或者写的场景 例: package main import ( "sync" &quo ...

  6. 快排(python)

    用python写了个快排,第一次发现python居然可以这么简洁. def quicksort(arr): if len(arr) <= 1: return arr pivot = arr[le ...

  7. imshow()不显示灰度图像

    在matlab中,我们常使用imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算.在matlab中,为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变成double型.如果 ...

  8. 20155332 2016-2017-2 《Java程序设计》第10周学习总结

    20155332 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 了解计算机网络基础 掌握Java Socket编程 理解混合密码系统 掌握Java 密码技 ...

  9. OpenCV中Mat操作clone() 与copyto()的区别

    OpenCV中Mat操作clone() 与copyto()的区别 // Mat is basically a class with two data parts: the matrix header ...

  10. hive 数据导入

    Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...