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. ACM数据结构-并查集

    ACM数据结构-并查集   并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合 ...

  2. react前置路由守卫

    react中一切皆组件-- 目标:自定义user界面的前置路由守卫,当用户点击要进入user组件时,路由守卫发起判断,如果条件满足则进入,否则跳转至login组件. .入口文件index.js中代码如 ...

  3. 推荐 的FPGA设计经验(1)组合逻辑优化

    主要内容摘自Quartus prime Recommended Design Practices For optimal performance, reliability, and faster ti ...

  4. 笔记本ubuntu安装wifi驱动(未完成)

    1. 用联想E440,Ubuntu14.04,安装完之后,没有检查到wifi的驱动,所以需要安装.

  5. GitLab 自动触发 Jenkins 构建

    GitLab 是当前应用非常广泛的 Git Hosting 工具,Jenkins 是非常牛逼的持续集成工具.尽管 GitLab 有内建的 GitLab CI,但它远没有 Jenkins 那么强大好用. ...

  6. hadoop 家族图

    hadoop家族

  7. TraceHelper

    public class TraceHelper { private static TraceHelper _traceHelper; private TraceHelper() { } public ...

  8. dva webpack 利用require.context加载多个model

    dva redux数据管理都在models,根据业务不同models可能会有几十甚至上百的 [模块.js], 每次在index.js使用 app.model(require('./models/exa ...

  9. 微信小程序 选项 、时间日期选择器

    wxml: <view class="section" > <picker bindchange="bindPickerChange" val ...

  10. 【zabbix 监控】第二章 安装测试被监控主机

    客户端安装测试 一.准备两台被监控主机,分别做如下操作: web129:192.168.19.129 web130:192.168.19.130 [root@web129 ~]#yum -y inst ...