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. 设置cell高度的两种方法(label高度的可变引起cell高度可变的情况)

    第一种:(iOS8以后可用) 在Xib或stroyboard中(代码也可以) 利用AutoLayout设置好label的约束(比如可以设置四个边都距离屏幕50等方式,必须四个边都要固定好). 在代码部 ...

  2. Java语言简介

    Java即计算机编程语言 1.概念 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Jav ...

  3. 弹性分布式数据集RDD概述

      [Spark]弹性分布式数据集RDD概述 弹性分布数据集RDD RDD(Resilient Distributed Dataset)是Spark的最基本抽象,是对分布式内存的抽象使用,实现了以操作 ...

  4. CC3200使用MQTT的SSL加密证书可用日期修改

    1. 在使用CC3200进行SSL加密的时候,需要证书,但是证书有一个截止日期,如果当前CC3200没有设置这个日期,那么证书通信会失败,需要添加代码 int setDeviceTime() { Sl ...

  5. VS2015 更改C++模式

    亲爱的小伙伴,有没有发现你们的VS2015装完以后和老江湖们用的不一样了,人家的界面打开是这样的 而你的界面打开是这样的 虽然看是只有一左一右的区别,但是内在确实有好多不一样. 想不想想老江湖一样,拥 ...

  6. Qt-QML-ComboBox-自定义,实现状态表示,内容可以动态正价,使用ListModel

    哎呀呀呀, 问:杀死一个程序员一个程序要需要进步? 答:改三次需求 我感觉我就要再这需求的变更中被杀死了.不管怎么说,总是要跟着需求走的的,客户才是第一么(要不是因为钱,我才不会了) 下面先上个效果 ...

  7. GIt学习第一天之安装和版本库创建

    搬运自 ‘廖雪峰的官方网站’ 1.git安装 官网下载地址:https://git-scm.com/download/win   百度网盘下载地址:https://pan.baidu.com/s/1k ...

  8. 使用python+selenium控制手工已打开的浏览器

    我们可以利用Chrome DevTools协议.它允许客户检查和调试Chrome浏览器. 打开cmd,在命令行中输入命令: chrome.exe --remote-debugging-port=922 ...

  9. 157. Unique Characters 【LintCode by java】

    Description Implement an algorithm to determine if a string has all unique characters. Example Given ...

  10. (python)leetcode刷题笔记 01 TWO SUM

    1. Two Sum Given an array of integers, return indices of the two numbers such that they add up to a ...