Lucene使用SortField对多个字段进行排序

/*

* 这里的类实现的功能是对多个字段进行排序

* 比单个难度要大,但是有相应的方法,可以满足不同项目的不同需求

* */

package score;

import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.RangeQuery;

import org.apache.lucene.search.Sort;

import org.apache.lucene.search.SortField;

public class SortFieldTest {

public SortFieldTest(String INDEX_STORE_PATH){

try{

IndexWriter writer = new IndexWriter(INDEX_STORE_PATH, new StandardAnalyzer(), true);

writer.setUseCompoundFile(false);

//首先定义文本

Document doc1 = new Document();

Field f1 = new Field("bookNumber", "0000001", Field.Store.YES, Field.Index.UN_TOKENIZED);

Field f2 = new Field("bookname", "钢铁是怎样炼成的", Field.Store.YES, Field.Index.TOKENIZED);

Field f3 = new Field("publishdate", "1970-01-01", Field.Store.YES, Field.Index.UN_TOKENIZED);

doc1.add(f1);

doc1.add(f2);

doc1.add(f3);

Document doc2 = new Document();

f1 = new Field("bookNumber", "0000002", Field.Store.YES, Field.Index.UN_TOKENIZED);

f2 = new Field("bookname", "钢铁战士", Field.Store.YES, Field.Index.TOKENIZED);

f3 = new Field("publishdate", "1980-01-01", Field.Store.YES, Field.Index.UN_TOKENIZED);

doc2.add(f1);

doc2.add(f2);

doc2.add(f3);

Document doc3 = new Document();

f1 = new Field("bookNumber", "0000003", Field.Store.YES, Field.Index.UN_TOKENIZED);

f2 = new Field("bookname", "篱笆女人和狗", Field.Store.YES, Field.Index.TOKENIZED);

f3 = new Field("publishdate", "1990-01-01", Field.Store.YES, Field.Index.UN_TOKENIZED);

doc3.add(f1);

doc3.add(f2);

doc3.add(f3);

Document doc4 = new Document();

f1 = new Field("bookNumber", "0000004", Field.Store.YES, Field.Index.UN_TOKENIZED);

f2 = new Field("bookname", "女人是水做的", Field.Store.YES, Field.Index.TOKENIZED);

f3 = new Field("publishdate", "1999-01-01", Field.Store.YES, Field.Index.UN_TOKENIZED);

doc4.add(f1);

doc4.add(f2);

doc4.add(f3);

Document doc5 = new Document();

f1 = new Field("bookNumber", "0000005", Field.Store.YES, Field.Index.UN_TOKENIZED);

f2 = new Field("bookname", "英雄儿女", Field.Store.YES, Field.Index.TOKENIZED);

f3 = new Field("publishdate", "2002-01-01", Field.Store.YES, Field.Index.UN_TOKENIZED);

doc5.add(f1);

doc5.add(f2);

doc5.add(f3);

Document doc6 = new Document();

f1 = new Field("bookNumber", "0000006", Field.Store.YES, Field.Index.UN_TOKENIZED);

f2 = new Field("bookname", "白毛女", Field.Store.YES, Field.Index.TOKENIZED);

f3 = new Field("publishdate", "1985-01-01", Field.Store.YES, Field.Index.UN_TOKENIZED);

doc6.add(f1);

doc6.add(f2);

doc6.add(f3);

Document doc7 = new Document();

f1 = new Field("bookNumber", "0000007", Field.Store.YES, Field.Index.UN_TOKENIZED);

f2 = new Field("bookname", "我的兄弟和女儿", Field.Store.YES, Field.Index.TOKENIZED);

f3 = new Field("publishdate", "1978-01-01", Field.Store.YES, Field.Index.UN_TOKENIZED);

doc7.add(f1);

doc7.add(f2);

doc7.add(f3);

//将书信息加入索引

writer.addDocument(doc1);

writer.addDocument(doc2);

writer.addDocument(doc3);

writer.addDocument(doc4);

writer.addDocument(doc5);

writer.addDocument(doc6);

writer.addDocument(doc7);

writer.close();

//构建一个查询

IndexSearcher searcher = new IndexSearcher(INDEX_STORE_PATH);

Term begin = new Term("publishdate", "1950-01-01");

Term end = new Term("publishdate", "2002-01-01");

RangeQuery rq = new RangeQuery(begin, end, false);

//构建两个SortField

Sort sort = new Sort();

//按照publishdate排序,降序

SortField sf1 = new SortField("publishdate", SortField.STRING, true);

//按bookNumber排序,升序

SortField sf2 = new SortField("bookname", SortField.INT, false);

//先按照publishdate排,在按照bookNumber排

sort.setSort(new SortField[]{sf1, sf2});

Hits hits = searcher.search(rq, sort);

for(int i = 0; i < hits.length(); i++){

Document doc = hits.doc(i);

System.out.print("书名 :");

System.out.println(doc.get("bookname"));

System.out.print("得分 :");

System.out.println(hits.score(i));

System.out.print("内部ID :");

System.out.println(hits.id(i));

System.out.print("书号 : ");

System.out.println(doc.get("bookNumber"));

System.out.print("发行日期 : ");

System.out.println(doc.get("publishdate"));

System.out.println("===========================");

}

}catch(IOException e){

e.printStackTrace();

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

SortFieldTest sft = new SortFieldTest("E:\\Lucene项目\\索引文件");

}

}

时间: 2024-08-07 17:47:24

Lucene使用SortField对多个字段进行排序的相关文章

Lucene系列:(9)搜索结果排序

1.什么是搜索结果排序 搜索结果是按某个或某些字段高低排序来显示的结果 2.影响网站排名的多种因素 head/meta/ 网页的标签整洁 网页执行速度 采用div+css ...... 3.Lucene中的显示结果次序与相关度得分有关     ScoreDoc.score; 默认情况下,Lucene是按相关度得分排序的,得分高排在前,得分低排在后 如果相关度得分相同,按插入索引库的先后次序排序 4.Lucene中的手工设置相关度得分 IndexWriter indexWriter = new I

Oracle 如何对中文字段进行排序

Oracle 中对中文字段进行排序通常有三种方式 1)按笔画排序 select * from Table order by nlssort(columnName,'NLS_SORT=SCHINESE_STROKE_M') 2)按部首排序 select * from Table order by nlssort(columnName,'NLS_SORT=SCHINESE_RADICAL_M') 3)按拼音排序 select * from Table order by nlssort(columnN

对Java的Map的Value字段进行排序

构造TreeMap可以指定Comparator,但是不能对value字段进行排序.如果有需求对Value字段排序,例如map存放的是单词,单词出现次数,怎么按单词次数排序呢? 可以先将map中的key-value放入list,然后用Collections.sort对list排序,再将排序后的list放入LinkedHashMap,最后返回LinkedHashMap就可以了.LinkedHashMap可是个宝贝,可以通过构造方法制定是按放入的顺序,还是get顺序 排序.LinkedHashMap,

SQL按照指定顺序对字段进行排序

SqlServer按照指定顺序对字段进行排序 问题如下,在SqlServer有一个这样的SQL查询 SELECT *FROM ProductWHERE ID IN ( 12490, 12494, 12486 ) 在一个名为Product的表中对自增字段ID做in查询,他希望查出来的记录ID字段按照12490,12494,12486这个顺序来排,但是很不幸的是查出来后的记录是按照ID的进行正排序 这并不符合他的要求.     查出的结果如下: 由于对SQL实在是不熟悉,于是我查了点资料,发现可以用

Oracle中中文、数字,英文混杂形式的字段进行排序的方法

http://blog.csdn.net/p451933505/article/details/9272257 对Oracle中中文.数字.英文混杂形式的字段进行排序的方法: 例如: order by NLSSORT(字段名,'NLS_SORT = SCHINESE_PINYIN_M'), to_number(translate(字段名, '0123456789' || 字段名, '0123456789')) NLSSORT() 函数: 可以使用NLSSORT()函数可以改变Oralce 对汉字

Java中对单个或多个字段进行排序

Java中对单个字段或多个字段进行排序 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * @date: 2015年6月19日 上午10:11:44 */ public class CollectionTest { /** * 主方法 * * @param args * 参数 * @modify by user: {修

SQLServer 2008 R2 对同时含有数字和中文的字段进行排序

若是数据库中的某一个字段名为bedNO,类型为nvchar,里面有{1,2,3,11,12,23,加2,加3}这些数据. 此时我需要对这些数据进行排序,数字按大小拍前面,汉字按第一个字拼音首字母的顺序排后面,即需要1,2,3,11,12,23,加2,加3这样的结果. 通常用order by bedNO排序的话,得到的结果是:1,11,12,2,23,3,加2,加3,无法得到需要的顺序. 若是用order by cast(bedNO as int),则加2和加3这样的数据会报错,因为无法转换成in

SQL char字段类型排序

我是做的ACCESS时候需要对字段的值进行排序,字段格式是char类型的,但是存的值是数字.现在需要对该字段进行排序. 通过查找,找到以下两种方法,记录下来. 1. 你可以转换成int型再排序 select * from JZD order by convert(int,id) desc 但是这种方法在ACCESS里不好用,因为没有convert函数. 所以最终利用的是第2钟方法 2.你可以在前面补零,然后截取同样长度再排序 select * from JZD order by right('0

php根据某一数组字段进行排序

$array = array( 0 => array( 'id' => 1, 'name' => 1, 'ord' => 1, ), 1 => array( 'id' => 3, 'name' => 3, 'ord' => 3, ), 2 => array( 'id' => 2, 'name' => 2, 'ord' => 2, ), ); $ords = array(); //提取排序字段 foreach($array as $v1