索引库java,索引库中搜索-搜索引擎-Java学习网-Powered by www.javalearns.com

核心提示:2.1.IndexSearcher在索引库中进行搜索是使用类IndexSearcher。创建其实例的构造方法为:IndexSearcher (Directory path)。用完后要调用IndexSe...

2.1.IndexSearcher

在索引库中进行搜索是使用类IndexSearcher。创建其实例的构造方法为:IndexSearcher (Directory path)。用完后要调用IndexSearcher.close()方法释放资源。

2.2.通过QueryParser解析用户的查询字符串进行搜索

1,QueryParser与MultiFieldQueryParser

查询分析器,处理用户输入的查询条件。把用户输入的非格式化检索词转化成后台检索可以理解的Query对象。使用的构造方法为:QueryParser(Version matchVersion, String f, Analyzer a)

2,MultiFieldQueryParser

是QueryParser的子类。与父类相比,MultiFieldQueryParser可以在多个属性中搜索。使用的构造方法为:MultiFieldQueryParser(Version matchVersion, String[] fields, Analyzer analyzer)

2.3.通过构建各种Query对象进行查询(Query的子类)

Query:抽象类,必须通过一系列子类来表述检索的具体需求。

TermQuery

关键词查询

NumericRangeQuery

范围查询。使用静态方法构造实例:

newIntRange(final String field,

Integer min, Integer max,

final boolean minInclusive, final boolean maxInclusive)

newLongRange(final String field,

Long min, Long max,

final boolean minInclusive, final boolean maxInclusive)

newFloatRange(final String field,

Float min, Float max,

final boolean minInclusive, final boolean maxInclusive)

newDoubleRange(final String field,

Double min, Double max,

final boolean minInclusive, final boolean maxInclusive)

WildcardQuery

通配符查询

PhraseQuery

短语查询

public void add(Term term, int position)

public void setSlop(int s)

例:add( new Term(“name”, “lucene”, 1);

add(new Term(“name”, “教程”, 3);

代表搜索的是“Lucene ? 教程”,?表示中间隔一个词。

setSlop(2);[如果指定了多个词,则是各个词之间的隔的数量的的和]

代表这两个词中间可以最多隔2个词

BooleanQuery

public void add(Query query, Occur occur)

Occur 用于表示布尔查询子句关系的类,包括:

Occur.MUST,Occur.MUST_NOT,Occur.SHOULD。

1,MUST和MUST:取得连个查询子句的交集。

2,MUST和MUST_NOT:包含MUST并且查询结果中不包含MUST_NOT的检索结果。

3,SHOULD与SHOULD,表示“或”关系,最终检索结果为所有检索子句的并集。

使用时注意:

1,单独使用MUST_NOT:无意义,检索无结果。(也不报错)

2,单独使用SHOULD:结果相当于MUST。

3,SHOULD和MUST_NOT: 此时SHOULD相当于MUST,结果同MUST和MUST_NOT。

4,MUST_NOT和MUST_NOT:无意义,检索无结果。(也不报错)

5,MUST和SHOULD:此时SHOULD无意义,结果为MUST子句的检索结果。

// 关键词查询

@Test

public void testTermQuery() { }

// 范围查询

@Test

public void testRangeQuery() { }

// 通配符查询

@Test

public void testWildcardQuery() { }

// 短语查询

@Test

public void testPhraseQuery() { }

// 布尔查询

@Test

public void testBooleanQuery() { }

2.4.支持分页

3.排序(相关度排序与自定义排序)

通过改变文档Boost值来改变排序结果。Boost是指索引建立过程中,给整篇文档或者文档的某一特定属性设定的权值因子,在检索时,优先返回分数高的。通过Document对象的setBoost()方法和Field对象的setBoost()方法,可以分别为Document和Field指定Boost参数。不同在于前者对文档中每一个域都修改了参数,而后者只针对指定域进行修改。默认情值为1F,一般不做修改。

使用Sort对象定制排序。Sort支持的排序功能以文档当中的域为单位,通过这种方法,可以实现一个或者多个不同域的多形式的值排序。时间类型的属性采用STRING常量。

3.1.按相关度排序

1,相关度得分是在查询时根据查询条件实进计算出来的

2,如果索引库据不变,查询条件不变,查出的文档得分也不变

3.2.按指定的字段排序

If you want to be able to sort results by a Field value, you must add it as a Field that is indexed but not analyzed, using  Field.Index.NOT_ANALYZED.

4.过滤(Filter)

使用Filter可以对搜索结果进行过滤以获得更小范围的结果。使用Filter对性能的影响很大(有可能会使查询慢上百倍)。

使用NumericRangeFilter。也可使用相应的查询实现一样的效果。

5.高亮(Highlight)

需要的jar包为:

contrib\highlighter\lucene-highlighter-3.0.1.jar

contrib\memory\lucene-memory-3.0.1.jar

// 生成高亮器

Formatter formatter = new SimpleHTMLFormatter("", "");

Scorer scorer = new QueryScorer(query);

Highlighter highlighter = new Highlighter(formatter, scorer);

highlighter.setTextFragmenter(new SimpleFragmenter(20));

// 使用高亮器:对content属性值进行摘要并高亮

String text = highlighter.getBestFragment(LuceneUtils.getAnalyzer(), "content", doc.get("content"));

// 如果进行高亮的属性值中没有要搜索的关键字,则返回null

if (text != null) {

doc.getField("content").setValue(text);

}

6.Analyzer(分词器:结构与常用的中文分词器)

6.1.分词器结构

在创建索引与搜索时要使用同一个分词器。

分词器的一般工作流程:

1,切分关键词

2,去除停用词

对于英文单词,一般要还做[1,英文单词的形态还原]:

1,英文单词的所有字母转为小写

说明:形态还原,是去除单词词尾的形态变化,将其还原为词的原形。这样做可以搜索出更多有意义的结果。如搜索sutdent时,也可以搜索出students,这是很有用的。

6.2.停用词

有些词在文本中出现的频率非常高,而且对文本所携带的信息基本不产生影响,例如英文的“a、an、the、of”,或中文的“的、了、着”,以及各种标点符号等,这样的词称为停用词(stop word)。文本经过分词之后,停用词通常被过滤掉,不会被进行索引。在检索的时候,用户的查询中如果含有停用词,检索系统也会将其过滤掉(因为用户输入的查询字符串也要进行分词处理)。排除停用词可以加快建立索引的速度。

6.3.对英文的的处理

6.4.中文分词器

中文的分词比较复杂,因为不是一个字就是一个词,而且一个词在另外一个地方就可能不是一个词,如在“帽子和服装”中,“和服”就不是一个词。对于中文分词,通常有三种方式:单字分词、二分法分词、词典分词。

单字分词:就是按照中文一个字一个字地进行分词。如:“我们是中国人”,

效果:“我”、“们”、“是”、“中”、“国”、“人”。(StandardAnalyzer就是这样)。

二分法分词:按两个字进行切分。如:“我们是中国人”,效果:“我们”、“们是”、“是中”、“中国”、“国人”。(CJKAnalyzer就是这样)。

词库分词:按某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。通常词库分词被认为是最理想的中文分词算法。如:“我们是中国人”,效果为:“我们”、“中国人”。(使用极易分词的MMAnalyzer。可以使用“极易分词”,或者是“庖丁分词”分词器、IKAnalyzer)。

其他的中文分词器有:

1,极易分词:MMAnalyzer,最后版本是1.5.3,更新时间是2007-12-05,不支持Lucene3.0

2,庖丁分词:PaodingAnalzyer,最后版本是2.0.4,更新时间是2008-06-03,不支持Lucene3.0

中文分词器使用IKAnalyzer,主页:http://www.oschina.net/p/ikanalyzer。

实现了以词典为基础的正反向全切分,以及正反向最大匹配切分两种方法。IKAnalyzer是第三方实现的分词器,继承自Lucene的Analyzer类,针对中文文本进行处理。具体的使用方式参见其文档。

注意:扩展的词库与停止词文件要是UTF-8的编码,并且在要文件头部加一空行。

6.5.测试分词器

private void testAnalyzer(Analyzer analyzer, String text) throws Exception {

System.out.println("当前使用的分词器:" + analyzer.getClass());

TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(text));

tokenStream.addAttribute(TermAttribute.class);

while (tokenStream.incrementToken()) {

TermAttribute termAttribute = tokenStream.getAttribute(TermAttribute.class);

System.out.println(termAttribute.term());

代码下载地址: https://pan.quark.cn/s/a4b39357ea24 在计算机视觉技术中,数据集扮演着训练和评估模型的核心角色。Labelme作为一个广受欢迎的开源工具,能够支持用户以交互方式对图像进行标注,而COCO(Common Objects in Context)则是一种被广泛采纳的数据集标准格式,适用于包括物体检测、图像分割在内的多种任务。本文将详细阐述如何将Labelme生成的标注数据转换为COCO数据集的标准格式。 Labelme标注的图像在输出为JSON格式时,会包含以下核心内容: 1. `version`: 指明JSON文件的版本信息。 2. `flags`: 目前未定义或保持为空,预留用于未来的功能扩展。 3. `shapes`: 列表形式存储对象的形状信息,每个形状项包含`label`(对象类别名称),`points`(构成对象边缘的多边形顶点),以及`shape_type`(通常为“polygon”)。 4. `imagePath`和`imageData`: 提供原始图像的存储路径和二进制数据,便于后续图像的还原。 5. `imageHeight`和`imageWidth`: 明确标注图像的垂直和水平尺寸。 COCO数据集的标准格式中定义了三种主要的标注类型: 1. Object instances(目标实例):主要用于执行物体检测任务。 2. Object keypoints(目标上的关键点):适用于人体姿态估计相关应用。 3. Image captions(看图说话):用于生成图像的文本描述。 COCO的JSON结构中包含以下基本组成部分: 1. `images`:记录图像的基本属性,包括`height`(高度)、`...
内容概要:本文围绕基于Basisformer模型的时间序列锂离子电池SOC(State of Charge,荷电状态)预测展开研究,利用PyTorch深度学习框架构建并训练模型,旨在提升锂电池SOC估计的准确性与鲁棒性。该方法融合Transformer架构的核心机制,通过引入基函数(Basis)分解策略,有效捕捉电池充放电过程中长时序、非线性动态特征,增强模型对复杂工况的适应能力。研究不仅详细阐述了Basisformer的网络结构设计、注意力机制优化与训练流程,还提供了完整的Python代码实现方案,涵盖数据预处理、模型搭建、损失函数定义、训练验证及结果可视化等环节,便于科研人员快速复现、调优并拓展至其他电池状态预测任务。; 适合人群:具备一定深度学习与Python编程基础,熟悉PyTorch框架,从事电池管理系统(BMS)、新能源汽车、储能系统、智能传感等领域的高校研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于动力电池与储能系统的实时SOC估算模块,提升系统安全性与能量利用效率;②作为学术研究的基础模型,用于复现、改进基于Transformer的时间序列预测方法在电化学系统中的应用;③为数据驱动的电池健康状态(SOH)、剩余使用寿命(RUL)联合估计提供可扩展的技术框架。; 阅读建议:建议读者结合所提供的代码与公开电池数据集(如NASA、CALCE等)进行动手实践,深入理解模型的输入输出结构与时序建模逻辑,同时可尝试引入温度、老化周期等多维特征,或融合物理模型构建混合预测架构,以进一步提升预测精度与泛化能力。
内容概要:本文系统阐述了基于动态规划算法优化插电式混合动力电动汽车(PHEV)能源管理的技术方案,结合Matlab与Simulink工具实现完整的仿真建模与代码开发。通过动态规划这一全局优化方法,在已知驾驶循环条件下,精确求解发动机、电机及电池之间的最优能量分配策略,以实现燃油消耗与排放的最小化目标,解决PHEV多能源路径规划中的复杂决策问题。文中提供了详尽的仿真模型构建流程与算法实现步骤,涵盖车辆动力学建模、能量管理架构设计、状态空间定义、代价函数构造、最优控制律求解及结果可视化分析等关键环节,全面揭示PHEV能量管理系统的内在机制与优化逻辑。; 适合人群:具备一定Matlab/Simulink编程基础,从事新能源汽车、智能控制、电力电子、自动化或交通运输工程等相关领域的研究生、科研人员及工程技术人员,尤其适合专注于车辆能量管理策略、节能控制算法研究的专业人士。; 使用场景及目标:①深入掌握动态规划在混合动力汽车能量管理中的理论基础与工程实现方法;②学习如何在Matlab/Simulink环境中搭建PHEV整车仿真平台并实施多目标优化仿真;③为学术研究、学位论文撰写或实际工程项目提供可复用的算法框架、模型模板与技术支持,支撑后续对等效燃油消耗最小化策略(ECMS)、模型预测控制(MPC)、实时优化算法等的对比研究与性能评估。; 阅读建议:建议读者结合所提供的完整代码与Simulink模型文件,逐模块调试运行,重点理解状态变量离散化处理、前后向递推求解过程、惩罚项设置以及边界条件处理等核心技术细节,同时可进一步拓展应用于不同工况场景、不同车型结构或与其他优化算法(如庞特里亚金极小值原理PMP)的对比验证,从而深化对PHEV能量管理实时性与全局性平衡问题的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值