第三百零二节 Lucene教程 - Lucene搜索文件

Lucene教程 - Lucene搜索文件

搜索过程是进行搜索的过程。

下表列出了在搜索过程中使用的类。

描述
IndexSearcher读取/搜索索引处理后创建的索引。
Term搜索的最低单位。它类似于索引过程中的字段。
Query抽象类,包含各种实用程序方法,是所有类型查询的父类。
TermQueryTermQuery是一个查询对象,我们可以使用它来创建许多复杂的查询。
TopDocsTopDocs存储前N个搜索结果。

例子

以下代码显示如何搜索索引的文件。

/** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements.  See the NOTICE file distributed with* this work for additional information regarding copyright ownership.* The ASF licenses this file to You under the Apache License, Version 2.0* (the "License"); you may not use this file except in compliance with* the License.  You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Date;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
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.store.FSDirectory;
import org.apache.lucene.util.Version;/** Simple command-line based search demo. */
public class Main {private Main() {}/** Simple command-line based search demo. */public static void main(String[] args) throws Exception {String usage ="Usage:\tjava SearchFiles [-index dir] [-field f] [-repeat n] [-queries file] [-query string] [-raw] [-paging hitsPerPage]\n\nSee http://lucene.apache.org/core/4_1_0/demo/ for details.";if (args.length > 0 && ("-h".equals(args[0]) || "-help".equals(args[0]))) {System.out.println(usage);System.exit(0);}String index = "index";String field = "contents";String queries = null;int repeat = 0;boolean raw = false;String queryString = null;int hitsPerPage = 10;for(int i = 0;i < args.length;i++) {if ("-index".equals(args[i])) {index = args[i+1];i++;} else if ("-field".equals(args[i])) {field = args[i+1];i++;} else if ("-queries".equals(args[i])) {queries = args[i+1];i++;} else if ("-query".equals(args[i])) {queryString = args[i+1];i++;} else if ("-repeat".equals(args[i])) {repeat = Integer.parseInt(args[i+1]);i++;} else if ("-raw".equals(args[i])) {raw = true;} else if ("-paging".equals(args[i])) {hitsPerPage = Integer.parseInt(args[i+1]);if (hitsPerPage <= 0) {System.err.println("There must be at least 1 hit per page.");System.exit(1);}i++;}}IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(index)));IndexSearcher searcher = new IndexSearcher(reader);// :Post-Release-Update-Version.LUCENE_XY:Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_10_0);BufferedReader in = null;if (queries != null) {in = new BufferedReader(new InputStreamReader(new FileInputStream(queries), StandardCharsets.UTF_8));} else {in = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));}// :Post-Release-Update-Version.LUCENE_XY:QueryParser parser = new QueryParser(Version.LUCENE_4_10_0, field, analyzer);while (true) {if (queries == null && queryString == null) {                        // prompt the userSystem.out.println("Enter query: ");}String line = queryString != null ? queryString : in.readLine();if (line == null || line.length() == -1) {break;}line = line.trim();if (line.length() == 0) {break;}Query query = parser.parse(line);System.out.println("Searching for: " + query.toString(field));if (repeat > 0) {                           // repeat & time as benchmarkDate start = new Date();for (int i = 0; i < repeat; i++) {searcher.search(query, null, 100);}Date end = new Date();System.out.println("Time: "+(end.getTime()-start.getTime())+"ms");}doPagingSearch(in, searcher, query, hitsPerPage, raw, queries == null && queryString == null);if (queryString != null) {break;}}reader.close();}/*** This demonstrates a typical paging search scenario, where the search engine presents * pages of size n to the user. The user can then go to the next page if interested in* the next hits.* * When the query is executed for the first time, then only enough results are collected* to fill 5 result pages. If the user wants to page beyond this limit, then the query* is executed another time and all hits are collected.* */public static void doPagingSearch(BufferedReader in, IndexSearcher searcher, Query query, int hitsPerPage, boolean raw, boolean interactive) throws IOException {// Collect enough docs to show 5 pagesTopDocs results = searcher.search(query, 5 * hitsPerPage);ScoreDoc[] hits = results.scoreDocs;int numTotalHits = results.totalHits;System.out.println(numTotalHits + " total matching documents");int start = 0;int end = Math.min(numTotalHits, hitsPerPage);while (true) {if (end > hits.length) {System.out.println("Only results 1 - " + hits.length +" of " + numTotalHits + " total matching documents collected.");System.out.println("Collect more (y/n) ?");String line = in.readLine();if (line.length() == 0 || line.charAt(0) == "n") {break;}hits = searcher.search(query, numTotalHits).scoreDocs;}end = Math.min(hits.length, start + hitsPerPage);for (int i = start; i < end; i++) {if (raw) {                              // output raw formatSystem.out.println("doc="+hits[i].doc+" score="+hits[i].score);continue;}Document doc = searcher.doc(hits[i].doc);String path = doc.get("path");if (path != null) {System.out.println((i+1) + ". " + path);String title = doc.get("title");if (title != null) {System.out.println("   Title: " + doc.get("title"));}} else {System.out.println((i+1) + ". " + "No path for this document");}}if (!interactive || end == 0) {break;}if (numTotalHits >= end) {boolean quit = false;while (true) {System.out.print("Press ");if (start - hitsPerPage >= 0) {System.out.print("(p)revious page, ");  }if (start + hitsPerPage < numTotalHits) {System.out.print("(n)ext page, ");}System.out.println("(q)uit or enter number to jump to a page.");String line = in.readLine();if (line.length() == 0 || line.charAt(0)=="q") {quit = true;break;}if (line.charAt(0) == "p") {start = Math.max(0, start - hitsPerPage);break;} else if (line.charAt(0) == "n") {if (start + hitsPerPage < numTotalHits) {start+=hitsPerPage;}break;} else {int page = Integer.parseInt(line);if ((page - 1) * hitsPerPage < numTotalHits) {start = (page - 1) * hitsPerPage;break;} else {System.out.println("No such page");}}}if (quit) break;end = Math.min(numTotalHits, start + hitsPerPage);}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460556.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哪个牌子的宠物空气净化器好?口碑好的宠物空气净化器推荐!

哪个牌子的宠物空气净化器好&#xff1f;作为一名家电测评博主&#xff0c;我发现市面上宠物空气净化器的牌子越来越多了&#xff0c;很多厂家都看中了宠物行业的红利&#xff0c;想来分一杯羹&#xff0c;这就导致很多技术不成熟的产品流入了市场。今年我测试了50多台宠物空气…

数据清理——确保数据质量的关键步骤

简介 在数据分析和机器学习中&#xff0c;数据清理是预处理过程中的重要一环。良好的数据清理能够提高数据的质量&#xff0c;从而提升模型的准确性和可靠性。本篇文章将深入探讨数据清理的几个关键知识点&#xff0c;包括缺失值处理、数据不一致问题和噪声处理。通过详细的概…

isp框架代码理解

一、整体框架如下&#xff1a; 1 外层的src中 1.1 从camera.c->task.c&#xff1a;封装了3层&#xff0c;透传到某个功能的本级。 1.2 core.c和capability.c中实现&#xff1a;开机初始化加载参数。2. plat/src中 2.1 fun.c中继task.c又透传了一层&#xff1b;以及最后功能…

状态机模型

文章目录 一、大盗阿福二、股票买卖 IV三、股票买卖 V四、设计密码4.1kmp题目4.2设计密码 一、大盗阿福 题目链接 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N 1e5 10; int f[N][2]; int main() {int…

MATLAB——矩阵操作

内容源于b站清风数学建模 数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/ 目录 1.MATLAB中的向量 1.1向量创建方法 1.2向量元素的引用 1.3向量元素修改和删除 2.MATLAB矩阵操作 2.1矩阵创建方法 2.2矩阵元素的引用 2.3矩阵…

一:Linux学习笔记(第一阶段)-- 安装软件 vmware workstation 虚拟机软件 centos系统

目录 学习计划&#xff1a; 资源准备 虚拟机软件&#xff1a;就别自己找了 现在换网站了 下载比较费劲 Centos8&#xff1a; 阿里云镜像地址下载&#xff08;下载比较版 但是有不同版本&#xff09;&#xff1a;centos安装包下载_开源镜像站-阿里云 百度网盘地址&#xff…

如何在Linux系统中使用Zabbix进行监控

如何在Linux系统中使用Zabbix进行监控 Zabbix简介 安装Zabbix 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 配置Zabbix数据库 创建数据库 导入数据库 配置Zabbix服务器 访问Zabbix Web界面 完成初始配置 配置Zabbix Agent 安装Agent 配置Agent 添加主机到Zabbix 创…

uniapp编译多端项目App、小程序,input框键盘输入后

项目场景&#xff1a; uniapp编译后的小程序端&#xff0c;app端 在一个输入框 输入消息后&#xff0c;点击键盘上的操作按钮之后键盘不被收起&#xff0c;点击其他发送按钮时&#xff0c;键盘也不被收起。 问题描述 在编译后的app上普通的事件绑定&#xff0c;tap,click在发…

代码随想录day15 二叉树(3)

文章目录 day11 栈与队列(2)栈与队列的总结 day13 二叉树&#xff08;1&#xff09;day14 二叉树&#xff08;2&#xff09;day15 二叉树&#xff08;3&#xff09; day11 栈与队列(2) 逆波兰表达式求值 https://leetcode.cn/problems/evaluate-reverse-polish-notation/ 逆…

【C#】搭建环境之CSharp+OpenCV

在我们使用C#编程中&#xff0c;对图片处理时会用到OpenCV库&#xff0c;以及其他视觉厂商提供的封装库&#xff0c;这里因为OpenCV是开源库&#xff0c;所以在VS资源里可以直接安装使用&#xff0c;这里简单说明一下搭建的步骤及实现效果&#xff0c;留存。 1. 项目创建 1.1…

环形运输距离Conveyor Belts

Conveyor Belts 题面翻译 传送带 题目描述 传送带 $ m_n $ 是一个大小为 $ n \times n $ 的矩阵&#xff0c;其中 $ n $ 是一个偶数。矩阵由顺时针移动的同心带组成。 换句话说&#xff0c;当 n 2 n2 n2 时&#xff0c;传送带矩阵就是一个 2 2 2 \times 2 22 的矩阵&a…

ffmpeg视频滤镜:添加边框-drawbox

滤镜介绍 drawbox 官网链接 > FFmpeg Filters Documentation 这个滤镜会给视频添加一个边框。 滤镜使用 参数 x <string> ..FV.....T. set horizontal position of the left box edge (default "0")y <string&…

CPU算法分析LiteAIServer视频智能分析平台噪声检测功能在视频监控中的应用与优势

在视频监控系统中&#xff0c;噪声问题一直是影响视频画面清晰度和可用性的关键因素。这些噪声可能源于多种因素&#xff0c;如低光环境、摄像机传感器的高灵敏度或编码压缩过程中的失真等。为了应对这些挑战&#xff0c;CPU算法分析LiteAIServer引入了噪声检测功能&#xff0c…

HTB:BoardLight[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many TCP ports are listening on BoardLight? 2.What is the domain name used by the box? 3.What is the name of the application running on a virtual host of board.htb? 4.What version of Dolibarr is running on Board…

mysql 5.7实现组内排序(连续xx天数)

需求&#xff1a;查询出连续登录的用户及其连续登录的天数 我先说一下思路&#xff1a;要实现连续登录的判断&#xff0c;可以找一下他们之间的规律。这里我拿一个用户来说&#xff0c;如果这个用户在1、2、3号都有登录记录&#xff0c;可以对这个用户的数据按照时间排序&…

★ Linux ★ 基础开发工具的使用(上)

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起学习 linux 基础开发工具的使用~ 目录 壹 Linux编辑器 - vim使用 1.1 vim的基本概念 1.2 vim正常模式命令集 1.2.1 插入模式 1.2.2 移动光标命令 1.2.3 编辑命令 1.3 vim末行模式命令集 贰 Lin…

solidworks学习6吊环-20241030

solidworks学习6吊环 图 1 使用到的命名&#xff1a;拉伸曲面&#xff0c;旋转曲面&#xff0c;镜像实体&#xff0c;剪裁曲面&#xff0c; 前视基准面绘制 图 2 绘制旋转轴 图 3 旋转曲面 图 4 上视基准面绘制&#xff0c;标准圆边尺寸的时候需要按住shift键标注&#x…

提示词高级阶段学习day4.1

第一步&#xff1a;你要有一个大模型帐号&#xff0c;至少已经熟悉和它们对话的方式。最强性能当属ChatGPT4&#xff0c;当然也推荐国产平替&#xff1a; Kimi.ai - 帮你看更大的世界 智谱清言 第二步&#xff1a;看 OpenAI 的官方文档&#xff1a; 目录&#xff1a;OpenAI …

开源趣味艺术画板Paint Board

什么是 Paint Board &#xff1f; Paint Board 是简洁易用的 Web 端创意画板。它集成了多种创意画笔和绘画功能&#xff0c;支持形状绘制、橡皮擦、自定义画板等操作&#xff0c;并可以将作品保存为图片。 软件功能&#xff1a; 不过非常可惜&#xff0c;老苏最期待的数据同步还…

建设NFS服务器并实现文件共享

关闭防火墙和s0 systemctl stop firewalld setenforce 0 安装NFS yum install nfs-utils -y 新建共享目录并设置权限 echo "hello" > /nfs/shared/test1 chmod -Rf 777 /nfs/shared/ 配置服务端的NFS配置文件 vim /etc/exports /nfs/shared *(ro) 启动…