Lucene 通配符匹配在化学符号上失败(?)

2024-02-13

使用 Hibernate 搜索注释(大部分只是@Field(index = Index.TOKENIZED))我已经索引了一些与我的名为“Compound”的持久类相关的字段。我已经使用以下命令对所有索引字段设置了文本搜索MultiFieldQueryParser http://lucene.apache.org/java/2_9_3/api/core/index.html?org/apache/lucene/queryParser/MultiFieldQueryParser.html,到目前为止效果很好。

在已索引和可搜索的字段中有一个名为compoundName 的字段,其示例值:

  • 3-Hydroxyflavone
  • 6,4'-Dihydroxyflavone

当我完整搜索这些值中的任何一个时,将返回相关的复合实例。但是,当我使用部分名称并引入通配符时会出现问题:

  • 寻找3-Hydroxyflav*仍然给出正确的命中,但是
  • 寻找6,4'-Dihydroxyflav*找不到任何东西。

现在,由于我对 Lucene / Hibernate 搜索还很陌生,所以我不太确定在哪里看这一点。我认为这可能与'存在于第二个查询中,但我不知道如何继续。我应该研究 Tokenizers/Analyzers/QueryParsers 还是完全其他的东西?

或者谁能​​告诉我如何让第二个通配符搜索匹配,最好不破坏多字段搜索行为?

我正在使用 Hibernate-Search 3.1.0.GA 和 Lucene-core 2.9.3。


一些相关的代码位来说明我当前的方法:

索引复合类的相关部分:

@Entity
@Indexed
@Data
@EqualsAndHashCode(callSuper = false, of = { "inchikey" })
public class Compound extends DomainObject {
    @NaturalId
    @NotEmpty
    @Length(max = 30)
    @Field(index = Index.TOKENIZED)
    private String                  inchikey;

    @ManyToOne
    @IndexedEmbedded
    private ChemicalClass           chemicalClass;

    @Field(index = Index.TOKENIZED)
    private String                  commonName;
...
}

我目前如何搜索索引字段:

String[] searchfields = Compound.getSearchfields();
MultiFieldQueryParser parser = 
    new MultiFieldQueryParser(Version.LUCENE_29, searchfields, new StandardAnalyzer(Version.LUCENE_29));
FullTextSession fullTextSession = Search.getFullTextSession(getSession());
FullTextQuery fullTextQuery = 
    fullTextSession.createFullTextQuery(parser.parse("searchterms"), Compound.class);
List<Compound> hits = fullTextQuery.list();

使用 WhitespaceAnalyzer 而不是 StandardAnalyzer。它只会在空格处分割,而不是在逗号、连字符等处分割。(但它不会将它们小写,因此您需要构建自己的空格+小写字母链,假设您希望搜索不区分大小写)。如果您需要对不同的字段执行不同的操作,则可以使用 PerFieldAnalyzer。

您不能将其设置为未标记化,因为这会将您的整个文本正文解释为一个标记。

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

Lucene 通配符匹配在化学符号上失败(?) 的相关文章

随机推荐

  • 使用 Flutter 在谷歌地图中添加标记

    我已经成功在我的 flutter 应用程序中创建了一个谷歌地图 并且我能够显示我的位置以及使用纬度和经度的标记 有谁知道如何为谷歌地图中已存在的企业创建标记 我应该向标记传递什么来识别已经在谷歌地图中的企业 谢谢 您可以使用地点搜索 htt
  • 如何使用 ssh 在 Heroku 上保持日志尾部处于活动状态?

    Using heroku logs tail这几分钟效果很好 然后它停止显示日志 看来 ssh 连接超时并终止 没有错误或消息 在 Ubuntu 11 04 中使用有线连接 我将以下内容添加到 ssh config 中 ServerAliv
  • 绘制逻辑回归的决策边界

    我正在尝试实施逻辑回归 我已将特征映射到 x1 2 x2 0 x1 1 x2 1 形式的多项式 现在我想绘制相同的决策边界 经历了这一切之后answer https stackoverflow com a 22356551 1783688我
  • SQL 查询游程长度或连续相同值编码

    我的目标是获取一组按顺序排序的数据id并返回一个结果集 该结果集指示连续行数val列是相同的 例如 鉴于此数据 id val 1 33 2 33 3 44 4 28 5 44 6 44 我想看到这个结果 id val run length
  • 多页 tiff 的简单 WPF 页面选择

    我正在制作一个基本的 Tiff 查看器 需要能够选择要查看的页面 在 Winforms 中 我可以使用 selectActiveFrame 所以我想知道是否有一个与此等效的 WPF 谢谢 编辑 在winforms中 我在selectActi
  • 如何使用boto读取S3上的二进制文件?

    我在 S3 文件夹 私人部分 中有一系列 Python 脚本 Excel 文件 如果它们是公开的 我可以通过 HTTP URL 读取访问它们 想知道如何以二进制方式访问它们以执行它们 FileURL URL of the File host
  • Android Phonegap:$.ajax 不会触发未经授权的回调(401)

    我正在使用 PhoneGap 构建 Android 应用程序 使用 jQuery 或 Zepto 我可以使用 ajax 调用来调用网站 API 然而 当网站返回 401 未经授权 响应时 ajax 调用似乎没有回调 没有调用 成功 错误 或
  • 在 Angular 的 Bower 组件中包含 html 模板

    我正在为我的角度应用程序制作一些可重用的指令 方法是将它们放入单独的 Bower 组件中 我想使用 templateUrl 作为指令 这样我就不会被迫执行本文中的三个选项之一 如何在我的 Angular 指令 Bower 包中使用单独的模板
  • SQL Server 条件 JOIN 语句

    是否可以执行以下操作 IF a 1234 THEN JOIN ON TableA ELSE JOIN ON TableB 如果是这样 正确的语法是什么 我认为您所要求的通过加入Initial两个表Option A and Option B
  • 如何准确读取一行?

    我有一个 Linux 文件描述符 来自套接字 我想读取一行 如何在 C 中做到这一点 如果您正在从 TCP 套接字读取数据 您无法假设何时到达行尾 因此你需要这样的东西 std string line char buf 1024 int n
  • 如何以编程方式向 iOS 地址簿添加“自定义标签”?

    在 iOS 地址簿中手动添加联系人的电话 IMS 时 您可以添加自定义标签 而不是 家庭 工作 其他 在 IMS 中 如何以编程方式在AddressBook中创建 自定义标签 我也有同样的问题 我找不到答案 所以我只是尝试猜测和检查方法 以
  • 获取matlab中fit函数的函数句柄并分配fit参数

    我正在将自定义函数拟合到我的数据中 获得拟合后 我想获得类似拟合函数的函数句柄之类的东西 包括设置为拟合找到的参数的参数 我知道我可以得到模型 formula fit 我可以通过以下方式获取参数 coeffvalues fit 但有没有什么
  • 为每个文件调用 Inno Setup AfterInstall 函数

    我想在安装文件夹后调用一个函数 但是InstallEnv函数似乎被调用了几次 也许每个文件都是文件夹 待确认 有没有办法在安装所有这些文件后只调用一次 我无法使用Run部分 因为我想用返回代码进行错误捕获 Source InputFiles
  • 使用 useRef 响应滚动导航

    我正在尝试制作一个单页应用程序 您单击链接 它会向下滚动到与菜单项对应的部分 我花了几天时间研究适合我标准的修复方案 不幸的是 我运气不佳 我的标准如下 无外部依赖 地址栏中必须包含 URL 以允许直接链接到特定部分 不能是 hacky 即
  • 关于默认捕获模式和 C++ lambda 表达式中的“this”的限制

    我想知道为什么 捕获默认值模式禁止this in 捕获列表 of C 拉姆达表达式 That is this error this OK 这是由 C 11 5 1 2 8 指定的 如果 lambda capture 包含捕获默认值 则 la
  • Firebase Functions 1.0.0 迁移:使用 Google 服务帐户凭据自定义initializeApp() 时出现问题

    我刚刚从 beta v0 9 1 更新到 v1 0 0 并遇到了一些初始化问题 根据迁移指南 https firebase google com docs functions beta v1 diff new initialization
  • 操作栏徽标左内边距

    操作栏在徽标左侧显示一个空格 我认为这个空间是为upindicator保留的 例如 我想给这个空间指定 20dp 的距离 我怎样才能做到这一点 我可以将图标的内边距设置为 0 但这不会消除徽标和屏幕左侧之间的空间 我尝试通过使用自定义布局来
  • SQL Server Express 2017 安装失败 [0x851A001A]

    安装 SQL Server 已经让我痛苦了好几个小时了 我无法得到任何工作 我设置了一个全新安装的 Windows Server 2016 虚拟机 并尝试安装 SQL Server Express 我按照建议将用户设置为网络服务here h
  • 为什么在未提供祖先的情况下查询不返回结果?

    为什么在未指定祖先时过滤器不起作用 无论祖先如何 它是否都应该适用于实体类型 我的用例 我已经设置了多个带有父键的实体 该键与另一个实体 主实体 相对应 以便我可以通过祖先 主实体键 获取子级 然而问题似乎是我无法再查询实体属性 除非我指定
  • Lucene 通配符匹配在化学符号上失败(?)

    使用 Hibernate 搜索注释 大部分只是 Field index Index TOKENIZED 我已经索引了一些与我的名为 Compound 的持久类相关的字段 我已经使用以下命令对所有索引字段设置了文本搜索MultiFieldQu