自定义评分

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. nodejs知识点

    rss(resident set size):所有内存占用,包括指令区和堆栈. heapTotal:”堆”占用的内存,包括用到的和没用到的. heapUsed:用到的堆的部分. external: V ...

  2. python学习第二天 -----2019年4月17日

    第二周-第02章节-Python3.5-模块初识 #!/usr/bin/env python #-*- coding:utf-8 _*- """ @author:chen ...

  3. 截图:【炼数成金】深度学习框架Tensorflow学习与应用

    创建图.启动图 Shift+Tab Tab 变量介绍: F etch Feed 简单的模型构造 :线性回归 MNIST数据集 Softmax函数 非线性回归神经网络   MINIST数据集分类器简单版 ...

  4. Python 爬虫 多进程清洗代理

    利用多线程检测代理网站提供的免费代理是否可用 import requests from lxml import etree import time import multiprocessing def ...

  5. 20155204 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    实验一 Java开发环境的熟悉 一.实验内容及步骤 1.使用JDK编译.运行简单的java程序 步骤一:在linux界面下运行终端 步骤二:在终端中打开待编译文件的文件夹 步骤三:使用 javac 文 ...

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

    20155319 2016-2017-2 <Java程序设计>第二周学习总结 课堂学习内容 git:版本控制 java -d bin(当地文件夹) src/Hello.java把生成的.c ...

  7. 苏州Uber优步司机奖励政策(4月18日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. 优步UBER司机全国各地奖励政策汇总 (4月18日-4月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. 【SDOI2014】数表

    题面 题解 不管$a$的限制 我们要求的东西是:($\sigma(x)$是$x$的约数个数和) $ \sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j)) $ 设$f(x)= ...

  10. CC2541调试问题记录-第一篇

    1. 在网络环境过于复杂的地方,手机连接不上CC2541.2. 修改CC2541的设备名字. static uint8 scanRspData[] = { // complete name 0x0d, ...