`

Lucene中文分词和高亮显示

阅读更多
1. 中文分词

2. 高亮显示

New maven project ->
Create a simple project ->
    Group Id: com.andrew.lucene
    Artifact Id: Lucene05
    Version: 0.0.1-SNAPSHOT
    Packaging: jar


pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.andrew.lucene</groupId>
  <artifactId>Lucene05</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
      <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-core</artifactId>
        <version>5.3.1</version>
    </dependency>
    <dependency>
    <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-queryparser</artifactId>
        <version>5.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-analyzers-common</artifactId>
        <version>5.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-analyzers-smartcn</artifactId>
        <version>5.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-highlighter</artifactId>
        <version>5.3.1</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
  </dependencies>
</project>


Indexer.java代码

package com.andrew.lucene;

import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.IntField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class Indexer {
    private Integer ids[] = { 1, 2, 3 };
    private String citys[] = { "青岛", "南京", "上海" };
    private String descs[] = { "青岛是一个美丽的城市。",
            "南京是一个有文化的城市。南京是一个文化的城市南京,简称宁,是江苏省会,地处中国东部地区,长江下游,濒江近海。全市下辖11个区,总面积6597平方公里,2013年建成区面积752.83平方公里,常住人口818.78万,其中城镇人口659.1万人。[1-4] “江南佳丽地,金陵帝王州”,南京拥有着6000多年文明史、近2600年建城史和近500年的建都史,是中国四大古都之一,有“六朝古都”、“十朝都会”之称,是中华文明的重要发祥地,历史上曾数次庇佑华夏之正朔,长期是中国南方的政治、经济、文化中心,拥有厚重的文化底蕴和丰富的历史遗存。[5-7] 南京是国家重要的科教中心,自古以来就是一座崇文重教的城市,有“天下文枢”、“东南第一学”的美誉。截至2013年,南京有高等院校75所,其中211高校8所,仅次于北京上海;国家重点实验室25所、国家重点学科169个、两院院士83人,均居中国第三。[8-10] 。",
            "上海是一个繁华的城市。" };
    private Directory dir;
    // 获取IndexWriter实例
    private IndexWriter getWriter() throws Exception {
        // Analyzer analyzer=new StandardAnalyzer(); // 标准分词器
        SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();
        IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
        IndexWriter writer = new IndexWriter(dir, iwc);
        return writer;
    }
    // 生成索引
    private void index(String indexDir) throws Exception {
        dir = FSDirectory.open(Paths.get(indexDir));
        IndexWriter writer = getWriter();
        for (int i = 0; i < ids.length; i++) {
            Document doc = new Document();
            doc.add(new IntField("id", ids[i], Field.Store.YES));
            doc.add(new StringField("city", citys[i], Field.Store.YES));
            doc.add(new TextField("desc", descs[i], Field.Store.YES));
            writer.addDocument(doc); // 添加文档
        }
        writer.close();
    }
    public static void main(String[] args) throws Exception {
        new Indexer().index("E:\\lucene6");
    }
}


Searcher.java代码

package com.andrew.lucene;

import java.io.StringReader;
import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
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.SimpleHTMLFormatter;
import org.apache.lucene.search.highlight.SimpleSpanFragmenter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class Searcher {
    public static void search(String indexDir, String q) throws Exception {
        Directory dir = FSDirectory.open(Paths.get(indexDir));
        IndexReader reader = DirectoryReader.open(dir);
        IndexSearcher is = new IndexSearcher(reader);
        // Analyzer analyzer=new StandardAnalyzer(); // 标准分词器
        SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();
        QueryParser parser = new QueryParser("desc", analyzer);
        Query query = parser.parse(q);
        long start = System.currentTimeMillis();
        TopDocs hits = is.search(query, 10);
        long end = System.currentTimeMillis();
        System.out.println("匹配 " + q + " ,总共花费" + (end - start) + "毫秒" + "查询到" + hits.totalHits + "个记录");

        QueryScorer scorer = new QueryScorer(query);
        Fragmenter fragmenter = new SimpleSpanFragmenter(scorer);
        SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<b><font color='red'>", "</font></b>");
        Highlighter highlighter = new Highlighter(simpleHTMLFormatter, scorer);
        highlighter.setTextFragmenter(fragmenter);
        for (ScoreDoc scoreDoc : hits.scoreDocs) {
            Document doc = is.doc(scoreDoc.doc);
            System.out.println(doc.get("city"));
            System.out.println(doc.get("desc"));
            String desc = doc.get("desc");
            if (desc != null) {
                TokenStream tokenStream = analyzer.tokenStream("desc", new StringReader(desc));
                System.out.println(highlighter.getBestFragment(tokenStream, desc));
            }
        }
        reader.close();
    }
    public static void main(String[] args) {
        String indexDir = "E:\\lucene6";
        String q = "南京文明";
        try {
            search(indexDir, q);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

匹配 南京文明 ,总共花费53毫秒查询到1个记录
南京
南京是一个有文化的城市。南京是一个文化的城市南京,简称宁,是江苏省会,地处中国东部地区,长江下游,濒江近海。全市下辖11个区,总面积6597平方公里,2013年建成区面积752.83平方公里,常住人口818.78万,其中城镇人口659.1万人。[1-4] “江南佳丽地,金陵帝王州”,南京拥有着6000多年文明史、近2600年建城史和近500年的建都史,是中国四大古都之一,有“六朝古都”、“十朝都会”之称,是中华文明的重要发祥地,历史上曾数次庇佑华夏之正朔,长期是中国南方的政治、经济、文化中心,拥有厚重的文化底蕴和丰富的历史遗存。[5-7] 南京是国家重要的科教中心,自古以来就是一座崇文重教的城市,有“天下文枢”、“东南第一学”的美誉。截至2013年,南京有高等院校75所,其中211高校8所,仅次于北京上海;国家重点实验室25所、国家重点学科169个、两院院士83人,均居中国第三。[8-10] 。
人口818.78万,其中城镇人口659.1万人。[1-4] “江南佳丽地,金陵帝王州”,<b><font color='red'>南京</font></b>拥有着6000多年<b><font color='red'>文明</font></b>史、近2600年建城史和近500年的建都史,是中国四大古都之一,有“六朝古都”、“十朝都
分享到:
评论

相关推荐

    lucene.NET 中文分词

    总的来说,Lucene.NET在中文分词和高亮显示方面的应用需要结合合适的分词器,并进行适当的配置和优化。开发者可以根据实际需求选择适合的分词器,并通过集成和调优提高系统的搜索效率和用户体验。

    IKAnalyzer LUCENE.4.9 中文分词的高亮显示

    在IT领域,中文分词是搜索引擎和文本处理系统中的关键环节,它涉及到将连续的汉字序列分割成具有独立语义的词语。IKAnalyzer是一个开源的Java实现的中文分词器,设计目标是提供一个轻量级、高效且易扩展的中文处理...

    SpringBoot+Lucene搜索结果高亮显示Demo

    **SpringBoot+Lucene搜索结果高亮显示** 在现代Web应用程序中,强大的全文搜索引擎功能是不可或缺的,而Apache Lucene正是这样一个高效的、可扩展的开源全文检索库。在这个SpringBoot+Lucene的Demo中,我们将深入...

    lucene 高亮显示. java

    对于深入理解和掌握Lucene的高亮显示功能及中文分词性能优化,建议参考官方文档和相关技术博客,同时进行实际的编码实践,以便更好地理解和运用这一知识点。此外,关注Lucene社区的最新动态,可以获取更多关于性能...

    lucene高亮显示

    Lucene的高亮显示功能是其强大搜索能力的重要组成部分,通过合理的配置和编码,可以显著提升搜索结果的可读性和用户体验。掌握高亮显示的实现原理和技巧,对于从事全文搜索应用开发的专业人士而言,是不可或缺的技能...

    lucene.net+盘古分词多条件全文检索并匹配度排序

    使用visual studio 开发的lucene.net和盘古分词实现全文检索。并按照lucene的得分算法进行多条件检索并按照得分算法计算匹配度排序。 可以输入一句话进行检索。 lucene.net的版本为2.9.2 盘古分词的版本为2.3.1 并...

    lucene.net以及高亮的DLL文件

    标题中的“lucene.net以及高亮的DLL文件”指的是在.NET环境中使用Lucene搜索引擎库时,涉及到了文本高亮显示的DLL组件。Lucene.Net是一个开源的全文检索库,它是Apache Lucene项目针对.NET Framework的移植版本,为...

    lucene第一步---5.中文分词IKAnalyzer和高亮highlighter的使用

    中文分词IKAnalyzer和高亮highlighter的使用”指出,这个主题将探讨如何在Lucene中应用IKAnalyzer进行中文分词,以及如何使用高亮器(highlighter)来突出搜索结果中的关键词。Lucene是Apache软件基金会的一个开放源...

    Lucene分词器资源包

    此外,它还提供了对高亮显示搜索结果、排序和多字段搜索的支持。 2. **Lucene Analyzers Common**: `lucene-analyzers-common.jar` 包含了各种常见的文本分析器,用于将原始输入文本转换为可搜索的术语序列。分析器...

    lucene事例(包含基本增删改查、中文词分器、高亮显示等)

    在本示例中,我们将探讨如何使用Lucene进行基本的增删改查操作,并且了解如何处理中文文档以及利用Luke工具进行索引分析,以及实现搜索结果的高亮显示。 首先,让我们深入理解Lucene的基础概念。Lucene的核心是建立...

    android+lucene实现全文检索并高亮关键字索引库

    下面我们将深入探讨如何在Android环境中利用Lucene来创建一个高效、功能丰富的全文检索系统,并了解如何高亮显示搜索结果中的关键字。 首先,我们要理解全文检索的基本原理。全文检索是指通过建立倒排索引来快速...

    lucene.net+盘古分词

    在.NET环境中,Lucene.NET是一个强大的开源全文搜索引擎库,而盘古分词则是针对中文文本处理的优秀分词工具。本文将深入探讨如何结合这两者实现高效的全文搜索,数据匹配以及关键词高亮显示等功能。 首先,Lucene...

    Lucene.Net +盘古分词 搜索引擎

    "盘古分词"是一个专门针对中文的分词工具,它可以将中文文本有效地切分成一个个独立的词语,为Lucene.Net提供精确的索引和查询基础。盘古分词以其高效、准确和丰富的词汇库,广泛应用于各种中文信息处理系统,包括...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-22.Lucene分词器3 共4页.pptx

    在这个系列中,我们特别关注了Lucene的分词器,尤其是第三部分——"Lucene分词器3"。 Lucene作为一款强大的全文搜索引擎库,其核心功能之一就是对输入的文本进行有效的分词处理,以便于后续的索引和搜索操作。分词...

    基于爬虫和lucene构建的重大新闻网

    5. **结果高亮**:为了提高用户体验,搜索结果中匹配的关键词会被高亮显示,让用户一目了然地看到关键词在内容中的位置。 在实际应用中,后端系统会接收前端用户的查询请求,使用Lucene进行搜索,并将结果返回给...

    Lucence高亮显示的实现

    ### Lucene高亮显示实现详解 #### 一、引言 在搜索引擎开发中,为了提升用户体验,往往需要对搜索结果中的关键词进行高亮处理。这样不仅可以让用户一眼就能看到搜索结果与他们输入的关键词之间的关联性,同时也有...

    lucene .NET4.0&盘古分词dll,demo,doc

    首先,Lucene.NET 4.0是Apache Lucene项目的一个.NET版本,它实现了完整的Lucene搜索功能,包括索引、查询、排序和高亮显示等。Lucene.NET 4.0主要更新了对.NET Framework 4.0的支持,增强了性能,并引入了一些新的...

    盘古分词器+lucene .net4.0下编译

    将盘古分词器与Lucene.NET 4.0结合使用,可以提升中文文本搜索的性能和准确性。首先,我们需要将盘古分词器的重新编译版本(如PanGu.dll)引入项目中,作为Lucene.NET的自定义Analyzer。这通常涉及到创建一个继承自`...

    Lucene5学习之Highlighte关键字高亮

    总结来说,Lucene5的Highlighter是其全文检索能力的重要组成部分,它通过对搜索结果中的关键字进行高亮,提高了用户对搜索结果的理解和查找效率。通过灵活的组件设计,开发者可以根据具体需求调整高亮策略,以达到...

    全文检索技术学习(三)——Lucene支持中文分词 - 李阿昀的博客 - CSDN博客1

    CharTermAttribute 类代表当前的关键词,而 OffsetAttribute 类则提供了关键词在原始文本中的起始和结束位置,这对于实现搜索结果的高亮显示至关重要。在遍历 TokenStream 时,通过 `incrementToken` 方法逐个获取...

Global site tag (gtag.js) - Google Analytics