【问题标题】:Why is Lucene sometimes not matching InChIKeys?为什么 Lucene 有时与 InChIKeys 不匹配?
【发布时间】:2011-03-29 08:46:19
【问题描述】:

我已经使用 Hibernate Search 为我的数据库建立了索引。我使用自定义分析器,用于索引和查询。我有一个名为 inchikey 的字段不应被标记化。示例值为:

  • BBBAWACESCACAP-UHFFFAOYSA-N
  • KEZLDSPIRVZOKZ-AUWJEWJLSA-N

当我使用 Luke 查看我的索引时,我可以确认它们没有按要求进行标记。

但是,当我尝试使用网络应用程序搜索它们时,会找到一些 inchikeys,而另一些则没有。奇怪的是,对于这些 inchikeys,当我在没有最后一个连字符的情况下进行搜索时,搜索确实有效,如下所示:BBBAWACESCACAP-UHFFFAOYSA N

我无法在未找到的 inchikeys 中找到共同元素。

知道这里发生了什么吗?

我使用 MultiFieldQueryParser 搜索数据库中的不同字段:

    String[] searchfields = Compound.getSearchfields();
    MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_29, Compound.getSearchfields(), new ChemicalNameAnalyzer());
    //Disable the following if search performance is too slow
    parser.setAllowLeadingWildcard(true);
    FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(parser.parse("searchterms"), Compound.class);
    List<Compound> hits = fullTextQuery.list();

Tim 和 I 已在 here 上发布了有关我们设置的更多详细信息。

【问题讨论】:

  • 一些背景信息:“InChIKey,有时称为散列 InChI,是 InChI 的固定长度(25 个字符)压缩数字表示,人类无法理解。InChIKey 规范有助于 Web搜索化合物,因为这些对于全长 InChI 来说是有问题的。”

标签: java lucene hibernate-search hyphen


【解决方案1】:

原来输入文件中的最后一个条目没有被正确索引。这些正在被标记化。事实上,它们似乎被索引了两次:一次没有被标记化,一次被标记化。当我搜索时,我找不到未标记的。

我还没有找到原因,但我认为这可能与我们的解析器结束有关,而 Lucene 仍在索引最后的条目,结果 Lucene 恢复为默认分析器(StandardAnalyzer)。当我找到罪魁祸首时,我会在这里报告。

将@Analyzer(impl = ChemicalNameAnalyzer.class) 添加到字段可以解决问题,但我想要的是我的原始设置,在配置中定义一次默认分析器,如下所示:

<property name="hibernate.search.analyzer">path.to.ChemicalNameAnalyzer</property>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多