自定义评分

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. 移植ARM linux下远程连接工具dropbear

    移植ARM linux下远程连接工具dropbear 原文地址:http://www.cnblogs.com/NickQ/p/9010529.html 移植zlib 下载地址:https://gith ...

  2. ajax渲染swiper问题

    由于ajax异步请求的关系,所以之前将swiper初始化写在请求外面时总是不能达到效果.下面是能正常渲染的效果示例: $http({ method:"GET", url:" ...

  3. R语言学习笔记(二十四):plyr包的用法

    plyr 这个包,提供了一组规范的数据结构转换形式. Input/Output list data frame array list llply() ldply() laply() data fram ...

  4. 【EXCEL】指定の項目の内容一覧を表示

    上記の図の左の部分みたいな長いデータがあって. その中からただほしいのは右側部分ように一部分のみほしい時. 普段はVLOOKUP使用フィルターをかけて探すなどの方法をしようしていますが. ここで.簡単 ...

  5. Hadoop学习总结之Map-Reduce的过程解析

    一.客户端 Map-Reduce的过程首先是由客户端提交一个任务开始的. 提交任务主要是通过JobClient.runJob(JobConf)静态函数实现的: public static Runnin ...

  6. 20155216 2016-2017-2 《Java程序设计》第三周学习总结

    教材学习内容总结 区分基本类型与类类型 类类型是自己定义产生的,基本类型是long,int,double等类型. 在类的定义过程中,可直接用class XXX {}对每个序定义的值域成员进行定义.这样 ...

  7. sql中的制表符、换行符、回车符,问题

    前一阵子用excel导入资源,使用join时发现匹配项为0赶紧用left join看看情况,发现无法链接表. 后来觉得可能是换行的问题,发现还真是,于是就在数据库里删除不想要的字符了,当然,一定要养成 ...

  8. python 多线程笔记(3)-- 线程的私有命名空间

    线程的私有命名空间实现: threading_namespace = threading.local() import threading import time import random thre ...

  9. tkinter菜单图标,工具栏

    所用的图片: import tkinter as tk from tkinter import messagebox, filedialog, simpledialog, colorchooser f ...

  10. 1018: [SHOI2008]堵塞的交通traffic

    1018: [SHOI2008]堵塞的交通traffic 链接 分析: 用线段树维护区间的四个端点的联通情况,然后查询的时候,把所有覆盖到的区间合并起来即可. 六种情况左上到右上(左边到右边的情况)… ...