搜索结果排序

3,排序
默认是相关度排序。
也可以按指定的字段排序。

  1 package cn.itcast.g_sort;
  2
  3 import java.util.ArrayList;
  4 import java.util.List;
  5
  6 import org.apache.lucene.document.Document;
  7 import org.apache.lucene.document.Field;
  8 import org.apache.lucene.document.Field.Index;
  9 import org.apache.lucene.document.Field.Store;
 10 import org.apache.lucene.index.IndexWriter;
 11 import org.apache.lucene.index.IndexWriter.MaxFieldLength;
 12 import org.apache.lucene.queryParser.MultiFieldQueryParser;
 13 import org.apache.lucene.queryParser.QueryParser;
 14 import org.apache.lucene.search.IndexSearcher;
 15 import org.apache.lucene.search.Query;
 16 import org.apache.lucene.search.Sort;
 17 import org.apache.lucene.search.SortField;
 18 import org.apache.lucene.search.TopDocs;
 19 import org.apache.lucene.search.highlight.Formatter;
 20 import org.apache.lucene.search.highlight.Highlighter;
 21 import org.apache.lucene.search.highlight.QueryScorer;
 22 import org.apache.lucene.search.highlight.Scorer;
 23 import org.apache.lucene.search.highlight.SimpleFragmenter;
 24 import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
 25 import org.apache.lucene.util.Version;
 26 import org.junit.Test;
 27
 28 import cn.itcast._domain.Article;
 29 import cn.itcast._util.ArticleDocumentUtils;
 30 import cn.itcast._util.LuceneUtils;
 31
 32 public class TestApp {
 33
 34     // 建立索引
 35     @Test
 36     public void testCreateIndex() throws Exception {
 37         // 准备数据
 38         Article article = new Article();
 39         article.setId(30);
 40         article.setTitle("准备Lucene的开发环境");
 41         article.setContent("如果信息检索系统在用户发出了检索请求后再去互联网上找答案,根本无法在有限的时间内返回结果。");
 42
 43         // 放到索引库中
 44         // 1, 把Article转为Document
 45         Document doc = ArticleDocumentUtils.articleToDocument(article);
 46
 47         doc.setBoost(0.5F); // 1F表示正常得分,大于1表示高分,小于1表示低分
 48
 49         // 2, 把Document放到索引库中
 50         LuceneUtils.getIndexWriter().addDocument(doc);
 51         LuceneUtils.getIndexWriter().commit();
 52     }
 53
 54     // 搜索
 55     @Test
 56     public void testSearch() throws Exception {
 57         // 准备查询条件
 58         String queryString = "lucene";
 59
 60         // 执行搜索
 61         List<Article> list = new ArrayList<Article>();
 62
 63         // 1,把查询字符串转为Query对象(从title和content中查询)
 64         QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, new String[] { "title", "content" }, LuceneUtils.getAnalyzer());
 65         Query query = queryParser.parse(queryString);
 66
 67         // 2,执行查询,得到中间结果
 68         IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.getDirectory()); // 指定所用的索引库
 69         // TopDocs topDocs = indexSearcher.search(query, 100); // 最多返回前n条结果
 70
 71         // ========================================================================================== 【创建高亮器】
 72         // indexSearcher.search(query, n);
 73         // indexSearcher.search(query, filter, n);
 74         // indexSearcher.search(query, filter, n, sort);
 75
 76         // Sort sort = new Sort( new SortField("id", SortField.INT) ); // 按id升序排列
 77         Sort sort = new Sort(new SortField("id", SortField.INT, true)); // 按id降序排列(true表示降序,false表示升序)
 78
 79         TopDocs topDocs = indexSearcher.search(query, null, 100, sort);
 80
 81         // ==========================================================================================
 82
 83         // 3,处理结果
 84         for (int i = 0; i < topDocs.scoreDocs.length; i++) {
 85             float score = topDocs.scoreDocs[i].score;
 86             System.out.println("---> score : " + score);
 87
 88             // 根据编号拿到Document数据
 89             int docId = topDocs.scoreDocs[i].doc; // Document的内部编号
 90             Document doc = indexSearcher.doc(docId);
 91             // 把Document转为Article
 92             Article article = ArticleDocumentUtils.documentToArticle(doc);
 93             list.add(article);
 94         }
 95         indexSearcher.close();
 96
 97         // 显示结果
 98         System.out.println("总结果数:" + list.size());
 99         for (Article a : list) {
100             System.out.println("------------------------------");
101             System.out.println("id = " + a.getId());
102             System.out.println("title = " + a.getTitle());
103             System.out.println("content = " + a.getContent());
104         }
105     }
106 }

搜索结果排序,布布扣,bubuko.com

时间: 2024-10-10 21:03:29

搜索结果排序的相关文章

07.everything的搜索历史按照搜索时间排序

需求:everything的搜索历史按照搜索时间排序;(现在是按搜索次数排序的) "Sun Jun 23, 2013 8:14 am"的时候作者就说: Sorting search history by last search date in Everything is on my Things to do list. 但是看了更新日志,翻了菜单,并没有找到相关设置; www.voidtools.com ? View topic - When does Everything saves

电商网站搜索结果排序控制

大家都有在淘宝京东输入一个关键字搜索商品的经历.有没有想过这些搜索结果是按什么顺序排列的呢?最直观的想法是最匹配关键字的会排到最前面.可是"最匹配关键字"怎么定义呢?真的是最匹配的排到最前面吗?如果你是商家,你可不可以控制搜索结果的排序呢?当然可以,如果你是商家,你可以操控搜索结果的排序.怎么操控呢?每个平台对搜索结果排序控制提供的解决方案可能不同.本文简述ATG提供的操作搜索结果排序的解决方案. ATG: 被Oracle收购的一个电商平台. 在这个平台,商家可以通过以下几种方式影响搜

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

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

SQL 可搜索 可排序 可分页存储过程 适用于sql 2008以上

-- ============================================= -- Author: 蜘蛛王 -- Create date: 2015-10-29 -- Description: 可搜索 可排序 可分页存储过程 适用于sql2008以上 -- (非常重要,请认真使用) -- ============================================= create PROCEDURE dbo.list ( @table varchar(1000),

go语言笔记——切片函数常见操作,增删改查和搜索、排序

7.6.6 搜索及排序切片和数组 标准库提供了 sort 包来实现常见的搜索和排序操作.您可以使用 sort 包中的函数 func Ints(a []int) 来实现对 int 类型的切片排序.例如 sort.Ints(arri),其中变量 arri 就是需要被升序排序的数组或切片.为了检查某个数组是否已经被排序,可以通过函数 IntsAreSorted(a []int) bool 来检查,如果返回 true 则表示已经被排序. 类似的,可以使用函数 func Float64s(a []floa

63. 搜索旋转排序数组 II

跟进"搜索旋转排序数组",假如有重复元素又将如何? 是否会影响运行时间复杂度? 如何影响? 为何会影响? 写出一个函数判断给定的目标值是否出现在数组中. 样例 给出[3,4,4,5,7,0,1,2]和target=4,返回 true 发现lintcode有一点不好就是这种O(n)的解法也能给过 1 bool search(vector<int> &A, int target) { 2 // write your code here 3 vector<int&g

多线程搜索与排序

前言:多线程搜索数组和排序在实际开发中是一个很常见的场景,我们可能会通过数组保存一些业务数据,通过搜索达到自己想要的数据或者对数据按照一定的业务规则排序,而在技术选择上一般最常见的技术就是for循环遍历和各种排序算法,这种搜索/排序技术很简单,而我们今天将要探讨的是通过多线程搜索和排序,如何利用多线程的优势去高效的完成搜索和排序是本篇博客聚焦的重点 本篇博客目录 一:多线程搜索 二:所线程排序 三:总结 一:多线程搜索 1.1:创建线程池      为了提升多线程的性能,我们把线程放在线程池集中

[leetcode] 33. 搜索旋转排序数组(Java)

33. 搜索旋转排序数组 说实话这题我连题都没有看懂....真是醉了 二分,没意思,直接交了- - https://www.jiuzhang.com/solutions/search-in-rotated-sorted-array/#tag-other 原文地址:https://www.cnblogs.com/acbingo/p/9302337.html

LeetCode 81——搜索旋转排序数组 II

1. 题目 2. 解答 2.1. 方法一 基于 LeetCode 33--搜索旋转排序数组 中的方法二. 当 nums[mid] = nums[right] 时,比如 [1, 1, 2, 1, 1],[1, 1, 0, 1, 1],为了找到正确的转折点,我们查看 [mid, right] 之间有没有不等于 nums[mid] 的值,若有,则继续向右查找:否则向左查找. class Solution { public: int Binary_Search(vector<int>& num