您的位置:首页 > 其它

6 Lucene笔记(六):检索结果排序问题

2016-10-13 11:56 363 查看
[align=left]packagech.lucene.app;[/align]
[align=left]
[/align]
[align=left]importjava.util.ArrayList;[/align]
[align=left]importjava.util.List;[/align]
[align=left]
[/align]
[align=left]importorg.apache.lucene.document.Document;[/align]
[align=left]importorg.apache.lucene.index.IndexWriter;[/align]
[align=left]importorg.apache.lucene.queryParser.QueryParser;[/align]
[align=left]importorg.apache.lucene.search.IndexSearcher;[/align]
[align=left]importorg.apache.lucene.search.Query;[/align]
[align=left]importorg.apache.lucene.search.ScoreDoc;[/align]
[align=left]importorg.apache.lucene.search.Sort;[/align]
[align=left]importorg.apache.lucene.search.SortField;[/align]
[align=left]importorg.apache.lucene.search.TopDocs;[/align]
[align=left]importorg.junit.Test;[/align]
[align=left]
[/align]
[align=left]importch.lucene.entity.Article;[/align]
[align=left]importch.lucene.utils.LuceneUtils;[/align]
[align=left]
[/align]
[align=left]/**[/align]
[align=left] * 排序问题[/align]
[align=left] *@authorJayin[/align]
[align=left] */[/align]
[align=left]publicclassSixApp {[/align]
[align=left]/**[/align]
[align=left] * 创建索引库[/align]
[align=left] *@throwsException[/align]
[align=left] */[/align]
[align=left]     @Test[/align]
     publicvoidcreateIndexDB()
throws
Exception {
          
//创建javabean 对象
          Articleart
=
newArticle(3,
"搜索排序问题"
, "搜索什么好呢,反正就随便咯,金木研说的。"
);
          
/*Article art1 = new Article(2, "搜索排序问题", "搜索什么好呢,反正就随便咯,金木研说的。。");
[align=left]          Article art2 = new Article(4, "搜索问题", "搜索什么好呢金木研说的。。");[/align]
[align=left]          Article art3 = new Article(1, "搜索问题", "反正就随便咯,金木研说的。");*/          [/align]
          
//创建document对象,并将 javabean对象转换为document对象
          Documentdoc
= LuceneUtils.javaBeanToDocument(art);
          
//创建IndexWrite对象
          IndexWriteriw
=
newIndexWriter(LuceneUtils.getDirectory(), LuceneUtils.getAnalyzer(), LuceneUtils.getMaxFieldLength());
          
//将doc写入到索引库中
          
iw.addDocument(
doc);
          
//关闭
          
iw.close();
[align=left]     }[/align]
[align=left]     /**[/align]
[align=left]      * 根据关键字搜索[/align]
[align=left]      *@throwsException[/align]
[align=left]      */[/align]
[align=left]     @Test[/align]
     publicvoidfindByKeyword()
throws
Exception {
          
//关键字
          Stringkeyword
=
"金木";
          
//创建数组
          List<Article>artList
=
newArrayList<Article>();
          
//创建IndexSearcher字符流对象
          IndexSearcherindexSearcher
=
newIndexSearcher(LuceneUtils.getDirectory());
          
//创建解析器
          QueryParserqueryParser
=
newQueryParser(LuceneUtils.getVersion(),"content", LuceneUtils.getAnalyzer());
          
//封装关键字
          Queryquery
=
queryParser.parse(keyword);
          
//根据关键字,去索引库中的词汇表搜索
          
//TopDocs topDocs = indexSearcher.search(query, 100);          
          
//按得分度高低排序
[align=left]                   //TopDocs topDocs = indexSearcher.search(query,100);      [/align]
[align=left]                   //创建排序对象[/align]
[align=left]                   //参数一:id表示依据document对象中的哪个字段排序,例如:id[/align]
[align=left]                   //参数二:SortField.INT表示document对象中该字段的类型,以常量方式书写[/align]
[align=left]                   //参数三:true表示降序,类似于order by iddesc[/align]
[align=left]                   //参数三:false表示升序,类似于order by idasc[/align]
[align=left]                   //Sort sort = new Sort(new SortField("id",SortField.INT,false));[/align]
[align=left]                   [/align]
[align=left]                   //按count字段的降序排列,如果count字段相同的话,再按id的升序排序[/align]
                   Sortsort
=
newSort(
                             new
SortField("count",SortField.INT,true),
                             new
SortField("id",SortField.INT,false));
[align=left]                   [/align]
[align=left]                   //sort表示排序的条件[/align]
                   TopDocstopDocs
=
indexSearcher.search(query,null,100,sort);
[align=left]          [/align]
          
for(
int
i = 0 ;
i<
topDocs.
scoreDocs.
length;
i++){
[align=left]              //获取对象[/align]
              ScoreDocscoreDoc
=
topDocs.scoreDocs[i];
[align=left]              //获取编号[/align]
              int
no
= scoreDoc.
doc;
[align=left]              //获取属性的值[/align]
              Documentdoc
=
indexSearcher.doc(no);
              //document转换成
javabean
              Articleart
= (Article) LuceneUtils.documentToJavaBean(doc, Article.class);
[align=left]              //将art添加到数组集合中[/align]
[align=left]              artList.add(art);[/align]
              for(Articlearticle
:
artList){
[align=left]                   System.out.println(article);[/align]
              }
aea4
              
[align=left]          }[/align]
[align=left]     }[/align]
[align=left]}[/align]

单字段排序:

Sort
sort =
new Sort(newSortField("id",SortField.INT,true));
TopDocs topDocs =
indexSearcher
.search( query,null,1000000,sort);

多字段排序:

Sort sort =
new Sort(new
SortField("count",SortField.INT,true),new
SortField("id",SortField.INT,false));

单字段搜索:

QueryParser
queryParser =
new QueryParser(LuceneUtils.getVersion(),"content", LuceneUtils.getAnalyzer());

多字段搜索:(推荐)

QueryParser
queryParser =
new MultiFieldQueryParser(LuceneUtils.getVersion(),new
String[]{"centent","title"},
LuceneUtils.getAnalyzer ());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: