`

lucene之sort

阅读更多
package cn.zqh.lucene.sort;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.NumberTools;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.RangeFilter;
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.highlight.Formatter;
import org.apache.lucene.search.highlight.Fragmenter;
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.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;

import cn.zqh.lucene.highlight.QueryResult;

/**
zqh
*/
public class TestSort {
String indexPath ="D:\\p\\luceneDemo\\luceneIndex";
Analyzer analyzer = new StandardAnalyzer();

//相关度排序
public QueryResult search(String queryString,int firstResult,int maxResult) throws ParseException, IOException{
        IndexSearcher indexSearcher = null;
      
      
        //方法1.在搜索的时候指定Field的相关值        方法2.创建索引时指定Document的相关值 doc.setBoost();
   String[] fields={"name","content"};
   Map<String,Float> boots = new HashMap<String,Float>();
   boots.put("name", 3f);//boots.put("name", 1f);默认
   QueryParser queryParser = new MultiFieldQueryParser(fields,analyzer,boots);
   Query query =queryParser.parse(queryString);
 
 
   //2、进行查询
     indexSearcher = new IndexSearcher(indexPath);
   Filter filter = null;
   TopDocs top =indexSearcher.search(query, filter, 10000);
 
     int recordCount = top.totalHits;
     List<Document> recordList = new ArrayList<Document>();
   
     //准备高亮
     Formatter formatter = new SimpleHTMLFormatter("<font color='red'>","</font>");
     Scorer scorer = new QueryScorer(query);
     Highlighter hg = new Highlighter(formatter,scorer);
     Fragmenter fragmenter = new SimpleFragmenter(50);
     hg.setTextFragmenter(fragmenter);
   
   
   
     //3取出当前页的数据
     int end = Math.min(firstResult+maxResult,top.totalHits);
     for(int i=firstResult;i< end;i++){
     ScoreDoc scoreDoc =top.scoreDocs[i];
     int docSn =scoreDoc.doc;
     Document doc = indexSearcher.doc(docSn);
   
     //返回高亮后的结果,如果当前属性值中没有出现关键字,会返回null
     String hc =hg.getBestFragment(analyzer,"content",doc.get("content"));
   
     if(hc ==null){
        String content =doc.get("content");
        int endIndex = Math.min(50,content.length());
        hc = content.substring(0,50);
     }
     doc.getField("content").setValue(hc);
   
     recordList.add(doc);
     }
     //返回结果
     return new QueryResult(recordCount,recordList);
     //indexSearcher.close();
}

//自定义排序
public QueryResult search(Query query,int firstResult,int maxResult) throws ParseException, IOException{
        IndexSearcher indexSearcher = null;
 
     indexSearcher = new IndexSearcher(indexPath);
   
     //使用过滤器
   Filter filter = new RangeFilter("size", NumberTools.longToString(200), NumberTools.longToString(500), true, true);
 
   //自定义排序
   Sort sort = new Sort();
   sort.setSort(new SortField("size"));//默认升序
   TopDocs top =indexSearcher.search(query, filter, 10000);
 
     int recordCount = top.totalHits;
     List<Document> recordList = new ArrayList<Document>();
   
     //准备高亮
     Formatter formatter = new SimpleHTMLFormatter("<font color='red'>","</font>");
     Scorer scorer = new QueryScorer(query);
     Highlighter hg = new Highlighter(formatter,scorer);
     Fragmenter fragmenter = new SimpleFragmenter(50);
     hg.setTextFragmenter(fragmenter);
   
   
   
     //3取出当前页的数据
     int end = Math.min(firstResult+maxResult,top.totalHits);
     for(int i=firstResult;i< end;i++){
     ScoreDoc scoreDoc =top.scoreDocs[i];
     int docSn =scoreDoc.doc;
     Document doc = indexSearcher.doc(docSn);
   
     //返回高亮后的结果,如果当前属性值中没有出现关键字,会返回null
     String hc =hg.getBestFragment(analyzer,"content",doc.get("content"));
   
     if(hc ==null){
        String content =doc.get("content");
        int endIndex = Math.min(50,content.length());
        hc = content.substring(0,50);
     }
     doc.getField("content").setValue(hc);
   
     recordList.add(doc);
     }
     //返回结果
     return new QueryResult(recordCount,recordList);
     //indexSearcher.close();
}
}
分享到:
评论

相关推荐

    Lucene5学习之排序-Sort

    “Lucene5学习之排序-Sort”这个标题表明了我们要探讨的是关于Apache Lucene 5版本中的排序功能。Lucene是一个高性能、全文检索库,它提供了强大的文本搜索能力。在这个主题中,我们将深入理解如何在Lucene 5中对...

    Lucene5学习之自定义排序

    本文将深入探讨“Lucene5学习之自定义排序”这一主题,帮助你理解如何在Lucene5中实现自定义的排序规则。 首先,Lucene的核心功能之一就是提供高效的全文检索能力,但默认的搜索结果排序通常是基于相关度得分...

    一步一步跟我学习lucene(12)---lucene搜索之分组处理group查询

    在"一步一步跟我学习lucene(12)---lucene搜索之分组处理group查询"中,我们将重点关注如何利用Lucene实现这一高级搜索功能。 首先,Lucene是一个开源全文搜索引擎库,它为Java开发者提供了构建高效、可扩展的搜索...

    Lucene3.3.0学习Demo

    - 结果排序的示例,可能包含如何自定义`Sort`对象以改变默认的排序方式。 通过这些Demo,你可以逐步理解Lucene的工作原理,学习如何在实际项目中集成和优化搜索功能。此外,3.3.0版本可能还涉及一些当时的特性,...

    Lucene实战

    除了基本的搜索外,Lucene还支持过滤器(Filter)和排序(Sort)功能。过滤器可以快速筛选满足特定条件的文档,而排序则允许用户自定义搜索结果的排列顺序。 8. **更新与删除** Lucene允许动态更新和删除文档,...

    Lucene5学习之Filter过滤器

    在实际应用中,Filter还可以与其他组件结合使用,如Sort(排序)和Highlight(高亮),以提供更丰富的搜索体验。例如,我们可以先使用Filter筛选出满足条件的文档,再根据某个字段进行排序,最后对高亮显示匹配的...

    lucene排序、设置权重、优化、分布式搜索.pdf

    Lucene 排序、设置权重、优化、分布式搜索 Lucene 是一个高性能的搜索引擎库,它提供了强大的文本搜索和索引能力。下面我们将详细介绍 Lucene 的排序、设置权重、优化和分布式搜索等知识点。 一、Lucene 排序 ...

    Lucene-2.0学习文档

    在Lucene中,`Sort`类用于控制搜索结果的排序方式,而`SortComparatorSource`是其内部组件,用于提供排序比较器。`MySortComparatorSource.java`可能是用户自定义的排序比较器源,它可以实现特定的排序逻辑,比如...

    lucene-2.3.0-src

    3. **搜索模块**:`Searcher`执行查询,`Scorer`计算相关性分数,`Sort`定义结果排序规则。 4. **存储模块**:`RAMDirectory`和`FSDirectory`提供内存和文件系统上的索引存储。 三、主要特性 1. **多线程支持**:...

    Lucene 常用功能介绍视频详解

    它们在Lucene之上提供了更高级的功能,如分布式搜索、集群管理、更多数据源支持等。 10. **优化与维护** Lucene提供了合并段(Merge)和优化索引(Optimize)的功能,以减少索引碎片,提高搜索性能。同时,定期...

    lucene自定义排序实现

    然后,你可以使用`FieldComparatorSource`将这个比较器与`TopFieldCollector`或`Sort`对象关联起来。 在提供的博客链接中,作者可能详细介绍了如何设置这些步骤,并可能给出了具体的代码示例。例如,他们可能会展示...

    lucene-4.9.1

    8. 排序(Sort):定义搜索结果的排序方式,可以基于评分、字段值等。 总之,Apache Lucene 4.9.1提供了强大的全文搜索功能,是构建高效搜索引擎的基础。通过深入理解其核心模块,开发者可以利用这个库构建出满足...

    lucene高级搜索进阶项目_04

    5. **过滤与排序**:除了返回最相关的搜索结果,我们还需要对结果进行过滤(例如,按日期或评分排序),这可以通过Filter和Sort类来实现。 6. ** faceted search(面式搜索)**:在大型信息集合中,提供分类浏览和...

    lucene排序.zip

    例如,我们可以创建一个`Sort`对象,指定其排序依据为关键词出现的次数,这样搜索结果就会按照关键词在文档中出现的次数从高到低排列。 接下来,我们要讨论的是如何实现自定义排序,这通常涉及到对查询结果的优先级...

    lucene-4.6.1官方文档

    同时,Sort类则支持对结果进行定制化的排序,包括基于评分、字段值或自定义比较器的排序。 4. **高亮显示**: Lucene 提供了Highlighter组件,可以在搜索结果中高亮显示匹配的关键词,提升用户体验。4.6.1版文档会...

    基于lucene的去词、禁词、搜索等操作

    用户可以通过Sort类定制排序规则,如按时间、相关性等排序。 4. 分页与结果限制:通过设置TopDocs和ScoreDoc对象,可以实现搜索结果的分页显示,同时限制返回的文档数量。 五、扩展与优化 1. 分布式搜索:随着...

    Lucene实现全文检索

    1. **索引(Indexing)**:Lucene的核心工作流程之一是创建索引。索引是一个结构化的数据存储,类似于图书馆的目录,能够快速定位到文档中的特定信息。通过分词(Tokenization)、词干提取(Stemming)和停用词过滤...

Global site tag (gtag.js) - Google Analytics