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

相关文章

C++入门01

1、.h和.cpp 源文件 (.cpp)源文件是C++程序的实际实现代码文件,其中包含了具体的函数和类的定义、实现以及其他相关的代码。主要特点如下:实现代码: 源文件中包含了函数、类的具体实现代码,用于实现程序的功能。编译单元: 源文件通常是一个编译单元,即单独编译的基本单位。每个源文件都会经过编译器的处理,生成对应的目标文件。包含头文件: 源文件可以通过#include指令引入头文件,以使

407串口01发送

实验一: 工程。 链接:https://pan.baidu.com/s/1g8DV4yZWOix0BbcZ08LYDQ?pwd=2176 提取码:2176 串口1的使用。发送功能。 单片机发送信息到电脑。 通过串口进行通信。 首先单片机这边。 单片机这边,需要对单片机的串口模块进行使能初始化,设置串口的格式。 单片机和电脑的串口收发格式要配置一致。不然A和B肯定通信不成功,鸡和鸭讲,

大学生自救数据结构与算法(py实现)——01递归

目录 目录 递归 基本概念 工作原理 基本要素 优点 缺点 实现技巧 实例解析:计算阶乘 斐波那契数列 高效的斐波那契数列 python中的最大递归深度 二分查找 基本原理 性能分析 优化与变体 线性递归  元素序列的递归求和 二路递归 二路递归的基本概念 典型应用 工作原理 多重递归  示例:计算卡特兰数(Catalan Number) 尾递

【设计模式-04】原型模式

【设计模式-04】原型模式 1. 概述2. 结构3. 实现4. 案例5. 使用场景6. 优缺点6.1 原型模式的优点6.2 原型模式的缺点 7. 实现深克隆(深拷贝) 1. 概述 原型模式: 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。 2. 结构 原型模式包含如下角色: 抽象原型类:规定了具体原型对象必须实现的 clone() 方法。

Android自定义view学习笔记01

Android自定义view学习笔记01 昨天看博客的时候看到鸿洋老师的博客里面有关于自定义view的学习教程。一直深感所掌握的东西太少太杂,按照他的Android 自定义View (一)所讲内容,代码实践。根据实际情况稍作修改,并且补充一些在代码过程中知识点,做此笔记。 相关代码 //CustomView01.javapackage mmrx.com.myuserdefinedvi

【转载】 symfony 生成实体类命令

原作者地址:https://www.it603.com/article/88.html 参考文章: https://symfony.com/doc/current/doctrine/reverse_engineering.html How to Generate Entities from an Existing Database https://www.jianshu.com/p/75fc

C++ 教程 - 04 类的使用

文章目录 类的定义类定义案例构造函数 类的定义 C++ 在 C 语言的基础上增加面向对象编程,类是用于指定对象的形式,是一种用户自定义的数据类型,封装了数据和函数。类可以被看作是一种模板,可以用来创建具有相同属性和行为的多个对象。 class 关键字定义类,相当于在结构体中加入方法; 花括号内定义成员变量、成员方法,并且分块表示,每块使用public/private/prote

采药问题 01背包

Description:辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

04 TensorFlow 2.0:高阶OP之meshgrid

谁诀别相思成疾莫问天涯 也莫问归期 怎奈何无人了解 情断之时 冷暖自知                                                                                                                                 《莫问归期》 内容覆盖: stackmeshgrid im

Java集合框架-Map-01天

/** Map集合,该集合存储键值对。一对一对往里存。而且要保证键的唯一性* 1,添加* put(K key,V value)* putAll(Map<? extends K,? extends V> m)* 2,删除* clear()* remove(Object key)* 3,判断* containsValue(Object value)* containsValue