为什么Lucene有时不匹配InChIKeys?

ni65a41a  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(166)

我已经使用Hibernate搜索为我的数据库建立了索引。我使用了一个定制的分析器,既用于建立索引,也用于查询。我有一个名为inchikey的字段,它不应该被标记化。示例值如下:

  • BBBAWACESCAP-UHFFFAOYSA-N(巴西棕榈油)
  • 密封垫圈

当我和Luke一起查看我的索引时,我可以确认它们没有按照要求进行标记化。
然而,当我尝试使用网络应用程序搜索它们时,一些inchikeys被找到,而另一些则没有。奇怪的是,对于这些inchikeys,当我搜索时没有最后一个连字符时,搜索确实有效,如下所示:BBBAWACESCAP-UHFFFAOYSA N(巴西棕榈油)
我还没有能够找到一个共同的元素在inchikey是没有找到。
知道这是怎么回事吗?
我使用一个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和我发布here

kyks70gy

kyks70gy1#

事实证明,输入文件中的最后一个条目没有被正确索引。这些条目正在被标记化。事实上,它们似乎被索引了两次:一次没有标记化,一次带有。当我搜索时,我找不到未标记化的。
我还没有找到原因,但我认为这可能与我们的解析器在Lucene仍在索引最后的条目时结束有关,结果Lucene恢复到默认的分析器(StandardAnalyzer)。当我找到罪魁祸首时,我会在这里报告。
在字段中添加@Analyzer(impl = ChemicalNameAnalyzer.class)可以解决这个问题,但我需要的是我的原始设置,在config中定义一次默认分析器,如下所示:

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

相关问题