用Lucene建立搜索索引

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。

在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中,以提供强大的搜索功能。 在这里查看

1.简介

该索引是利用Lucene的任何组件的核心。 就像书籍的索引一样,它组织所有数据,以便可以快速访问。 索引由包含一个或多个字段的文档组成。 文档和字段可以代表我们选择的任何内容,但一个常见的隐喻是:文档表示数据库表中的条目,而字段类似于表中的字段。

2.了解索引操作

让我们看一下Lucene搜索索引的图形表示。

图1

图1

简而言之,当Lucene对文档进行索引时,它会将其分解为许多术语。 然后,它将术语存储在索引文件中,其中每个术语与包含该术语的文档相关联。 我们可以把它当作一个哈希表。 术语是使用分析器生成的,该分析器将每个单词的词根都提取出来。 发出查询时,将通过用于构建索引的同一分析器来处理该查询,然后使用该分析器在索引中查找匹配项。 这提供了与查询匹配的文档列表。

现在,让我们看一下整个Lucene搜索过程。

基本概念是索引,文档,字段和术语。

  1. 索引包含文档的集合。
  2. 文档是字段的集合。
  3. 字段是术语的集合。
  4. 术语是成对的字符串<field,term-string>。

2.1倒排索引

索引存储有关术语的统计信息,以使基于术语的搜索更加高效。 Lucene的索引属于称为反向索引的索引族。 这是因为它可以长期列出包含它的文档。 这与文档中列出术语的自然关系相反。

2.2字段类型

在Lucene中,可以存储字段,在这种情况下,它们的文本将以非反转的方式按字面意义存储在索引中。 反转的字段称为索引。 字段可以被存储和被索引。

可以将字段的文本标记为要索引的术语,或者可以将字段的文本从字面上用作要索引的术语。 大多数字段都是标记化的,但有时对于某些标识符字段按字面意义进行索引很有用。

2.3细分

Lucene索引可以由多个子索引或段组成。 每个段都是完全独立的索引,可以分别进行搜索。 索引按以下方式演变:

  1. 为新添加的文档创建新的细分。
  2. 合并现有的细分。
  3. 搜索可能涉及多个段和/或多个索引,每个索引可能由一组段组成。

2.4文件编号

在内部,Lucene通过整数文档号引用文档。 添加到索引的第一个文档编号为零,并且随后添加的每个文档的编号都比前一个大。

请注意,文档编号可能会更改,因此在将这些编号存储在Lucene之外时应格外小心。 特别是,在以下情况下数字可能会更改:

存储在每个段中的数字仅在该段内是唯一的,并且必须进行转换才能在更大的上下文中使用它们。 标准技术是根据该段中使用的数字范围为每个段分配一个值范围。 要将文档编号从段转换为外部值,需要添加段的基本文档编号。 要将外部值转换回特定于细分的值,可以通过外部值所在的范围来标识细分,然后减去细分的基值。 例如,可以合并两个五个文档的段,以便第一个段的基值为零,第二个为五个。 第二段的文档三的外部值为8。

删除文档后,在编号中会留出空白。 随着索引通过合并的发展,这些最终被删除。 合并段时删除已删除的文档。 因此,新合并的段在编号上没有间隙。

2.5搜索索引

搜索索引由javascript函数定义。 它以类似于视图的地图功能的方式运行在所有文档上,并定义了搜索可查询的字段。 搜索索引是数据库的一种变体。 它与RDBMS相似,因为它需要快速查找密钥,但是大部分数据驻留在辅助存储上。

3.创建索引

到目前为止,我们已经看到了Lucene索引的所有组成部分。 在本节中,我们将使用Lucene索引创建文档索引。

考虑一个项目,学生在其中提交年度杂志文章。 输入控制台包含学生姓名,文章标题,文章类别和文章正文的选项。 我们假设该项目正在网络上运行并且可以通过它进行访问。 要为这篇文章建立索引,我们需要文章本身,作者的姓名,撰写日期,文章的主题,文章的标题以及文件所在的URL。 利用这些信息,我们可以构建一个程序,该程序可以正确索引文章以使其易于查找。

让我们看一下我们类的基本框架,包括我们将需要的所有导入。

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits; 

import java.util.Date; 

public class ArticleIndexer { 

}

我们需要添加的第一件事是将文章转换为Document对象的方法。

为此,我们将使用方法createDocument()

private Document createDocument(String article, String author,
                                    String title, String topic,
                                    String url, Date dateWritten) { 

        Document document = new Document();
        document.add(Field.Text("author", author));
        document.add(Field.Text("title", title));
        document.add(Field.Text("topic", topic));
        document.add(Field.UnIndexed("url", url));
        document.add(Field.Keyword("date", dateWritten));
        document.add(Field.UnStored("article", article));
        return document;
    }

首先,我们创建一个新的Document对象。 接下来要做的是将文章的不同部分添加到Document 。 我们为每个部分提供的名称完全是任意的,并且像HashMap键一样工作。 使用的名称必须是String 。 Document的add方法将采用一个Field对象,该对象是使用Field类提供的静态方法之一构建的。 提供了四种将Field对象添加到Document的方法。

Field.Keyword –数据已存储并建立索引,但未标记化。 这对于应保留不变的数据(例如日期)最有用。 实际上,Field.Keyword可以将Date对象作为输入。

Field.Text –数据被存储,索引和标记化。 Field.Text字段不应用于诸如文章本身之类的大量数据,因为索引将变得非常大,因为它将包含文章的完整副本以及标记化的版本。

Field.UnStored –不存储数据,但对其进行索引和标记化。 大量数据(例如文章的文本)应放置在未存储的索引中。

Field.UnIndexed –数据已存储但未建立索引或标记化。 它与要与搜索结果一起返回的数据一起使用,但实际上不会在该数据上进行搜索。 在我们的示例中,由于我们不允许搜索URL,因此没有理由对其进行索引,但是我们希望在找到搜索结果后将其返回给我们。

现在我们有了一个Document对象,我们需要获得一个IndexWriter来将此Document写入索引。

String indexDirectory = "lucene-index"; 

    private void indexDocument(Document document) throws Exception {
        Analyzer analyzer  = new StandardAnalyzer();
        IndexWriter writer = new IndexWriter(indexDirectory, analyzer, false);
        writer.addDocument(document);
        writer.optimize();
        writer.close();
    }

我们首先创建StandardAnalyzer ,然后使用分析器创建IndexWriter 。 在构造函数中,我们必须指定索引将驻留的目录。 构造函数末尾的布尔值告诉IndexWriter是创建新索引还是添加到现有索引。 在将新文档添加到现有索引时,我们将指定false。 然后,我们将Document添加到索引。 最后,我们优化然后关闭索引。 如果要添加多个Document对象,则应始终进行优化,然后在将所有Document对象都添加到索引之后关闭索引。

现在,我们只需要添加一种将各个部分组合在一起的方法即可。

为了驱动索引​​操作,我们将编写一个indexArticle()一些参数的方法indexArticle()

public void indexArticle(String article, String author,
                             String title, String topic,
                             String url, Date dateWritten)
                             throws Exception {
        Document document = createDocument(article, author,
                                           title, topic,
                                           url, dateWritten);
        indexDocument(document);
    }

对文章运行该文章会将其添加到索引中。 将IndexWriter构造函数中的布尔值更改为true会创建一个索引,因此我们应该在第一次创建索引时以及每次要从头开始重建索引时使用它。 现在我们已经构建了索引,我们需要在索引中搜索文章。

索引存储为单个目录中的一组文件。

索引由任意数量的独立段组成,这些段存储有关已索引文档子集的信息。 每个段都有自己的术语词典,术语词典索引和文档存储(存储的字段值)。 所有段数据都存储在_xxxxx.cfs文件中,其中xxxxx是段名称。

创建索引段文件后,将无法对其进行更新。 新文档将添加到新段中。 删除的文档仅在可选的.del文件中标记为已删除。

4.基本索引操作

索引数据

Lucene让我们可以索引文本格式的任何可用数据。 Lucene几乎可以用于任何数据源,只要可以从中提取文本信息即可。 我们可以使用Lucene对存​​储在HTML文档,Microsoft Word文档,PDF文件等中的数据进行索引和搜索。 索引数据的第一步是使其以简单文本格式可用。 可以使用自定义解析器和数据转换器。

索引过程

索引编制是将文本数据转换为便于快速搜索的格式的过程。 一个简单的类比是您在书末找到的索引:该索引将您指向书中出现的主题的位置。

Lucene将输入数据存储在称为反向索引的数据结构中,该数据结构作为一组索引文件存储在文件系统或内存中。 大多数Web搜索引擎使用反向索引。 它使用户可以执行快速的关键字查找,并找到与给定查询匹配的文档。 在将文本数据添加到索引之前,它需要由分析器处理(使用分析过程)。

分析

分析将文本数据转换为基本的搜索单位,称为术语。 在分析过程中,文本数据会经历多种操作:提取单词,删除常用单词,忽略标点符号,将单词简化为词根形式,将单词更改为小写字母等。分析仅在索引和查询解析之前进行。 分析将文本数据转换为标记,并将这些标记作为术语添加到Lucene索引中。

Lucene带有各种内置分析器,例如SimpleAnalyzerStandardAnalyzerStopAnalyzerSnowballAnalyzer等。 它们在标记文本和应用过滤器的方式上有所不同。 由于分析会在索引编制之前删除单词,因此会减小索引大小,但会对查询处理的精度产生负面影响。 通过使用Lucene提供的基本构建块创建自定义分析器,可以对分析过程进行更多控制。 表1显示了一些内置分析仪及其处理数据的方式。

4.1核心索引类

目录

代表索引文件存储位置的抽象类。 通常主要使用两个子类:

FSDirectory —目录的实现,在实际的文件系统中存储索引。 这对于大索引很有用。

RAMDirectory —将所有索引存储在内存中的实现。 这适用于较小的索引,这些索引可以完全加载到内存中,并在应用程序终止时销毁。 由于索引保存在内存中,因此速度相对较快。

分析仪

如所讨论的,分析器负责预处理文本数据并将其转换为存储在索引中的令牌。 IndexWriter接受用于对数据建立索引之前对其进行标记化的分析器。 为了正确地为文本建立索引,您应该使用适合需要被索引的文本语言的分析器。

默认分析器适用于英语。 Lucene沙箱中还有其他一些分析器,包括中文,日文和韩文的分析器。

IndexDeletionPolicy

用于实现自定义从索引目录中删除过时提交的策略的接口。 默认的删除策略是KeepOnlyLastCommitDeletionPolicy ,它仅保留最新的提交,并在完成新提交后立即删除所有先前的提交。

索引作家

创建或维护索引的类。 它的构造函数接受一个布尔值,该布尔值确定是创建新索引还是打开现有索引。 它提供了添加,删除或更新索引中文档的方法。

对索引所做的更改最初会在内存中进行缓冲,并定期刷新到索引目录。 IndexWriter公开了几个字段,这些字段控制索引在内存中的缓冲方式以及如何将其写入磁盘。 除非调用IndexWriter的commit或close方法,否则对IndexReader不到对索引所做的更改。 IndexWriter为目录创建一个锁定文件,以防止索引同时更新导致索引损坏。 IndexWriter允许用户指定可选的索引删除策略。

4.2将数据添加到索引

将文本数据添加到索引涉及两个类。

字段表示在搜索中查询或检索的一条数据。 Field类封装一个字段名称及其值。 Lucene提供了一些选项来指定是否需要对字段进行索引或分析以及是否需要存储其值。 在创建字段实例时可以传递这些选项。 下表显示了字段元数据选项的详细信息。

选项 描述
Field.Store.Yes 用于存储字段的值。 适用于显示搜索结果的字段,例如文件路径和URL。
Field.Store.No 字段值未存储-例如,电子邮件正文。
Field.Index.No 适用于未搜索的字段-通常与存储的字段(例如文件路径)一起使用。
Field.Index.ANALYZED 用于索引但未分析的字段。 它完整​​地保留了字段的原始值,例如日期和个人名称。
Field.Index.NOT_ANALYZED 用于索引但未分析的字段。 它完整​​地保留了字段的原始值,例如日期和个人名称。

字段元数据选项的详细信息

而文档是字段的集合。 Lucene还支持增强文档和字段,如果要重视某些索引数据,这是一个有用的功能。 为文本文件建立索引包括将文本数据包装在字段中,创建文档,使用字段填充文本,以及使用IndexWriter将文档添加到索引中。

5.文件和领域

如您先前所见,文档是索引和搜索过程的单元。

5.1文件

文档是一组字段。 每个字段都有一个名称和一个文本值。 字段可以与文档一起存储,在这种情况下,它会随文档的搜索命中一起返回。 因此,每个文档通常应包含一个或多个唯一标识它的存储字段。

您将文档添加到索引,并且在执行搜索之后,您将获得结果列表,它们是文档。 文档只是字段的非结构化集合。

5.2领域

字段是Lucene.net的实际内容所有者:它们基本上是一个哈希表,具有名称和值。 如果我们拥有无限的磁盘空间和无限的处理能力,那就是我们所需要知道的。 但是不幸的是,磁盘空间和处理能力受到限制,因此您不能仅分析所有内容并将其存储到索引中。 但是Lucene.net提供了将字段添加到索引的不同方法。

Lucene提供了四种不同类型的字段供开发人员选择: KeywordUnIndexedUnStoredText 。 您应该使用哪种字段类型取决于您要如何使用该字段及其值。

关键字字段未标记,但被逐字索引并存储在索引中。 此字段适用于原始值应完整保留的字段,例如URL,日期,个人姓名,社会保险号,电话号码等。

未索引字段既没有标记也没有索引,但它们的值存储在逐字索引中。 该字段适用于需要与搜索结果一起显示但绝不会直接搜索其值的字段。 由于未对这种类型的字段建立索引,因此对其进行搜索很慢。 由于此类型的字段的原始值存储在索引中,因此如果存在索引大小的问题,则此类型不适合存储具有非常大值的字段。

未存储字段与未索引字段相反。 此类型的字段已标记并建立索引,但未存储在索引中。 此字段适用于索引大量不需要以其原始形式检索的文本,例如网页正文或任何其他类型的文本文档。

文本字段被标记,索引并存储在索引中。 这意味着可以搜索此类型的字段,但请注意存储为“文本”字段的字段的大小。

如果您回顾一下LuceneIndexExample类,您将看到我使用了Text字段:

document.add(Field.Text("fieldname", text));

如果要更改字段fieldname的类型,我们将调用Field类的其他方法之一:

document.add(Field.Keyword("fieldname", text));

要么

document.add(Field.UnIndexed("fieldname", text));

要么

document.add(Field.UnStored("fieldname", text));

尽管Field.TextField.KeywordField.UnIndexedField.UnStored调用最初看起来像是对构造函数的调用,但它们实际上只是对不同Field类方法的调用。 表1总结了不同的字段类型。

现场方法/类型 代币化 索引 已储存
Field.Keyword(String, String) 没有
Field.UnIndexed(String, String) 没有 没有
Field.UnStored(String, String) 没有
Field.Text(String, String)
Field.Text(String, Reader) 没有

表1:不同字段类型的概述。

5.3在Lucene中增强文档

在“信息检索”中,文档与搜索的相关性通过与查询的相似程度来衡量。 Lucene中实现了几种相似性模型,您可以通过扩展相似性类并使用Lucene保存的索引统计信息来实现自己的相似性模型。 还可以为文档分配静态分数,以表示它们在整个语料库中的重要性,而与正在执行的查询无关,例如其受欢迎程度,评分或PageRank。

在Lucene 4.0之前,您可以通过调用document.setBoost为文档分配静态分数。 在内部,通过将字段的提升因子乘以文档的提升因子,将提升应用于文档的每个字段。 但是,这永远无法正常工作,并且取决于所执行查询的类型,可能根本不会影响文档的排名。

通过向Lucene添加DocValues,增强文档就像添加NumericDocValuesField并将其用于CustomScoreQuery一样简单, CustomScoreQuery会将计算出的分数乘以“ boost”字段的值。 下面的代码示例说明了如何实现此目的:

// add two documents to the index
Document doc = new Document();
doc.add(new TextField("f", "test document", Store.NO));
doc.add(new NumericDocValuesField("boost", 1L));
writer.addDocument(doc); 

doc = new Document();
doc.add(new TextField("f", "test document", Store.NO));
doc.add(new NumericDocValuesField("boost", 2L));
writer.addDocument(doc); 

// search for 'test' while boosting by field 'boost'
Query baseQuery = new TermQuery(new Term("f", "test"));
Query boostQuery = new FunctionQuery(new LongFieldSource("boost"));
Query q = new CustomScoreQuery(baseQuery, boostQuery);
searcher.search(q, 10);

通过编写一个简单的公式,新的Expressions模块也可以用于增强文档,如下所示。 尽管它比使用CustomScoreQuery更为冗长,但它通过计算更复杂的公式(例如sqrt(_score)+ ln(boost))变得微不足道。

Expression expr = JavascriptCompiler.compile("_score * boost");
SimpleBindings bindings = new SimpleBindings();
bindings.add(new SortField("_score", SortField.Type.SCORE));
bindings.add(new SortField("boost", SortField.Type.LONG));
Sort sort = new Sort(expr.getSortField(bindings, true));
searcher.search(baseQuery, null, 10, sort);

既然Lucene允许在不重新索引文档的情况下更新NumericDocValuesField ,那么您可以将频繁更改的字段(受欢迎程度,评分,价格,最后修改时间…)并入提升因子中,而无需每次对其中任何一个更改时都重新索引文档。

翻译自: https://www.javacodegeeks.com/2015/09/building-a-search-index-with-lucene.html

AU混响终极指南:从‘干声’到‘空间感’,用总音轨和发送技巧打造专业人声 本文详细介绍了如何在Adobe Audition(AU)中使用混响效果器,通过总音轨和发送技巧将‘干声’转化为具有专业‘空间感’的人声。从混响基础原理到总线架构设置,再到精细控制和自动化调整,全面解析了提升音频质量的实用技巧,适用于音乐制作、播客和内容创作。 阅读详情

相关推荐

Lucene的配置和创建索引——全文检索服务器

全文检索是一种常见的搜索技术,它可以在大量文本数据中快速查找相关信息。Lucene是一个强大的开源全文检索引擎,它能够高效地创建索引和执行搜索操作。本文将介绍如何配置Lucene,并演示如何使用Lucene创建索引和构建一个简单的全文检索服务器。

OUDKE的博客 239

lucene详细说明文档

以下部门功能在lucene5以上版本可能有的API所有改变 目录 1.简介 2.了解索引操作 2.1倒排索引 2.2字段类型 2.3细分 2.4文件编号 ...

dreamzuora的博客 1507

基于分水岭分割进行肺癌诊断

近年来,肺癌的发病率和病死率均迅速上升,目前已居所有癌症之首。随着肺癌病人数量的增加,医生对肺部 CT 图像进行研判的工作量也增加了不少,在这种情况下难免工作效率降低甚至会出现误诊。为了帮助医生减少重复性工作,对肺部 CT 图像进行计算机辅助检测的技术就被广泛应用于对肺癌的诊断和治疗过程中。医学 CT 图像处理主要是研究医学图像中的器官和组织之间的关系,并进行病理性分析。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1524

Lucene构建索引的原理及源代码分析

Lucene是apache软件基金会 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。​ 在讲全文检索之前,我们先聊下数据的分类。那么什么是数据呢?提起数据,大家可能会说数据库里存的就是数据。.....

u013978512的博客 3344

Lucene.Net创建索引

首先创建索引 string indexPath = @"D:\my.net\test";//注意和磁盘上文件夹的大小一致,否则会报错。将创建的分词内容放在该目录下。             FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory());//指定

NuClear的.Net专栏 2085

基于Lucene搜索引擎的建立

一、基础知识 1、索引概念 索引建立:数据——>分词——>索引创建 搜索过程:获取关键字——>分词——>检索索引——>返回结果 2、索引数学模型 词元的权重计算:文档中的每个词元都对应一个权重 空间向量模型:将每个词元可以对应为空间中的一个向量 检索:将关键字依旧放入空间中,相当于求与目的词元之间的夹角 3、Lucene索引文件结构 二、Lucene的使用 1、创建索引

san_rx的博客 1266

lucene建立索引搜索,中文分词

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包。 现在最新的lucene已经更新到6.0版本了。但是这个最新版,需要适配jdk1.80以上的版本。 所以我这里用的5.5.1的版本的,它对jdk没有这么高的要求,比较适应开发。下面分三步简单的将lucene建立索引搜索,中文分词,介绍给大家。 用到的包: 一,建立索引

young_so_nice的博客 5446

Lucene总结-索引】2.lucene建立搜索初步

上一篇我们介绍并下载了lucene,而且使用lucene对指定文件夹下的文件建立索引建立索引进行了以下步骤的操作: 1、创建了存储索引索引库Directory,用来放置索引文件 2、创建IndexWriter对象,用来索引 3、指定一个分词器,用于分词 4、加载需要解析的数据源(目标文档) 5、为每个文件创建Document对象,并添加Field 6、将Document对象添加文档到索引库...

程序猿之洞 609

Lucene建立索引然后搜索的小Demo

packagejunitTest; importjava.io.IOException; importjava.io.StringReader; importorg.apache.lucene.analysis.Analyzer; importorg.apache.lucene....

chunrenrong2587的博客 170

Lucene.net对数据库建立索引搜索

 用Lucene.net对数据库建立索引搜索       最近我一直在研究 Lucene.net ,发现Lucene.net对数据库方面建索引的文章在网上很少见,其实它是可以对数据库进行索引的,我闲着没事,了个测试程序,竟然成功了, 可以实现对数据另类查询的一种方式(通过建索引查询),发表出来,和大家共享.   其实 Lucene.net 对数据库索引很简单,只要把数据表里面的记

水上漂的专栏 6312

通过 Lucene.Net 支持的 .NET 索引搜索引擎的高效使用与探索:Examine 的简单索引搜索数据应用以及其可扩展性分析

Lucene.Net 是 Apache Lucene 的 .NET 实现,它是一种开源的全文搜索引擎工具库,而不是一个完整的搜索引擎。它可以用于任何应用程序中需要全文搜索的地方。Lucene.Net 是非常强大的,但也是非常底层的,如果你直接使用它,可能需要编和维护大量的代码。而 Examine 则是建立Lucene.Net 之上的,它提供了一套更高层级的API,让开发者能更方便、快捷地使用 Lucene.Net 进行数据的索引搜索

qq_38334677的博客 4269

Lucene.net搜索——创建索引

介绍lucene索引工具前我先介绍两个重要的非常重要的类:Document和Field。 Document和真实存在硬盘中的文件是没有任何关系的,它只是向Lucene提供原始的要索引的文件的内容,也是就索引的操作都是基于Document来操作的。 我个人有个不太恰当但是非常好记忆的方法,把Document当作一个数据库,而其中的Field当作是数据中的某个字段。 现在有个商品管理系统,存放...

weixin_30535167的博客 173

Lucene创建索引

引入相关jar包 <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.12.1</version> </dependency> <dependency>

qq_29188567的博客 839

Lucene.Net索引建立

建立索引前,先了解下lucene中的一些与索引相关的重要类。为了对文档进行索引Lucene 提供了五个基础的类,他们分别是 Document, Field, IndexWriter, Analyzer, Directory。下面我们分别介绍一下这五个类的用途:DocumentDocument 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。

寒色博客 5571

Lucene总结-索引】3.lucene索引创建-域选项

上两篇我们介绍了Lucene的基本概念,以及针对一些目标文件编了创建索引以及建立搜索的代码。以后的的总结文章,将从细节方面深入探究索引搜索、分词以及特殊操作这几个方面的知识。 一、创建索引和相关域 下面我们要学习索引的一些重要特性,首先我们新建一个Java工程,名为Lucene_index: 还是在工程下放入相关依赖,并添加至编译环境: 然后我们新建一个IndexUtil工具类,用来编我...

程序猿之洞 1208

Map和String互相转换

Map to String Set<String> keySet = map.keySet(); //将set集合转换为数组 String[] keyArray = keySet.toArray(new String[keySet.size()]); //给数组排序(升序) Arrays.sort(keyArray); //因为String拼接效率会很低的,所以转用StringBuilder

luyo027的博客 1061

使用Lucene.NET实现全文检索的简单示例

在上面的示例中,我们使用RAMDirectory创建一个内存中的索引,并使用StandardAnalyzer对文本进行分析。在上面的示例中,我们使用IndexSearcher搜索索引,并使用QueryParser解析搜索查询。我们搜索包含“全文检索”关键词的文档,并限制搜索结果为10个。使用Lucene.NET搜索索引,可以检索与搜索查询匹配的文档。使用Lucene.NET创建索引,可以将文本数据存储在索引中。总的来说,使用Lucene.NET或其他全文检索引擎可以轻松地实现C#应用程序中的全文检索功能。

qqqq5701的专栏 826

Lucene.Net初识(2)

 Lucene.net 系列四 --- index 下本文将介绍有关索引并发控制的问题,以结束对Lucene.net建立索引问题的讨论. 1. 允许任意多的读操作并发.即可以有任意多的用户在同一时间对同一份索引做查询工作. 2. 允许任意多的读操作在索引被正在被修改的时候进行.即哪怕索引正在被优化,添加删除文档,这时也是允许用户对索引进行查询工作. (it’s so cool.)

西洋樱草的专栏 1449

Lucene.net对数据库建立索引搜索2

其实 Lucene.net 对数据库索引很简单,只要把数据表里面的记录读出来,然后对每个字段索引就行了.本文中数据库的内容是某个博客表-userblog表。 1.表结构: 字段名称 字段类型 字段含义 id Varchar(11) 编号 title ...

weixin_30287169的博客 156

Lucene文档

Lucene文档 全文检索是一种将文件中所有文本与检索项匹配的检索方法。它可以根据需要获得全文中有关章、节、段、句、词等信息。计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时根据建立索引查找,类似于通过字典的检索字表查字的过程。 Lucene使用中几个比较关键的地方,首先,Lucene会先用分词器Analyzer将一篇文章分成许多个词...

WHY_HelloWorld的博客 1230

监控视频中的真实世界异常检测CVPR2018UCF-Crime数据集

监控视频中的真实世界异常检测是计算机视觉领域的重要研究方向,广泛应用于安全监控和智能城市等领域。CVPR是计算机视觉领域的顶级国际会议,每年发布前沿研究成果。2018年提出的UCF-Crime数据集为该领域提供了重要资源,由中佛罗里达大学创建,包含大量真实监控视频,涵盖街道、商场、停车场等场景,并标注了异常事件如抢劫、打斗、盗窃等。异常检测技术旨在自动识别偏离正常行为模式的事件,以提高公共安全。DeepMIL是一种用于处理此类问题的深度学习框架,将每个视频视为一个“袋”,由多个视频帧组成,通过学习区分正常和异常帧来训练模型。其步骤包括数据预处理、特征提取、多实例学习、模型训练、异常检测和结果评估。实际应用中还需考虑实时性、鲁棒性和计算资源限制,研究人员通过优化算法提升系统表现。该方法结合UCF-Crime数据集,为异常检测研究提供了宝贵的数据资源和解决方案,推动了该领域的技术进步和实际应用。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!

上一篇: 如何优化Hibernate EllementCollection语句
下一篇: dbunit使用_使用dbUnit,JSON,HSQLDB和JUnit规则进行数据库单元测试
dnc8371
博客等级 码龄11年 421粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值