2010-01-04 传智播客—luncene (转载)

2024-04-08 14:18
文章标签 01 04 转载 2010 传智播 luncene

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

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

                                                                                                                               ————tiger20010

                                                                                                                          

 

 

我们这些网民,见得多了检索应用了。Google、百度、论坛内部搜索、网站内部搜索,这些应用使用的就是检索技术。今天我们学习的主要是针对WEB应用的内部文本检索,比如论坛。我们使用的框架是lucene。授课老师是汤阳光,年轻有为!

 

         搞技术的,看到什么新技术总是十分好奇。先不说googlebaidu吧(他们的专业检索技术很强哦),见到论坛内部的检索功能,就让我十分好奇。我原本以为论坛内部的检索就是模糊查找数据库,但今日的课程让我学习到了论坛内部真正的检索技术。

 

一、信息检索和全文检索

信息检索就是从信息集合中找出与用户需求相关的信息。被检索的信息除了文本外,还有图像、音频、视频等多媒体信息。我们只关注文本的检索,把用户的查询请求和全文中的每一个词进行比较,不考虑查询请求与文本语义上的匹配,这叫做全文检索。在信息检索工具中,全文检索是最具通用性和实用性的。例如,使用百度从一大堆网页中搜出与“传智播客”相关的网页。

 

我们简单看一下检索技术的流程:

请求

 

上面可见索引数据库是十分重要的,简单的说。全文检索系统,将网络上的数据通过某种格式保存到索引库中。当用户发送查询请求时,实质上就是向索引库查询。全文检索引擎负责处理用户的请求用索引库的更新等。

 

小时候查的汉语字典、英语词典我们是如何查询的?当然不是一页一页的翻了,靠的是字典的目录。Lucene的检索方式正是使用了此技术,lucene的索引库格式:

检索目录

 

数据

索引

关键字

索引

Documents…

1

C、汇编

1

汇编比机器在语言高级…C比汇编高级

2

C++

2

C++C高级..

3

JavaJ2E

3

JAVA应用级,最为优秀的语言

4

WEB

4

WEB是真正的计算机

5

你好

5

Hi,你好啊!

 

 

         上面的表只是简单说明lucene索引库的存储格式。我们通过lucene提供的类可以向索引库添加、修改、查询、删除操作

 

         关键字是通过分词器分析出来的,一般情况下各有语言有各字的分词器。分词器的强大提高了查询数据的接近性。

 

二、lucene操作

         我们编写一个对Article对象向lucene索引库的添加、修改、查询、删除操作:

import java.util.ArrayList;

import java.util.List;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

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

import org.apache.lucene.queryParser.MultiFieldQueryParser;

import org.apache.lucene.queryParser.QueryParser;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.Query;

import org.apache.lucene.search.TopDocs;

import cn.itcast.cc.lucene.helloword.Article;

import cn.itcast.cc.lucene.helloword.utils.ArticleDocUtils;

 

public class IndexDao {

    // 索引目录

    private String indexPath = "./index";

    // 分词器

    private Analyzer analyzer = new StandardAnalyzer();

 

    /**

     * 保存记录

     *

     * @param art

     */

    public void save(Article art) {

        // lucene的写出索引类

        IndexWriter indexWriter = null;

        try {

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

                    MaxFieldLength.LIMITED);

            // 添加到索引库

            indexWriter.addDocument(ArticleDocUtils.Article2Doc(art));

        } catch (Exception e) {

            e.printStackTrace();

        }

        // 释放indexWriter

        if (indexWriter != null) {

            try {

                // 使用后一定要关闭

                indexWriter.close();

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    }

 

    /**

     * 更新记录

     *

     * @param art

     */

    public void update(Article art) {

        IndexWriter indexWriter = null;

        try {

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

                    MaxFieldLength.LIMITED);

            Term term = new Term("id", art.getId() + "");

            // 更新

            indexWriter.updateDocument(term, ArticleDocUtils.Article2Doc(art));

        } catch (Exception e) {

            e.printStackTrace();

        }

 

        // 释放indexWriter

        if (indexWriter != null) {

            try {

                indexWriter.close();

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    }

 

    /**

     * 删除记录

     *

     * @param id

     */

    public void delete(int id) {

        IndexWriter indexWriter = null;

        try {

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

                    MaxFieldLength.LIMITED);

            Term term = new Term("id", id + "");

            // 删除

            indexWriter.deleteDocuments(term);

        } catch (Exception e1) {

            e1.printStackTrace();

        }

 

        // 释放indexWriter

        if (indexWriter != null) {

            try {

                indexWriter.close();

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    }

 

    /**

     * 查询记录(具有分页功

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



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

相关文章

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 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个

集中式版本控制与分布式版本控制——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

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理

提问的智慧(转载)

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

[苍穹外卖]-04菜品管理接口开发

效果预览 新增菜品 需求分析 查看产品原型分析需求, 包括用到哪些接口, 业务的限制规则 业务规则 菜品名称必须是唯一的菜品必须属于某个分类下, 不能单独存在新增菜品时可以根据情况选择菜品的口味每个菜品必须对应一张图片 接口设计 根据类型查询分类接口 文件上传接口 新增菜品接口 数据表设计 设计dish菜品表 和 dish_fl

Struts2常用标签总结--转载

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

【转载】ACM感悟

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