全文检索Lucene的第一次尝试

记一次springboot集成海康威视SDK过程 一开始没有接触过物联网这块,走了很多弯路,后面还是自己一点点摸索出来的。有个项目,需要对海康的门禁设备进行集成,后台统一管理设备,进行设备人脸数据的下发、删除等操作。3.我还接入了门禁设备的事件监听,门禁所有的事件都会上报到后台服务,这块代码有需要的可以找我。在linux系统中,sdk我使用的是绝对路径,把Linux版本的文件放到服务时,Acs文件夹下的 各个Manage都有现成的代码,可以根据自己的需要调用即可。路径也不要有中文,切记!2.sdk的存放路径不要有中文,不然会出现很多奇怪的问题。 阅读详情

由于系统搜索速度一直不理想,今天决定用Lucene进行 索引。然后全表检索 核心代码如下

 
package net.java2000.forum.util;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.sql.DataSource;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.WildcardQuery;
/**
 * 
 * @author 赵学庆 www.java2000.net
 *
 */
public class Lucene {
  private static final String indexPath = "d:/index/www.java2000.net";

  /**
   * @param args
   * @throws Exception
   */
  public static void main(String[] args) throws Exception {
    // create();
    Lucene l = new Lucene();
    System.out.println("模糊搜索/n------------------------------");
    l.seacherWildcard("域名");
    System.out.println("索引搜索/n------------------------------");
    l.seacherIndex("域名 AND 系统");
  }

  public static void rebuildAll() {
    synchronized (indexPath) {
      Lucene l = new Lucene();
      DataSource ds = (DataSource) Factory.getBean("dataSource");
      Connection con = null;
      Statement stat = null;
      ResultSet rs = null;
      try {
        con = ds.getConnection();
        stat = con.createStatement();
        rs = stat.executeQuery("select id,subject,content from t_post");
        if (rs != null) {
          l.Index(rs);
        }
      } catch (Exception ex) {
        ex.printStackTrace();
      } finally {
        if (rs != null) {
          try {
            rs.close();
          } catch (Exception ex) {}
        }
        if (stat != null) {
          try {
            stat.close();
          } catch (Exception ex) {}
        }
        if (con != null) {
          try {
            con.close();
          } catch (Exception ex) {}
        }
      }
    }
  }

  public synchronized Analyzer getAnalyzer() {
    return new StandardAnalyzer();
  }

  private synchronized void Index(ResultSet rs) {// 通过结果集就可以获得数据源了
    try {
      IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), true);
      Date start = new Date();
      while (rs.next()) {
        Document doc = new Document();// 一个文档相当与表的一条记录
        doc.add(new Field("id", rs.getString("id"), Field.Store.YES, Field.Index.UN_TOKENIZED));// 字段id放的是数据库表中的id,lucene的一条记录的一个字段下的数据可以放多个值,这点与数据库表不同
        doc.add(new Field("subject", rs.getString("subject"), Field.Store.YES, Field.Index.TOKENIZED));
        doc.add(new Field("content", rs.getString("content"), Field.Store.YES, Field.Index.TOKENIZED));
        writer.addDocument(doc);
      }
      writer.optimize();// 优化
      writer.close();// 一定要关闭,否则不能把内存中的数据写到文件
      Date end = new Date();
      System.out.println("重建索引成功!!!!" + "用时" + (end.getTime() - start.getTime()) + "毫秒");
    } catch (IOException e) {
      System.out.println(e);
    } catch (SQLException e) {
      System.out.println(e);
    }
  }

  public void IndexSingle(long id, String subject, String content) {// 通过结果集就可以获得数据源了
    synchronized (indexPath) {
      try {
        IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), false);
        Date start = new Date();
        Document doc = new Document();// 一个文档相当与表的一条记录
        doc.add(new Field("id", Long.toString(id), Field.Store.YES, Field.Index.UN_TOKENIZED));// 字段id放的是数据库表中的id,lucene的一条记录的一个字段下的数据可以放多个值,这点与数据库表不同
        doc.add(new Field("subject", subject, Field.Store.YES, Field.Index.TOKENIZED));
        doc.add(new Field("content", content, Field.Store.YES, Field.Index.TOKENIZED));
        writer.addDocument(doc);
//        writer.optimize();// 优化
        writer.close();// 一定要关闭,否则不能把内存中的数据写到文件
        Date end = new Date();
        System.out.println("索引建立成功!!!!" + "用时" + (end.getTime() - start.getTime()) + "毫秒");
      } catch (IOException e) {
        System.out.println(e);
      }
    }
  }

  public Hits seacherWildcard(String queryString) {// 根据关键字搜索
    Hits hits = null;
    try {
      Query query = new WildcardQuery(new Term("subject", "*" + queryString + "*"));// 模糊查询一下
      Searcher searcher = new IndexSearcher(indexPath);
      hits = searcher.search(query);
      for (int i = 0; i < hits.length(); i++) {
        Document doc = hits.doc(i);
      }
      searcher.close();
    } catch (Exception e) {
      System.out.print(e);
    }
    return hits;
  }

  public List seacherIndex(String queryString) {// 根据关键字搜索
    System.out.println(queryString);
    Hits hits = null;
    try {
      IndexSearcher isearcher = new IndexSearcher(indexPath);
      // Parse a simple query that searches for "text":
      MultiFieldQueryParser parser = new MultiFieldQueryParser(new String[]{"subject","content"},getAnalyzer());
//      QueryParser parser = new QueryParser("subject", getAnalyzer());
      Query query = parser.parse(queryString);
      hits = isearcher.search(query);
      List rtn = new ArrayList();
      for (int i = 0; i < hits.length(); i++) {
        Document doc = hits.doc(i);
        rtn.add(Long.parseLong(doc.get("id").trim()));
      }
      isearcher.close();
      return rtn;
    } catch (Exception e) {
      System.out.print(e);
      return null;
    }
  }
}

说明

1 StandardAnalyzer 支持中文,所以不用再找其它的了

2 Index方法里

IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), true); 

最后面的这个true,是重新建立索引。 在第一运行时,必须重新所有所有。

 Field.Index.UN_TOKENIZED 是不进行单词拆分   Field.Index.TOKENIZED 是进行拆分,

3 seacherWildcard 里面可以进行模糊搜索

4 seacherIndex 里面   MultiFieldQueryParser 支持多个字段的联合查询

5 我测试的结果,我的网站的11M的索引(应该算很一般的数据量,6000多个帖子),检索竟然几乎不需要时间?或者10毫秒以内。

6  l.seacherIndex("域名 AND 系统"); AND OR NOT 用在单词之间进行组合查询, + 代表 AND  -代表 NOT

7 每次有新的数据时,比如发言或者回复则调用

public void IndexSingle(long id, String subject, String content)

进行索引更新,注意里面的参数是false;

IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), false);
就这些,第一次使用,效果很好。





<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
AI算力网络与通信领域QoS保障的测试方法 在当今数字化时代,AI技术蓬勃发展,AI算力网络应运而生。它将分布在不同地理位置的算力资源进行整合,以高效地支持各种AI应用,如深度学习训练、智能图像识别等。而通信领域则是信息传输的基石,确保数据能够准确、快速地在不同节点之间传递。QoS保障在通信领域至关重要,它可以确保不同类型的业务(如语音通话、视频会议、在线游戏等)获得与其需求相匹配的服务质量。在AI算力网络中,QoS保障同样不可或缺,因为AI任务对网络的带宽、延迟、可靠性等指标有严格要求。 阅读详情

相关推荐

【CANoe16安装教程】亲测安装成功

CANoe16安装教程

qq_45302638的博客 2万+

luence

@SuppressWarnings({ "unchecked", "deprecation" }) public static List SearchForContent(String indexPath, String keyword, int start, int max, String orderByField, String orderByType) ...

Java技术交流 126

STM32—时钟树(结合系统时钟函数理解)

时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处。心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这个脉冲的始源往往是由外部晶体振荡器提供时钟输入,最终转换为多个外部设备的周期性运作。这种时钟“能量”的传递路径犹如大树的养分由主干流向个分支,因此称为时钟树。 STM32时钟: 在STM32...

肥宅快乐博客 1万+

lucene使用与优化

1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。1.2 lucene能做什么要回答这个问题,先要了解lucene的本质。实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉你你要

学海无涯的专栏 1435

水下井口装置及钻杆建模

内容:海上油气资源开采的过程中,通常会由海上钻井平台下入钻杆连接到海底井口装置。OrcaFlex软件可进行各种海洋工程结构动态分析,通过各项数据的输入,能够很方便地进行水下井口装置及钻杆建模。直接使用软件New Line及new vessel功能,再设置模型的各项参数(几何属性、弯曲刚度、轴线刚度、扭转刚度、泊松比等)即可建成井口装置及钻杆模型。 设置管线的几何属性:主要包括管线的内外径、壁厚、...

s0302017的博客 1148

华为OD机试 - 猴子吃桃 - 二分查找(Java 新系统 100分)

每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 3851

关于sql全文检索与lucene效率比较的摘要

关于sql全文检索与lucene效率比较的摘要,以下仅为网络找到的效率意见,近期会对效率做出测试比较,再更新。   --------------------------------------------------------------------------------------------------------------------   观点一: 1.查询速度问题

FeelUps--The more U Give,The More U Have 5357

华为OD技术面八股_C++_05

汇总华为OD技术面C++方向技术面八股文,提供详细解答。

qq_45776114的博客 413

Lucene_全文检索_弱点

Lucene全文检索,是java编写的全文检索工具,solr和es底层都是用的Lucene

fager漫长路 289

基于simulink的自动紧急制动系统(AEB)的功能验证

本文手把手指导使用Simulink构建自动紧急制动系统(AEB)模型,通过五个关键步骤完成功能验证:1)搭建车辆动力学模型;2)设计雷达传感器模型;3)开发基于碰撞时间(TTC)的决策逻辑;4)设计标准化测试场景;5)进行仿真分析。重点讲解了AEB的多级触发机制(预警、辅助制动、自动制动)和核心指标验证方法,包括制动时机判断、减速度性能等。通过典型场景仿真,展示了AEB如何在2.5秒TTC触发预警,1.2秒TTC启动自动制动,有效避免碰撞。文章还展望了行人AEB、传感器融合等进阶研究方向,为自动驾驶安全系统

amy_mhd的博客 267

使用微信小程序开发制作一个简单的在线问答应用

以上就是一个简单的在线问答小程序的开发过程。其中包括前端界面的布局和逻辑,后端接口的设计和实现,以及部署和测试的步骤。通过以上步骤,你可以自己尝试开发一个类似的在线问答应用。

2401_85258012的博客 800

[转]Lucene 全文检索实践

 [转]Lucene 全文检索实践作者:baggio785作者Blog:http://blog.youkuaiyun.com/baggio785/本文来源:http://www.lucene.com.cn/sj.htmLucene Lucene 是 Apache Jakarta 的一个子项目,是一个全文检索的搜索引擎库。其提供了简单实用的 API,通过这些 API,可以自行编写对文件(TEXT/XML/H

.NET博文收藏 386

QuecOpen RTOS学习笔记

对计算机响应时间有要求的系统,通常称为临界系统或应用。为了满足临界系统或应用对计算机响应 时间的要求,人们开发了实时操作系统(Real Time Operation System)。 实时操作系统指所有任务均在规定时间内完成的操作系统,同时任务完成必须满足时序可预测性。需 要注意的是,实时操作系统的本质是其反应具有时序可预测性。得益于此,实时操作系统通常反应非常快。 实时操作系统的内核对象一般包括任务、信号量、互斥锁、消息队列、定时器、事件通知和软件看门 狗等。

zxm8513优快云博客 2030

在应用中加入全文检索功能 ——基于Java的全文索引引擎Lucene简介

在应用中加入全文检索功能    ——基于Java的全文索引引擎Lucene简介 作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com写于:2002/08 最后更新: 03/16/2005 16:27:52 Feed Back >> 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明http://www

春风依旧:) 2365

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

头歌Educoder答案 Lucene - 全文检索入门

Analyzer是由IndexWriter的构造方法来指定的,它负责从被索引文件中提取语汇单元,并提出剩下的无用信息。根据关键字搜索索引,根据索引找到对应的文档,从而找到要搜索的内容(这里指磁盘上的文件)。如果你还没有接触过Lucene,那么强烈建议你查看背景知识了解Lucene的基础知识和开发环境的配置,如果你已经学习过Lucene那么你可以根据下列知识尝试完成本关任务。全文检索系统提供用户搜索的界面供用户提交搜索的关键字,搜索完成展示搜索结果。分析器的分析对象为文档,该文件包含一些分离的能被索引的域。

2302_77385038的博客 1588

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Lucene系列(一)什么是Lucene

前言 上一个系列还没有完结,我又来开新坑啦~ 接触搜索/推荐相关工作,也有两年了。工作里对lucene的接触不少,却也不精。最近工作里没有那么忙,因此想通过学习源码的方式,来对lucene进行一个系统的学习。 此外,听闻lucene源码堪称面对对象设计届的典范,也想从中吸收一些代码设计/开发方面的知识。最近老是感觉自己写的代码有问题,想尝试优化却感觉非常吃力,经常一顿操作下来提升的很有限。 lucene简介 以下内容来自维基百科: Lucene是一套用于全文检索和搜索的开放源码程序库,由Apache软件基

呼延十 487

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

H2 的全文检索功能

在前面的文章中,我们介绍了 H2 的一些特性以及 为什么H2 适合应用在测试环境中。H2 不但可以作为嵌入式数据库、内存数据库使用。在适当的场景下可以选择使用 H2 替换掉 SQLite,还可利用 H2 内存数据库的特点,将它还提供了全文检索的功能。 H2 内置了两个全文检索(FullText Search)的实现: **Native FullText Search。**使用 H2 中内置的全文检索,将索引存储在数据库指定的表中。 Apache Lucene FullText Search。 H2 使用

PageThinker 1075

用lucene替代mysql读库的尝试

采用lucene对mysql中的表建索引,并替代全文检索操作。 备注:代码临时梳理很粗糙,后续修改。 import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java....

Fred's Note 555

Lucene 全文检索实践

Lucene 是 Apache Jakarta 的一个子项目,是一个全文检索的搜索引擎库。其提供了简单实用的 API,通过这些 API,可以自行编写对文件(TEXT/XML/HTML等)、目录、数据库的全文检索程序。Features:* Very fast indexing, minimal RAM required* Index compression to 30% of original

guoguo1980的专栏 1057

探索 HanLP-Lucene-Plugin:让自然语言处理融入全文检索的利器

探索 HanLP-Lucene-Plugin:让自然语言处理融入全文检索的利器 项目简介 是一个由著名自然语言处理库 HanLP 团队打造的 Lucene 插件,它将先进的 NLP 技术与全文检索引擎紧密结合,为开发者提供了一个高效、准确地处理文本搜索的解决方案。通过这个插件,你可以轻松地在你的 Lucene 应用中实现分词、词性标注、命名实体识别等复杂的文本预处理功能。 技术分析 结合 HanL...

gitblog_00050的博客 546

使用lucene创建索引库

最近在用elasticSearch比较多,但是elasticSearch底层是Lucene实现的,所以就尝试玩一下lucene。 首先看一下全文检索的概念(摘抄自别处,具体的地方找不到了,以前记的笔记): 将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。 例如:字典。字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有音节表

wb785074651的博客 543

Lucene 全文检索实践

Lucene 全文检索实践(1)Lucene 是 Apache Jakarta 的一个子项目,是一个全文检索的搜索引擎库。其提供了简单实用的 API,通过这些 API,可以自行编写对文件(TEXT/XML/HTML等)、目录、数据库的全文检索程序。Features:* Very fast indexing, minimal RAM required* Index compression t

608
上一篇: 一个针对初学者的自学顺序推荐
下一篇: 个人工作13年的一些人生真实领悟
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值