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


BBBAWACESCACAP-UHFFFAOYSA-N
KEZLDSPIRVZOKZ-AUWJEWJLSA-N


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

但是,当我尝试使用Web应用程序搜索它们时,找到了一些inchikey,而没有找到。奇怪的是,对于这些inchikeys,当我没有最后一个连字符进行搜索时,它们确实起作用了,因此:BBBAWACESCACAP-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和I在here上发布了有关我们设置的更多详细信息。

最佳答案

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

我尚未找到原因,但是我认为这可能与Lucene仍在索引最后一个条目时解析器的结束有关,因此Lucene还原为默认分析器(StandardAnalyzer)。当我找到罪魁祸首时,我将在这里报告。

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

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

10-06 02:38