`

lucene ik 小试一下,做技术储备

 
阅读更多

 

package lucene;
import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
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.Formatter;
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.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
 
 
/**
 * lucene3.5+ik的例子
 *
 * @author zz
 * @date   2012-11-29 
 */
public class LuceneDemo {
    //索引文件位置
    File dataFile = new File("D://indexFile");
    //使用IK分词器
    Analyzer analyzer = new IKAnalyzer();
     
     
    public void bulidIndex(){
        Directory directory = null;
        IndexWriter writer = null;
        try {
            directory = FSDirectory.open(dataFile);
             
            IndexWriterConfig writerConfig = new IndexWriterConfig(Version.LUCENE_35, analyzer);
            writer = new IndexWriter(directory, writerConfig);
             
            writer.addDocument(addDocument(1, "中国好平台", "中国好平台,1是以分享知识与经验的学习交流平台,加入中国好平台,学习新知识、结交新朋友、塑造个人形象。"));
            writer.addDocument(addDocument(2, "中国好平台", "中国好平台,2是以分享知识与经验的学习交流平台,加入中国好平台,学习新知识、结交新朋友、塑造个人形象。"));
            writer.addDocument(addDocument(3, "中国好平台", "中国好平台,3是以分享知识与经验的学习交流平台,加入中国好平台,学习新知识、结交新朋友、塑造个人形象。"));
            writer.addDocument(addDocument(4, "资料", "中国好平台,4是以分享知识与经验的学习交流平台,加入中国好平台,学习新知识、结交新朋友、塑造个人形象。"));
            writer.addDocument(addDocument(5, "微知识", "中国好平台,5是以分享知识与经验的学习交流平台,加入中国好平台,学习新知识、结交新朋友、塑造个人形象。"));
            writer.addDocument(addDocument(6, "我", "中国好平台,6是以分享知识与经验的交流平台,加入中国好平台,新知识、结交新朋友、塑造个人形象。"));
             
        }catch(Exception ex){
            ex.printStackTrace();
        } finally {
            try {
                writer.close();
                directory.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
     
     
    /**
     * 添加Document
     */
    @SuppressWarnings("deprecation")
	public Document addDocument(Integer id, String title, String content) {
        Document doc = new Document();
         
        //Field.Index.NO 表示不索引
        //Field.Index.ANALYZED 表示分词且索引
        //Field.Index.NOT_ANALYZED 表示不分词且索引
        doc.add(new Field("id", String.valueOf(id), Field.Store.YES, Field.Index.NOT_ANALYZED));
        doc.add(new Field("title", title, Field.Store.YES, Field.Index.ANALYZED));
        doc.add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED));
        return doc;
    }
     
     
    /**
     * 更新索引
     */
    public void update(Integer id, String title, String content) {
        try {          
            Directory directory = FSDirectory.open(dataFile);
             
            IndexWriterConfig writerConfig = new IndexWriterConfig(Version.LUCENE_35, analyzer);
            IndexWriter writer = new IndexWriter(directory, writerConfig);
             
            Document doc = addDocument(id, title, content);
             
            Term term = new Term("id", String.valueOf(id));
             
            writer.updateDocument(term, doc);
             
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
     
     
    /**
     * 删除索引
     */
    public void delete(Integer id) {
        try {
            Directory directory = FSDirectory.open(dataFile);
             
            IndexWriterConfig writerConfig = new IndexWriterConfig(Version.LUCENE_35, analyzer);
            IndexWriter writer = new IndexWriter(directory, writerConfig);
            Term term = new Term("id", String.valueOf(id));
            writer.deleteDocuments(term);
             
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
     
     
    /**
     * 搜索
     * @param where   搜索条件   
     * @param after   分页时要用到,不分页时为null
     */
    public void search(String where, ScoreDoc after) {
        IndexSearcher isearcher = null;
        Directory directory = null;
        try {
            directory = FSDirectory.open(dataFile);
             
            //创建索引搜索器 且只读
            IndexReader reader = IndexReader.open(FSDirectory.open(dataFile)); 
            isearcher = new IndexSearcher(reader);
             
            //在索引器中使用IKSimilarity相似度评估器
            //isearcher.setSimilarity(new IKSimilarity());
             
            QueryParser parser = new QueryParser(Version.LUCENE_35, null, analyzer);
            Query query = parser.parse(where);
             
            //lucene3.5深度分页,每页显示10条记录
            TopDocs topDocs = isearcher.searchAfter(after, query, 10);
            ScoreDoc[] hits = topDocs.scoreDocs;
             
            //关键字高亮
            Formatter formatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");
            Scorer scorer = new QueryScorer(query);
            Highlighter highlighter = new Highlighter(formatter, scorer);
 
            for(ScoreDoc scoreDoc : hits){
                Document hitDoc = isearcher.doc(scoreDoc.doc);
                String id = hitDoc.get("id");
                String title = hitDoc.get("title");
                String content = hitDoc.get("content");
                float score = scoreDoc.score;
                 
                title = highlighter.getBestFragment(analyzer, "title", title);
                content = highlighter.getBestFragment(analyzer, "content", content);
                 
                if(title == null){
                    title = hitDoc.get("title");
                }
                 
                if(content == null){
                    content = hitDoc.get("content");
                }
                 
                System.out.println("doc:" + scoreDoc.doc + "    score:" + score + "   id:" + id + "   title:" + title + "    content:" + content);
            }
             
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            try {
               // isearcher.close();
                directory.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
         
    }
}

 

 

package lucene;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
 
public class LuceneDemoTest {
    static LuceneDemo luceneDemo = null;
 
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        luceneDemo = new LuceneDemo();
    }
 
    @AfterClass
    public static void tearDownAfterClass() throws Exception {
    }
 
    @Test
    public void testBulidIndex() {
        luceneDemo.bulidIndex();
    }
 
    @Test
    public void testUpdate() {
        luceneDemo.update(1, "测试更新", "更新内容。。。。");
    }
 
    @Test
    public void testDelete() {
        luceneDemo.delete(1);
    }
 
    @Test
    public void testSearch() {
        String where = "title:中国好平台 content:学习";           //类似SQL为:title='中国好平台' or content='学习'
        //String where = "title:中国好平台 +content:学习 -id:1";   //类似SQL为:title='中国好平台' and content='学习' and id!=1
        //String where = "title:我 -content:学习";         // 类似SQL为:title='中国好平台' and content!='学习'
         
        //ScoreDoc after = new ScoreDoc(0, (float)0.032529574);
        //luceneDemo.search(where, after);
         
        luceneDemo.search(where, null);
    }
 
}

 

此处为造轮子,闲来无事,造个轮子,看将来是否有用得上的地方,此处其实用的是lucene4.0和IK2012都是最新版本,可以去网站去下载

lucene:http://apache.etoak.com/lucene/java/4.0.0/

ik:http://code.google.com/p/ik-analyzer/downloads/list

 

参考:http://www.juziku.com/sunlightcs/wiki/4205.htm

 

 

 

1
3
分享到:
评论

相关推荐

    c# 中文分词 LUCENE IKAnalyzer

    标题中的"C# 中文分词 LUCENE IKAnalyzer"是指使用C#语言实现的一个中文分词工具,它基于开源全文检索引擎Lucene,并且采用了IKAnalyzer(智能汉字分词系统)的Java版本进行移植。Lucene是一个强大的、高性能的信息...

    IKAnalyzer 支持高版本最新Lucene 5.x、6.x、7.x

    IKAnalyzer 是一个开源的、基于Java实现的中文分词器,专为全文检索和搜索引擎提供高效、快速的分词服务。...随着技术的不断进步,IKAnalyzer的持续更新将确保其在未来的搜索引擎开发中保持领先地位。

    IK和Lucene

    标题中的"IK和Lucene"指的是IK Analyzer与Apache Lucene两个关键组件,它们在中文文本处理和全文检索领域中有着重要应用。IK Analyzer是一个开源的Java分词器,专为中文处理而设计,广泛用于搜索引擎、信息检索系统...

    模糊查询-lucene-IKAnalyzer

    本话题主要探讨的是在Java 1.5环境下,如何利用Lucene 3.0.1版本和IKAnalyzer 3.2来实现模糊查询的功能。Lucene是一个高性能、全文本搜索库,而IKAnalyzer是一个专门针对中文分词的开源分析器,它们的结合能够有效地...

    Lucene5.21+IkAnalyzer

    在信息技术领域,数据检索和搜索引擎是至关重要的部分,而Lucene和IkAnalyzer则是其中的两大利器。本文将详细介绍如何使用Lucene 5.21版本结合IkAnalyzer 2012_V5进行文本分析和全文搜索的入门实践。 首先,让我们...

    高版本Lucene的IK分词器

    maven库中现有的ik分词器只支持低版本的Lucene,想要支持高版本的Lucene,需要重写老版本ik分词器里的部分代码. 下载代码片段后导入项目,在创建分词器的时候把new IKAnalyzer替换为 new IKAnalyzer5x即可。

    elasticsearch-analysis-ik,ik分析插件将lucene ik analyzer集成到elasticsearch中,支持自定义字典。.zip

    Elasticsearch 是一款功能强大的全文搜索引擎,而 IK Analyzer 是一个在 Lucene 上构建的智能中文分词库。本文将深入探讨如何将 Elasticsearch Analysis IK 插件应用于 Elasticsearch 中,以实现对中文文本的高效、...

    IKAnalyzer中文分词支持lucene6.5.0版本

    由于林良益先生在2012之后未对IKAnalyzer进行更新,后续lucene分词接口发生变化,导致不可使用,所以此jar包支持lucene6.0以上版本

    org.wltea.analyzer.lucene.IKAnalyzer jar

    solr的IK分词器JAR及配置文件 jar包和配置文件的放置位置不一样,详情可搜索 IK Analyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。...org.wltea.analyzer.lucene.IKAnalyzer jar

    lucene增删改查+IKAnalyzer

    《深入理解Lucene与IKAnalyzer:构建全文搜索引擎》 在信息技术高速发展的今天,数据的存储与检索变得至关重要。Lucene,作为一个开源的全文检索库,为开发者提供了强大的文本搜索功能。而IKAnalyzer作为针对中文...

    Lucene4.7+IK Analyzer中文分词入门教程

    【Lucene4.7+IK Analyzer中文分词入门教程】 Lucene是一个开源的全文检索库,它提供了文本分析、索引和搜索的核心工具。在这个入门教程中,我们将使用Lucene 4.7版本,结合IK Analyzer,一个专门针对中文分词的开源...

    lucene+中文IK分词器 例子

    **Lucene+中文IK分词器实例解析** Lucene是一个高性能、全文检索库,由Apache软件基金会开发。它提供了一个简单但功能强大的API,用于在各种应用中实现全文索引和搜索。在处理中文文本时,由于中文词汇的复杂性和无...

    lucene的IKAnalyzer以及兼容4.3

    1. **升级IKAnalyzer版本**:确保使用的IKAnalyzer版本与Lucene 4.3兼容。 IKAnalyzer会定期发布新版本,以适配最新版的Lucene。 2. **修改代码**:检查并修改项目中涉及Lucene API的部分,以适应新版本的API变化。 ...

    ik分词器2012和lucene的资源和jar包以及lucene索引查看工具

    除了基础的文本搜索,IK分词器和Lucene还可以结合其他技术,如NLP(自然语言处理)和信息抽取,实现更复杂的文本分析功能,如情感分析、关键词提取、主题模型等。 总的来说,IK分词器和Lucene是Java开发中的重要...

    lucene4.0+ik

    《深入理解Lucene4.0与IKAnalyzer2012:构建高效全文检索系统》 在信息化时代,数据量的快速增长使得高效的全文检索技术变得至关重要。Lucene作为Apache软件基金会的一个开源项目,是Java领域内最著名的全文搜索...

    lucene5和IKAnalyzer5的jar包 相匹配

    《深入理解Lucene5与IKAnalyzer5:构建高效全文搜索引擎》 在信息技术高速发展的今天,搜索引擎已经成为信息获取的重要工具。Lucene和IKAnalyzer作为Java领域内广泛应用的全文检索库和中文分词器,它们的结合为开发...

    中文分词库 IKAnalyzer For Lucene 5.2.1(适用Lucene 5.2.1)

    IKAnalyzer 是一个专门为 Lucene 设计的开源中文分词库,它在中文处理领域有着广泛的应用。这个版本的 IKAnalyzer 特别适用于 Lucene 5.2.1,这意味着它与该版本的 Lucene 兼容性极佳,能够提供高效、准确的中文分词...

    lucene 所有jar包 包含IKAnalyzer分词器

    《Lucene分词技术与IKAnalyzer详解》 在信息技术领域,搜索引擎是不可或缺的一部分,而Lucene作为Apache软件基金会的一个开放源代码项目,是Java语言开发的全文检索引擎库,为构建高效、可扩展的信息检索应用提供了...

    2018-01lucene-3.5和IKAnalyzer2012全文分词检索技术文档

    使用lucene-3.5和IKAnalyzer2012,实现基础的全文检索实现

    ikanalyzer中文分词支持lucene7.1.0

    ikanalyzer中文分词支持lucene7.1.0是一个针对Lucene搜索引擎的中文分词扩展,由林良益先生开发,旨在提供高效、精准的中文词汇拆解功能。Lucene是一个开源全文检索库,它提供了索引和搜索文本的强大工具。然而,...

Global site tag (gtag.js) - Google Analytics