1.Lucene高级查询
来源:互联网 发布:手机上怎样开淘宝网店 编辑:程序博客网 时间:2024/05/08 13:40
1.Lucene高级查询
~1.自定义排序
@Test
public void test(){
try {
Directory directory=Util.getDirectory();
IndexReader indexReader=Util.IndexReaderUtil(directory);
IndexSearcher indexSearcher=new IndexSearcher(indexReader);
QueryParser parser=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
Query query=parser.parse("Java");
Sort sort=new Sort();
//这是排序的操作点
TopDocs topDocs=indexSearcher.search(query, 100);
//根据doc的ID来排序
topDocs=indexSearcher.search(query, 100,sort.INDEXORDER);
//根据默认评分来排序
topDocs=indexSearcher.search(query, 100,sort.RELEVANCE);
//根据ID的大小来排序 倒排true表示是否倒置
topDocs=indexSearcher.search(query, 100,new Sort(new SortField("id", SortField.INT,true)));
//根据ID的大小来排序和文件名称
topDocs=indexSearcher.search(query, 100,new Sort(new SortField("id", SortField.INT),new SortField("filename", SortField.STRING)));
ScoreDoc[] docs=topDocs.scoreDocs;
System.out.println("总数:"+topDocs.totalHits);
for (int i = 0; i < docs.length; i++) {
//7.根据searcher和ScoreDoc对象获取具体Document对象
Document d=indexSearcher.doc(docs[i].doc);
//8.根据document对象获取需要的值
System.out.println("id:"+d.get("id")+"boot:"+d.getBoost()+d.get("filename")+"["+d.get("path")+"]");
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
=================================================================================
~2.自定义评分查询
/**
* 自定义评分查询
* 1.创建一个类实现CustomScoreQuery
* 2.实现getCustomScoreProvider(IndexReader reader)方法
* 3.创建一个类实现CustomScoreProvider
* 4. float customScore(int doc, float subQueryScore, float valSrcScore)中写评分规则
*/
@Test
public void test1(){
try {
Directory directory=Util.getDirectory();
IndexReader indexReader=Util.IndexReaderUtil(directory);
IndexSearcher indexSearcher=new IndexSearcher(indexReader);
QueryParser parser=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
Query query=parser.parse("Java");
//定义一个评分查询器
FieldScoreQuery scoreQuery=new FieldScoreQuery("id",org.apache.lucene.search.function.FieldScoreQuery.Type.INT);
//根据评分域和原来的query来构造一个query对象
myCustomScoreQuery customScoreQuery=new myCustomScoreQuery(query,scoreQuery);
TopDocs topDocs=indexSearcher.search(customScoreQuery, 100);
ScoreDoc[] docs=topDocs.scoreDocs;
System.out.println("总数:"+topDocs.totalHits);
for (int i = 0; i < docs.length; i++) {
//7.根据searcher和ScoreDoc对象获取具体Document对象
Document d=indexSearcher.doc(docs[i].doc);
//8.根据document对象获取需要的值
System.out.println("id:"+d.get("id")+"boot:"+d.getBoost()+d.get("filename")+"["+d.get("path")+"]");
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public class myCustomScoreQuery extends org.apache.lucene.search.function.CustomScoreQuery{
public myCustomScoreQuery(Query subQuery, ValueSourceQuery valSrcQuery) {
super(subQuery, valSrcQuery);
}
@Override
protected CustomScoreProvider getCustomScoreProvider(IndexReader reader)
throws IOException {
// TODO Auto-generated method stub
return new myCustomScoreProvider(reader);
}
}
public class myCustomScoreProvider extends CustomScoreProvider{
String[] filenames=null;
public myCustomScoreProvider(IndexReader reader) {
super(reader);
}
@Override
public float customScore(int doc, float subQueryScore, float valSrcScore)
throws IOException {
// TODO Auto-generated method stub
System.out.println("score:"+subQueryScore*valSrcScore);
return subQueryScore/valSrcScore;
}
}
//------------------------------------------------------------------------------------------
@Test
public void test2(){
try {
Directory directory=Util.getDirectory();
IndexReader indexReader=Util.IndexReaderUtil(directory);
IndexSearcher indexSearcher=new IndexSearcher(indexReader);
QueryParser parser=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
Query query=parser.parse("Java");
//定义一个评分查询器
FieldScoreQuery scoreQuery=new FieldScoreQuery("id",org.apache.lucene.search.function.FieldScoreQuery.Type.INT);
//根据评分域和原来的query来构造一个query对象
myFileCustomScoreQuery customScoreQuery=new myFileCustomScoreQuery(query,scoreQuery);
TopDocs topDocs=indexSearcher.search(customScoreQuery, 100);
ScoreDoc[] docs=topDocs.scoreDocs;
System.out.println("总数:"+topDocs.totalHits);
for (int i = 0; i < docs.length; i++) {
//7.根据searcher和ScoreDoc对象获取具体Document对象
Document d=indexSearcher.doc(docs[i].doc);
//8.根据document对象获取需要的值
System.out.println("id:"+d.get("id")+"boot:"+d.getBoost()+d.get("filename")+"["+d.get("path")+"]");
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public class myFileCustomScoreQuery extends org.apache.lucene.search.function.CustomScoreQuery{
public myFileCustomScoreQuery(Query subQuery, ValueSourceQuery valSrcQuery) {
super(subQuery, valSrcQuery);
}
@Override
protected CustomScoreProvider getCustomScoreProvider(IndexReader reader)
throws IOException {
// TODO Auto-generated method stub
return new myFileCustomScoreProvider(reader);
}
}
public class myFileCustomScoreProvider extends CustomScoreProvider{
String[] filenames=null;
public myFileCustomScoreProvider(IndexReader reader) {
super(reader);
try {
//得到缓存中的filename数据
filenames=FieldCache.DEFAULT.getStrings(reader, "filename");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public float customScore(int doc, float subQueryScore, float valSrcScore)
throws IOException {
if(filenames[doc]!=null){
//将一些.txt和.ssh结尾的文件放到前面
if(filenames[doc].endsWith(".txt")||filenames[doc].endsWith(".ssh")){
System.out.println("subQueryScore:"+subQueryScore);
return subQueryScore*11.5f;
}
System.out.println("subQueryScore:"+subQueryScore);
}
return subQueryScore/11.5f;
}
}
- 1.Lucene高级查询
- lucene.....高级查询
- Lucene学习总结-高级查询
- lucene 高级查询对象应用及分析
- Lucene查询
- lucene查询
- lucene+查询
- lucene查询
- lucene---查询
- Lucene-高级搜索
- 【lucene】高级搜索篇
- Lucene高级篇
- lucene 高级搜索
- lucene 高级语法详解
- 05-lucene高级搜索
- lucene 高级搜索
- 10、索引库的查询四之:Lucene的高级搜索技术
- 高级查询
- andoid检测设备是否开启USB调试模式
- 转 ffmpeg+sdl rstp 播放
- jQuery插件 -- Form表单插件jquery.form.js
- 采用数据库连接池连接到mysql时,因应用中没有关闭ResultSet导致的memory leak问题
- const int *p,int *const p区别
- 1.Lucene高级查询
- HTML5-websocket(构建高性能的实时web应用)
- HDU1010
- 通知的种类
- Docker虚拟主机路由应用Rancher负载均衡
- opengl 和direct3d坐标系的区别
- oracle 数据导入导出
- Java和C++程序在编译和运行上有什么区别
- python 偏函数解析