2010-01-05 传智播客—luncene/compass (转载)

2024-04-08 14:18

本文主要是介绍2010-01-05 传智播客—luncene/compass (转载),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如果大家对文章内容有不理解的地方,尽情留言或QQ(1357208561) 讨论。让大家共同进步。

                                                                                                                                                                                                                                                                                               ————tigers20010

北京好奇怪,昼夜温差很大,有点像月球。早起时窗上的冰霜很厚实,但到了白天阳光很足,风力很小,气温很好。大连现在确在降温,零下十几度,比较罕见。可能是我离开她一会,她却变冷了。呵呵~~

 

今日上午把lucene的高级部分给结束了。下午搞了一下CompassCompass是对lucene的封闭。因为lucene使用起来有些麻烦。

 

一、lucene高级

1.分词器

一般的分词器流程:

 
 
 

 


1)         输入文本:输入查询的内容。

2)         关键词切分:使用分词器取出关键词。

3)         去除停用词:去除没有多大意义的词,比如a,an,the,的,呢,吧。

4)         形态还原:将词的某种形态还原为原形,比如英文复数形式恢复到单数形式。

5)         转为小写:将英文转为小写,不区分大小写。

 

Lucene中的分词器

1)         单字分词:对应的类ChineseAnalyzer,将输入的字符串中的每个字做为关键字。比如“中国人加油!”,会被切分为“中”、“国”、“人”、“加”、“油”。(标点符号属于停用词)

2)         二分法分词:对应的类CJKAnalyzer,将输入的字符串以二分法分词。比如“中国人加油!”,会被切分为“中国”、“国人”、“人加”、“加油”这四个关键字。(标点符号属于停用词)

3)         词库分词:对应的类MMAnalyzer最为常用的分词器。比如“中国人加油!”,会被切分为“中国人”、“加油”。(标点符号属于停用词)

示例:

package cn.itcast.cc.anayzler;

 

import java.io.IOException;

import java.io.StringReader;

import jeasy.analysis.MMAnalyzer;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.Token;

import org.apache.lucene.analysis.TokenStream;

import org.apache.lucene.analysis.cjk.CJKAnalyzer;

import org.apache.lucene.analysis.cn.ChineseAnalyzer;

import org.junit.Test;

 

public class AnalyzerTest {

 

    Analyzer anaylzer1 = new ChineseAnalyzer();// 单字分词

    Analyzer anaylzer2 = new CJKAnalyzer();// 二分分词法

    Analyzer anaylzer3 = new MMAnalyzer();// 词库分词

 

    @Test

    public void test() throws IOException {

        String str = "中国人加油!";

        printAnalyzer(anaylzer1, str);

        printAnalyzer(anaylzer2, str);

        printAnalyzer(anaylzer3, str);

    }

 

    private void printAnalyzer(Analyzer analyzer, String str)

            throws IOException {

        TokenStream tokenStream = analyzer.tokenStream("text", new StringReader(

                str));

        System.out.println("*****分词器->" + analyzer.getClass().getName() + ",将'"

                + str + "'切分为:");

        Token token = new Token();

        while ((token = tokenStream.next(token)) != null) {

            System.out.println(token);

        }

    }

}

 

2.高亮

Lucene的高亮器(Highlighter类)可以实现lucene的关键字高亮:

package cn.itcast.cc.highlighter;

 

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.document.*;

import org.apache.lucene.document.Field.*;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.IndexWriter.MaxFieldLength;

import org.apache.lucene.queryParser.*;

import org.apache.lucene.search.*;

import org.apache.lucene.search.highlight.*;

import org.apache.lucene.search.highlight.Scorer;

import org.junit.Test;

import jeasy.analysis.MMAnalyzer;

 

public class HighLighterTesst {

    private String path = "./index/";// lucene的索引数据被保存在这个目录中

    private Analyzer analyzer = new MMAnalyzer();// 词库分词器

 

    @Test

    public void test() {

        try {

            // 创建索引数据

            IndexWriter indexWriter = new IndexWriter(this.path, this.analyzer,

                    MaxFieldLength.LIMITED);

            Document doc = new Document();

            doc.add(new Field("content", "中国人民加油!", Store.YES, Index.ANALYZED));

            indexWriter.addDocument(doc);

            indexWriter.close();

            // 查询数据

            IndexSearcher indexSearcher = new IndexSearcher(this.path);

            QueryParser queryParser = new MultiFieldQueryParser(

                    new String[] { "content" }, this.analyzer);

            Query query = queryParser.parse("加油");

            TopDocs topDocs = indexSearcher.search(query, null, 10);

            // 创建高亮

            // SimpleHTMLFormatter的默认值为"<a></a>"

            Formatter formatter = new SimpleHTMLFormatter("<span>", "</span>");

            Scorer scorer = new QueryScorer(query);

            Highlighter highlighter = new Highlighter(formatter, scorer);

            // 打印结果

            for (ScoreDoc scoreDoc : topDocs.scoreDocs) {

                // 取出查询结果

                Document searchdoc = indexSearcher.doc(scoreDoc.doc);

                String searchstr = searchdoc.getField("content").stringValue();

                // 添加高亮

                String histr = highlighter.getBestFragment(this.analyzer,

                        "content", searchstr);

                System.out.println(histr);

            }

            indexSearcher.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

这篇关于2010-01-05 传智播客—luncene/compass (转载)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885822

相关文章

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

集中式版本控制与分布式版本控制——Git 学习笔记01

什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样: 过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储,载入镜像和删除镜像 1.4 Doecker容器操作 1.4

提问的智慧(转载)

此文让我受益良多。值得一读,大家如果也觉得不错就一起来推~~~   ---------------------------------      在黑客世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案的难度,同样取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最想要的答案。       首先你必须明白,黑客们只偏爱艰巨的任务,或者能激发他们

Struts2常用标签总结--转载

Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题、模板支持,极大地简化了视图页面的编写,而且,struts2的主题、模板都提供了很好的扩展性。实现了更好的代码复用。Struts2允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂,多变的需求。 Struts2的标签库有一个巨大的改进之处,struts2标签库的标签不依赖于

C++入门(05-2)从命令行执行C++编译器_GCC

文章目录 GCC编译器1. 下载MinGW-w64,安装(不推荐)2. 使用MSYS2安装MinGW-w64(推荐)2.1 安装MSYS22.2 初始化和更新2.3 安装MinGW-w64编译器2.3 在MSYS2 Shell中导航到代码目录2.4 使用 g++ 编译2.5 运行可执行文件 GCC编译器 GCC(GNU Compiler Collection)是一个开源编译器集

C++入门(05)从命令行执行C++编译器_MSVC

文章目录 1.C++ 编译器2. 常用 C++ 编译器MSVC(Microsoft Visual C++)GCC(GNU Compiler Collection)Clang 3. MSVC 编译器3.1 开发者命令提示符3.2 编译 C++ 代码 1.C++ 编译器 将C++源代码(扩展名为 .cpp )转换成计算机可以运行的可执行程序 编译器会检查代码的语法和语义,生成相应

龙芯+FreeRTOS+LVGL实战笔记(新)——05部署主按钮

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了改进和优化,各位可以先到本人主页下去浏览另一专栏的博客列表(目前已撰写36篇,图1所示),再决定是否订阅。此外,也可以前往本人在B站的视频合集(图2所示)观看所有演示视频,合集首个视频链接为: 借助RT-Thread和LVGL

【转载】ACM感悟

今天看了一篇我们学校前辈的ACM的感悟,觉得写的十分有道理,这里转载,文章还会不断的改进和更新。 原文链接:http://www.cnblogs.com/Chierush/p/3760870.html?ADUIN=1339764596&ADSESSION=1401536826&ADTAG=CLIENT.QQ.5329_.0&ADPUBNO=26349 声明:本文是写给弱校ACM新手的一点