lucene 的排序

package cn.itcast.lucene;

import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.SortField.Type; import cn.itcast.uitls.LuceneUtils; /**
*
* 根据lucene 的字段的名称进行排序...
*
* 对查询出来的结果进行排序\
* 加了排序条件之后,每个文档得分将失效..
* @author Administrator
*
*/
public class TestSort1 { public static void main(String[] args) throws Exception {
IndexSearcher indexSearcher=LuceneUtils.getIndexSearcher();
String keywords="全文检索服务器"; String fields []={"content"}; QueryParser queryParser=new MultiFieldQueryParser(LuceneUtils.getVersion(),fields,LuceneUtils.getAnalyzer()); Query query=queryParser.parse(keywords); //需要根据那个字段进行排序
/**
* 1:需要根据那个字段进行排序
*
* 2:排序的字段对应的类型
*
* 3:是否反转 (升序(true) 降序 (false))
*
*/
SortField sortField=new SortField("id", Type.INT,true);
//设置排序的条件
Sort sort=new Sort(sortField);
TopDocs topDocs=indexSearcher.search(query, 100, sort);
ScoreDoc scoreDocs[]=topDocs.scoreDocs;
for(ScoreDoc scoreDoc :scoreDocs){
//根据id 去击中一个文档呢..
Document document=indexSearcher.doc(scoreDoc.doc);
//每个文档都有一个得分,这个得分是float 类型,他是lucene 自己内部算出来,VSM
System.out.println("id==="+document.get("id")+"得分===="+scoreDoc.score);
System.out.println("title==="+document.get("title"));
System.out.println("content==="+document.get("content"));
System.out.println("url==="+document.get("url"));
System.out.println("author==="+document.get("author")); }
} }

lucene  的过滤器

package cn.itcast.lucene;

import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.NumericRangeFilter;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs; import cn.itcast.uitls.LuceneUtils; /**
*
* 对查询出来的结果进行过滤,以获得更小范围的结果...
* @author Administrator
*
*/
public class TestFilter {
public static void main(String[] args) throws Exception {
IndexSearcher indexSearcher=LuceneUtils.getIndexSearcher();
String keywords="全文检索服务器"; String fields []={"content"}; QueryParser queryParser=new MultiFieldQueryParser(LuceneUtils.getVersion(),fields,LuceneUtils.getAnalyzer()); Query query=queryParser.parse(keywords); //过滤器
/**
* 1:需要根据那个字段进行过滤
*
* 2:字段对应范围的最小值
*
* 3:字段对应范围的最大值
*
* 4:是否包含最小值
*
* 5:是否包含最大值...
*
*/
/**
*
* Filter 是一个抽象类,我们后面可以继承它,来定义我们 自己的过滤规则,
*
* 使用过滤的效率比较低,我们在后面可以使用其它查询条件实现一样的效果,性能比过滤器要高...
*/
Filter filter=NumericRangeFilter.newIntRange("id",2, 10,true, false); TopDocs topDocs=indexSearcher.search(query, filter, 100); ScoreDoc scoreDocs[]=topDocs.scoreDocs;
for(ScoreDoc scoreDoc :scoreDocs){
//根据id 去击中一个文档呢..
Document document=indexSearcher.doc(scoreDoc.doc);
//每个文档都有一个得分,这个得分是float 类型,他是lucene 自己内部算出来,VSM
System.out.println("id==="+document.get("id"));
System.out.println("title==="+document.get("title"));
System.out.println("content==="+document.get("content"));
System.out.println("url==="+document.get("url"));
System.out.println("author==="+document.get("author"));
} }
}

lucene 的高亮器的使用

package cn.itcast.lucene;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import org.apache.lucene.document.Document;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.SortField.Type;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.Scorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter; import cn.itcast.bean.Article;
import cn.itcast.uitls.LuceneUtils; /**
*
* 测试高亮,
*
* 使用高亮的时候我们需要导入两个jar
* lucene-highlighter-4.4.0.jar
* lucene-memory-4.4.0.jar
*
*
* @author Administrator
* 对查询出来的结果当中包含的搜索关键字进行高亮...
*/
public class TestHighlighter { public static void main(String[] args) throws Exception {
IndexSearcher indexSearcher=LuceneUtils.getIndexSearcher();
String keywords="全文检索服务器";
String fields []={"content"};
QueryParser queryParser=new MultiFieldQueryParser(LuceneUtils.getVersion(),fields,LuceneUtils.getAnalyzer());
Query query=queryParser.parse(keywords);
TopDocs topDocs=indexSearcher.search(query, 1);
ScoreDoc scoreDocs[]=topDocs.scoreDocs; //高亮显示的格式...
// solr 是基于lucene 的<font color='blue'>全</font><font color='blue'>文</font><font color='blue'>检</font>索服务器
Formatter formatter=new SimpleHTMLFormatter("<font color='red'>","</font>"); //与query 查询条件进行关联,因为query 包含了搜索的关键字
//只有知道了搜索的关键字,高亮显示的格式,我才能把一段文本进行高亮...
Scorer scorer=new QueryScorer(query); //创建一个高亮器,我们使用lucene 自带的高亮器进行高亮..
Highlighter highlighter=new Highlighter(formatter,scorer); List<Article> articles=new ArrayList<Article>(); Article article=null; for(ScoreDoc scoreDoc :scoreDocs){
article=new Article();
Document document=indexSearcher.doc(scoreDoc.doc);
String title=document.get("title");
String content=document.get("content");
System.out.println("id=="+document.get("id"));
System.out.println("title==="+title);
System.out.println("content==="+content);
System.out.println("没有高亮之前的结果....----------------------------------------------------"); if(content!=null){
//返回高亮过后的文本...
String highcontent=highlighter.getBestFragment(LuceneUtils.getAnalyzer(), "content", content);
System.out.println("高亮过后的highcontent="+highcontent);
if(highcontent==null){
article.setContent(content);
}else{
article.setContent(highcontent);
}
} if(title!=null){
String hightitle=highlighter.getBestFragment(LuceneUtils.getAnalyzer(), "title", title); //假设我们对一段文本进行高亮,如果这段文本当中不包含搜索关键字,对这段文本高亮,返回的结果为null
System.out.println("高亮过后的hightitle="+hightitle); //不能把null 返回到客户端,所以我们需要进行判断,如果为null值,就返回没有高亮之前的文本,
if(hightitle==null){
article.setTitle(title);
}else{
article.setTitle(hightitle);
} } //title 当中有没有可能不包含搜索的关键字... }
} }

lucene 查询条件的使用

package cn.itcast.lucene;

import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.search.BooleanClause.Occur; import cn.itcast.uitls.LuceneUtils; public class TestQuery { public static void main(String[] args) throws IOException, ParseException {
// article.setId(i); intfield
// article.setTitle("lucene 是传智播客一个工具包"); textfield
// article.setContent("solr 是基于lucene 的全文检索服务器"); textfield
// article.setUrl("http://apche.cn"); StringField
// article.setAuthor("爱新觉罗王姐杰杰结节"); StringField // 1:第一种查询条件: 单字段查询..
// Query query=new TermQuery(new Term("title","传")); //2:第二种查询:多字段查询,字符串搜索...
// String fields []={"title"};
//
// String keywords="传智播客";
//
// QueryParser queryParser=new MultiFieldQueryParser(LuceneUtils.getVersion(),fields,LuceneUtils.getAnalyzer());
// //会使用分词器把关键字进行分词之后再组拼查询条件...
// Query query=queryParser.parse(keywords); //第三种查询:查询所有..
// Query query=new MatchAllDocsQuery();
//第四种查询,通配符查询...
//? 代表单个的任意字符,* 代表是多个任意字符
//使用*代表匹配的结果越多,性能越低...
// Query query=new WildcardQuery(new Term("title","luce*")); //第五种查询:范围查询:可以使用此查询来替代过滤器..
// Query query=NumericRangeQuery.newIntRange("id", 1, 10, true, false); //第六种查询:模糊查询...
/**
* 1:查询的条件term
*
* 2:maxEidts 默认值为2 ,最大的可编辑数,允许我的查询当中的值可以错误几个字符..
*
*/
// FuzzyQuery query=new FuzzyQuery(new Term("author","爱新觉罗王姐杰杰班长"),2); // /第七种查询:短语查询: // PhraseQuery query=new PhraseQuery();
// //lucene 是传智播客一个工具包
// query.add(new Term("title", "lucene"));
// query.add(new Term("title", "具"));
//
// //设置两个短语之间的最大间隔数..
// //如果设置短语的间隔越小,越是我们想要的数据,
// //如果设置的短语的间隔越大,被匹配到的内容越多,性能越慢...
// query.setSlop(1111111111); //第八种查询,boolean 类型的查询.. BooleanQuery query=new BooleanQuery(); //查询条件1
//1,9
Query query1=NumericRangeQuery.newIntRange("id", 1, 10, true, false); //6~17
Query query2=NumericRangeQuery.newIntRange("id", 6, 18, true, false); //select * from table where username ="bangzhang" and sex ='nv' //boolean 组拼多个查询条件,取交集...
//=
query.add(query1,Occur.MUST); //!=
query.add(query2, Occur.MUST_NOT); //or
query.add(query2, Occur.SHOULD); testQuery(query);
} public static void testQuery(Query query) throws IOException{
IndexSearcher indexSearcher=LuceneUtils.getIndexSearcher();
TopDocs topDocs=indexSearcher.search(query, 100);
ScoreDoc scoreDocs[]=topDocs.scoreDocs;
for(ScoreDoc scoreDoc :scoreDocs){
//根据id 去击中一个文档呢..
Document document=indexSearcher.doc(scoreDoc.doc);
//每个文档都有一个得分,这个得分是float 类型,他是lucene 自己内部算出来,VSM
System.out.println("id==="+document.get("id"));
System.out.println("title==="+document.get("title"));
System.out.println("content==="+document.get("content"));
System.out.println("url==="+document.get("url"));
System.out.println("author==="+document.get("author")); } }
}

Lucene笔记二的更多相关文章

  1. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  2. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  3. Mastering Web Application Development with AngularJS 读书笔记(二)

    第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...

  4. Python 学习笔记二

    笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...

  5. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  6. webpy使用笔记(二) session/sessionid的使用

    webpy使用笔记(二) session的使用 webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶 ...

  7. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  8. 《MFC游戏开发》笔记二 建立工程、调整窗口

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9300383 作者:七十一雾央 新浪微博:http:/ ...

  9. JavaScript基础笔记二

    一.函数返回值1.什么是函数返回值    函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...

随机推荐

  1. 面向切面编程(AOP)

    一.引言: AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中 ...

  2. TensorFlow:在PyCharm中配置TensorFlow

    在本地配置好TensorFlow后,如何在PyCharm中配置TensorFlow呢? 只需将当前的Python编译环境配置为TensFlow安装路径中的Pyhton环境,具体操作如下: 1. 打开‘ ...

  3. 二、StreamAPI

    一.Stream是什么? 是数据通道,用于操作数据源(集合.数组等)所生成的元素序列.集合讲的是数据,流讲的是计算. 注意: Stream不会存储元素. Stream不会改变源对象.相反,他们会返回一 ...

  4. windown reids

    记录Windown安装Redis和php_redis扩展 和Linux系统不同windown中不需要编译安装:只需要下对版本拖拽过去即可: 首先安装redis服务: 可以百度下一个,只要注意系统版本即 ...

  5. rn打包分析

    rn打包原来是packager,后来独立出一个专门的打包工具metro,构建工具的大体思路跟前端构建工具差不多,都会有一个启动文件,然后根据模块依赖关系把对应文件找到. 开发中打包 在开发中打包,我们 ...

  6. hdu1789 Doing Homework again(贪心+排序)

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  7. 用Anko和Kotlin实现Android上的对话框和警告提示(KAD 24)

    作者:Antonio Leiva 时间:Mar 9, 2017 原文链接:https://antonioleiva.com/dialogs-android-anko-kotlin/ 借助Builder ...

  8. 程序迭代时测试操作的要点(后端&前端)

    今晚直播课内容简介,视频可点击链接免费听 <程序迭代时测试操作的要点(后端&前端)> ===== 1:迭代时后台涉及的操作有哪些?如何进行 a.更新war包:用于访问web\app ...

  9. Mongo DB Java操作

    1.首先下载Mongo DB java 驱动 2.操作Mongo 增删改查 package com.sjjy.mongo; import java.util.ArrayList;import java ...

  10. CSP201509-2:日期计算

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...