Lucene,索引已经/外部标记化的标记并定义自己的分析过程

2024-05-10

在使用Lucene的过程中,我有点失望。我不明白或不明白我应该如何继续为任何 Lucene 分析器提供已经可直接索引的东西。或者我应该如何继续创建我自己的分析器......

例如,如果我有一个List<MyCustomToken>,其中已经包含许多令牌(实际上还有更多有关大小写等的信息,我还想将其索引为每个 MyCustomToken 上的功能)

如果我很好地理解了我所读到的内容,我需要对分析器进行子类化,它将调用我自己的分词器对 TokenStream 进行子类化,其中我只需要提供public final boolean incrementToken()这将完成插入的工作TermAttribute@ 位置。

顺便说一句,这就是我感到困惑的地方 => 这个 TokenStream 是 java.io.Reader 的子类,因此只能分析流对象,例如文件、字符串......

我怎样才能继续拥有自己的文档分析器来消耗我的列表而不是这个流式的?

看起来整个 Lucene API 是建立在这样的想法之上的:它首先从一个非常低的级别开始分析“字符”的观点,而我需要稍后开始使用它/从已经标记化的单词甚至表达式(组)中插入的单词)。

Lucene 使用的典型示例如下(取自here http://www.lucenetutorial.com/lucene-in-5-minutes.html) :

StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);

// 1. create the index
Directory index = new RAMDirectory();

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, analyzer);

IndexWriter w = new IndexWriter(index, config);
addDoc(w, "Lucene in Action");   // BUT here i would like to have a addDoc(w, MyOwnObject)
addDoc(w, "Lucene for Dummies");
addDoc(w, "Managing Gigabytes");
addDoc(w, "The Art of Computer Science");
w.close();

[...]   

private static void addDoc(IndexWriter w, String value) throws IOException {
  Document doc = new Document();
  doc.add(new Field("title", value, Field.Store.YES, Field.Index.ANALYZED));
  // SO that i can add here my own analysis base on many fields, with them built from a walk through List or complex structures...
  w.addDocument(doc);
}

ps :(我的 java/lucene 知识仍然很差,所以我可能错过了一些关于 Reader List 模式的明显内容?)

这个问题和我的几乎一样在 lucene 列表中 http://lucene.472066.n3.nabble.com/Apply-custom-tokenization-tt3803765.html#none

EDIT: @ 吉尔斯·范格普=>是的,你说得很对,这是我想到的另一个问题,但首先希望找到一个更优雅的解决方案。因此,如果继续,我仍然可以进行某种序列化,将这个序列化字符串作为文档提供给我自己的分析器,以及自己的分词器,然后反序列化并重新进行一些基本分词(实际上,只需遍历已经完成的分词) ...)顺便说一句,它会添加一些我想避免的较慢且愚蠢的额外步骤...

关于这一部分 => 有人有最近(Lucene >3.6)自定义分词器的样本吗?它提供了 Lucene 索引所需的所有基础数​​据?我读过有关发出令牌的信息:

        posIncrement.setPositionIncrement(increment); 
        char[] asCharArray = myAlreadyTokenizedString.toCharArray(); // here is my workaround 
        termAttribute.copyBuffer(asCharArray, 0, asCharArray.length); 
        //termAttribute.setTermBuffer(kept); 
        position++; 

对于我为什么在这里部分,这是因为我使用了一些外部库,它们对我的文本进行标记,进行一些词性注释和其他分析(人们可能会想到表达识别或命名实体识别,也可以包括关于大写等的一些特殊功能,我想在 Lucene 索引中跟踪(我感兴趣的真正部分是Indexing and Querying,不是分析的第一步,它几乎来自 Lucene 库,仅对我所读到的内容进行标记)。

(另外,我不认为我可以从这些先前/早期的步骤中做一些更聪明的事情,因为我使用许多不同的工具,并非所有工具都是 Java 或可以轻松包装到 Java)

所以我认为这有点悲伤,Lucene 的目标@处理文本是如此受限于单词/标记(字符序列),而文本不仅仅是单个/孤立的单词/标记的并置......


而不是尝试实现类似的东西addDoc(w, MyOwnObject),你能用MyOwnObject.toString()并实施一个@Override String toString()在你的MyOwnObject class?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lucene,索引已经/外部标记化的标记并定义自己的分析过程 的相关文章

随机推荐

  • 该捆绑包无效。 Apple 目前不接受使用此版本操作系统构建的应用程序。 (小牛队)

    我首先说我已经安装了 Mavericks 我很好奇看到新功能 最好还是等待 因为 显然 没有什么耸人听闻的变化 无论如何 我正在尝试将我的应用程序提交到应用程序商店 但经过与代码签名的真正艰苦斗争后 我最终得到了以下消息 此捆绑包无效 Ap
  • 如何在 Vanilla JS 中使用 Apollo Client 创建 GraphQL 订阅

    最近 Apollo Client 发布了 websocket 订阅功能 但到目前为止我只看到它通过在 componentWillMount 生命周期钩子中使用 subscribeToMore 启动查询来使用 这是一个来自的例子https d
  • mvc 中的模型(最佳实践,PHP)

    我知道有很多关于 MVC 和最佳实践的文章和问题 但我找不到这样的简单示例 假设我必须用 PHP 开发一个 Web 应用程序 我想遵循 MVC 模式 没有框架 该应用程序应该有一个简单的书籍 CRUD 我想从控制器获取我商店中的所有书籍 保
  • Python 3 - 编码/解码与字节/Str [重复]

    这个问题在这里已经有答案了 我是 python3 的新手 来自 python2 我对 unicode 基础知识有点困惑 我读过一些很好的帖子 这让一切变得更加清晰 但是我看到 python 3 上有两种方法可以处理编码和解码 但我不确定使用
  • 从内核空间中的块设备读取

    我正在编写一个内核模块 需要从现有的块设备执行读取 dev 东西 有谁知道有任何其他模块可以执行这些操作 我可以用作参考吗 欢迎任何指点 Linux 2 6 30 如果你真的绝对必须那么使用filp open filp close vfs
  • 使用 versioneer 和 GitHub 更新版本号

    我在用versioneer适用于多个 GitHub 托管的 Python 项目 看来 versioneer 已安装并且工作正常 我可以调用project version 但是我忘记了如何更新版本号的过程 如果有什么东西在setup cfg
  • 解决复合赋值中的转换警告

    在我的代码中有很多variable lt lt 1 句子哪里variable类型为 uint16 t 编译器发出警告说 从 int 转换为 uint16 t 可能会改变其值 Wconversion 我该如何解决 我可以使用长格式的符号 例如
  • Java 相当于不变文化

    我正在将以下 C 代码转换为 Java Java 中是否存在与 NET 中的文化不变概念相当的概念 string upper myString ToUpperInvariant 由于不变文化实际上只是美国文化 我可以在 Java 中做类似的
  • laravel Blade 模板不渲染

    进入 Laravel 后 我尝试使用 Blade 模板 但它没有渲染 我的所有示例都来自 Laravel 文档 UPDATE 所以这是我的master blade php 文件位于资源 gt 视图 gt master blade php y
  • svn:修订版本中不存在路径

    我想在颠覆中创建标签 在命令行上我尝试了以下操作 svn复制http myserver mycompany com 8080 svn SVN Main trunk http myserver mycompany com 8080 svn S
  • Ruby 对象打印为指针

    我正在尝试创建一个类 它有一个带有单个参数的构造函数 当我创建该对象的新实例时 它返回一个指针 class Adder def initialize my num my num my num end end y Adder new 12 p
  • GAE是无状态的吗?有什么影响?

    我曾经被告知 GAE 是无国籍的 我总体上理解无状态的概念 但我可以使用一些指导来从概念上将其应用于 GAE 类型的系统 我专门问这个问题是因为我开发的一个应用程序似乎存在干扰问题 也就是说 当两个或更多人同时使用它时 它就会变得混乱 我正
  • 调整回形针大小以适合矩形框

    我有一个矩形图像 例如 30x800 像素 如何用回形针缩放它以保留 100x100 像素图像的纵横比 并用边框填充空白区域 一个例子 http www imagemagick org Usage thumbnails pad extent
  • 如何从实体框架 6 中的 Auditlog 实体获取 id

    我知道那里有几个类似的帖子 但我找不到任何解决此问题的帖子 我想在实体框架 6 中添加 更改或删除实体 软删除 时添加 某种 AudioLog 我已经覆盖了 SaveChanges 因为我只想为添加 修改或删除的 EntityStates
  • 随机森林修剪

    我有 sklearn 随机森林回归器 它非常重 有 1 6 GB 并且在预测值时工作很长时间 我想把它修剪一下 让它变得更轻 据我所知 决策树和森林没有实施修剪 我无法自己实现它 因为树代码是用 C 编写的 而我不知道 有谁知道解决方案吗
  • LINQ 函数的顺序重要吗?

    基本上 正如问题所述 LINQ 函数的顺序是否重要 表现 显然 结果仍然必须相同 Example myCollection OrderBy item gt item CreatedDate Where item gt item Code g
  • 如何从 Azure webjob 到 Azure webapp 进行通信?

    我正在运行 Azure Web 作业和 Azure Web 应用程序 该作业定期运行 并且 Web 应用程序需要作业的结果 我如何在那里得到结果 我尝试过使用 WCFnetNamedPipeBinding但由于 Azure webapps
  • Vapor - 更新用户属性返回“前提条件失败 - id.exists”

    我尝试将 UUID 添加到用户模型上的 UUID 数组属性 但它返回 前提条件失败 id exists 我正在使用数据库更新而不是创建或保存 使用 PostgresSQL 作为数据库 错误位于 FluentKit gt Model gt M
  • 使用 PRODUCT_NAME 构建 cocoapods 项目的 xcodebuild 失败

    我可以使用以下命令构建我的 Cocoapods 项目 base basename xcworkspace xcworkspace xcodebuild sdk iphonesimulator ios version CONFIGURATIO
  • Lucene,索引已经/外部标记化的标记并定义自己的分析过程

    在使用Lucene的过程中 我有点失望 我不明白或不明白我应该如何继续为任何 Lucene 分析器提供已经可直接索引的东西 或者我应该如何继续创建我自己的分析器 例如 如果我有一个List