`

lucene 排序,过滤,高亮显示

 
阅读更多

 

package com.nanjing.chaoxing.lucene;

import com.nanjing.chaoxing.lucene.model.Book;
import com.nanjing.chaoxing.lucene.model.BookUtil;
import org.apache.log4j.Logger;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.search.highlight.*;
import org.apache.lucene.search.highlight.Scorer;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.BeforeClass;
import org.junit.Test;

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

public class SortAndFilterAndHighligher {
    private Logger logger = Logger.getLogger(SortAndFilterAndHighligher.class);

    @BeforeClass
    public static void init() throws IOException {
        BookUtil bookUtil = new BookUtil();
        bookUtil.createIndexWriter();
        bookUtil.createDocument();
    }

    /**
     * 排序并过滤
     * @throws IOException
     * @throws ParseException
     */
    @Test
    public void sort() throws IOException, ParseException {
        IndexReader indexReader = IndexReader.open(FSDirectory.open(BookUtil.indexFile));
        Query query = new QueryParser(Version.LUCENE_36, "bookid", new StandardAnalyzer(Version.LUCENE_36)).parse("6270000~");
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        //数字过滤器
        NumericRangeFilter numericRangeFilter = NumericRangeFilter.newIntRange("year", 2010, 2012, true, true);
        //排序
        SortField sortField = new SortField("bookid", SortField.STRING);

        logger.info("sort" + " begin....");
        TopDocs topDocs = indexSearcher.search(query, numericRangeFilter, 1000, new Sort(sortField));
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (int i = 0; i < scoreDocs.length; i++) {
            ScoreDoc scoreDoc = scoreDocs[i];
            int doc = scoreDoc.doc;
            for (Book book : BookUtil.bookList) {
                if (indexSearcher.doc(doc).get("bookid").equals(book.getBookid())) {
                    logger.info(book.toString());
                }
            }
        }
        logger.info("sort" + " end....\n");
    }


    /**
     * 高亮显示
     *
     * @throws ParseException
     * @throws IOException
     */
//    @Test
    public void highligher() throws ParseException, IOException, InvalidTokenOffsetsException {
        List<Book> books = new ArrayList<Book>();
        IndexReader indexReader = IndexReader.open(FSDirectory.open(BookUtil.indexFile));
        Query query = new QueryParser(Version.LUCENE_36, "author", new StandardAnalyzer(Version.LUCENE_36)).parse("jam~");
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");
        Scorer scorer = new QueryScorer(query);
        Highlighter highlighter = new Highlighter(simpleHTMLFormatter, scorer);
        Fragmenter fragmenter = new SimpleFragmenter(100);
        highlighter.setTextFragmenter(fragmenter);

        TopDocs topDocs = indexSearcher.search(query, 1000);
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        System.out.println("高亮显示:");
        for (int i = 0; i < scoreDocs.length; i++) {
            int docid = scoreDocs[i].doc;
            float score = scoreDocs[i].score;//当前结果的相关度得分
            System.out.println("score is : " + score);
            Document doc = indexSearcher.doc(docid);
            String author = doc.get("author");
            String highterBooid = highlighter.getBestFragment(new StandardAnalyzer(Version.LUCENE_36), "author", author);
            for (Book book : BookUtil.bookList) {
                if (book.getBookid().equals(doc.get("bookid"))) {
                    book.setAuthor(highterBooid);
                    System.out.println(book.toString());
                }
            }
        }

    }
}
分享到:
评论

相关推荐

    lucene 多字段查询+文字高亮显示

    本话题聚焦于“Lucene多字段查询”和“文字高亮显示”,这两个特性在信息检索和数据挖掘中具有广泛应用。 首先,让我们深入理解“Lucene多字段查询”。在信息检索系统中,用户可能希望根据多个字段来过滤和排序结果...

    Lucene5学习之Filter过滤器

    例如,我们可以先使用Filter筛选出满足条件的文档,再根据某个字段进行排序,最后对高亮显示匹配的关键词。 值得注意的是,尽管Filter可以显著提高性能,但过度使用或设计不当可能会导致内存消耗增加,因此在使用...

    lucene 4.7.2 Demo

    本文将深入探讨Lucene 4.7.2的特性,包括创建、删除和修改索引,以及高级搜索功能如通用对象搜索、范围搜索、排序和高亮显示。 首先,让我们了解如何利用Lucene 4.7.2创建索引。创建索引是全文检索的基础,它涉及将...

    Lucene.Net_2_9_1 含高亮等包完整版

    使用高亮器,我们可以突出显示搜索查询中的关键字,使其在文档内容中更加醒目。通常,这涉及到将原始文本分词,找到匹配的搜索词,然后用特定的格式(如不同的颜色或样式)替换这些关键词。在Lucene.Net 2.9.1中,这...

    Lucene测试程序3.5

    此外,还可能涉及到评分策略、排序和高亮显示等高级特性,这些都是提升用户体验的重要部分。 总之,"Lucene测试程序3.5"为我们提供了一个深入理解Lucene如何处理全文搜索问题的实例。通过创建索引、使用标准分词器...

    Lucene3.5源码jar包

    5. **内存缓存与过滤器**:Lucene提供`Filter`类来处理如文档过滤、高亮显示等功能。同时,`BitSet`类用于在内存中高效地存储和操作文档集。 6. **倒排索引的优化**:在`MergePolicy`和`MergeScheduler`中,你可以...

    lucene的jar包,欢迎下载

    5. **过滤与高亮**:Lucene还支持对搜索结果进行过滤(如按时间、类别筛选),以及对匹配的查询词在文档中进行高亮显示。 6. **更新与删除**:索引不是静态的,可以添加、更新和删除文档,以反映源数据的变化。 7....

    Lucene In Action 2源码

    源码文件通常包含了书中各个章节的示例程序,这些示例涵盖了Lucene的基本用法到高级特性的实现,如文档索引、搜索查询、结果排序、过滤器、分词器、高亮显示等。通过研究这些源码,开发者可以了解如何有效地利用...

    lucene-2.9.4

    Lucene最初由Doug Cutting创建,它是一个高性能、全文本搜索的Java库,为开发者提供了构建搜索引擎所需的各种组件,如索引、查询解析、排序和高亮显示等。Lucene 2.9.4是其历史上的一个重要版本,具有稳定性和兼容...

    Lucene in Action 2nd Edition

    7. **高亮显示**:介绍如何在搜索结果中高亮显示匹配的关键词,提升用户体验。 8. **排序与过滤**:讨论如何根据不同的标准(如相关性、时间戳等)对搜索结果进行排序,以及如何实现过滤器来限制搜索范围。 9. **...

    Lucene实战(中文版第二版)对应Lucene版本

    同时,`Highlighter`类用于对搜索结果中的匹配片段进行高亮显示,提升用户体验。 6. **多字段搜索**:在3.0.3版本中,你可以学习如何对多个字段进行联合搜索,以及如何设置字段的权重来影响搜索结果。 7. **更新与...

    lucene实现全文搜索

    此外,Lucene还支持高亮显示搜索结果中的关键词,使用户更容易识别相关性高的部分。 【总结】 Lucene是一个强大的全文搜索引擎库,它简化了从数据提取、索引创建到查询执行的整个过程。通过理解并熟练运用Document...

    Lucene实战 第二版 完整清晰中文版

    LuceneinAction作为Lucene最权威的指南,提供了搜索、排序、过滤以及高亮显示搜索结果的详细说明。该书不仅提供了源码示例的实用性和可重用性,还着重介绍了如何将搜索功能集成到自己的应用程序中。Lucene的实例应用...

    Lucene.Net.dll

    3. **高亮显示**:Lucene能够对搜索结果中的匹配关键词进行高亮,提升用户体验。 4. **排序与评分**:除了返回匹配的文档,Lucene还能根据相关性对结果进行排序,使用TF-IDF等算法计算每个文档的得分。 5. **多...

    lucene相关十几个包

    9. **lucene-highlighter-4.6.0.jar**:高亮显示库,用于在搜索结果中突出显示匹配的关键词,使用户更容易找到相关部分。 10. **lucene-analyzers-icu-5.3.0.jar**:基于Unicode的International Components for ...

    Lucene 3.6 学习笔记

    - 多个域的高亮显示。 #### 6.4 近实时搜索 - 实现近实时搜索机制,提供更快的搜索响应。 - 创建和使用近实时索引。 以上就是Lucene 3.6的学习笔记,涵盖了从基础到高级的各种搜索和索引操作,以及相关的分词和...

    lucene-4.6.1官方文档

    Lucene 提供了Highlighter组件,可以在搜索结果中高亮显示匹配的关键词,提升用户体验。4.6.1版文档会指导如何配置和使用Highlighter,以优雅地展示搜索结果。 5. **多字段与多语言支持**: Lucene 支持在一个...

    lucene3.6.2 jar包

    3. **lucene-highlighter-3.6.2.jar**:高亮显示是Lucene3.6.2中的一项重要特性,这个库提供了高亮搜索结果的功能。当用户进行搜索时,系统可以自动识别出查询中的相关片段,并在展示结果时对其进行突出显示,提高...

    lucene3.4 jar

    3. **Lucene Highlighter 3.4.0**: `lucene-highlighter-3.4.0.jar`是高亮显示模块,用于在搜索结果中突出显示与查询匹配的部分。在实际应用中,用户通常希望看到搜索关键词在文档中的确切位置,高亮显示能够帮助...

    Lucene初探,一个初级的LuceneDemo

    实际开发中,你可能需要处理更复杂的需求,如多字段搜索、排序、高亮显示等。Lucene提供了一系列高级功能,如`BooleanQuery`、`PhraseQuery`、`WildcardQuery`等,可以根据需求灵活使用。 通过学习和实践这个Lucene...

Global site tag (gtag.js) - Google Analytics