我使用Hibernate Search索引了我的数据库。我使用自定义分析器,用于索引和查询。我有一个名为inchikey的字段,不应该被标记化。示例值为:
当我用Luke查看我的索引时,我可以根据需要确认它们没有被标记化。
然而,当我尝试使用网络应用程序搜索它们时,会发现一些寸数,而其他则没有。奇怪的是,对于这些英寸游戏,当我在没有最后一个连字符的情况下进行搜索时搜索能够正常工作,如下所示:BBBAWACESCACAP-UHFFFAOYSA N
我无法在找不到的寸声中找到共同的元素。
知道这里发生了什么吗?
我使用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。
答案 0 :(得分:2)
事实证明输入文件中的最后一个条目没有被正确编入索引。这些都被标记化了。实际上,似乎它们被索引了两次:一次没有被标记化,一次被用。当我搜索时,我找不到未标记的。
我还没有找到原因,但我认为它可能与我们的解析器结束有关,而Lucene仍在索引最后的条目,因此Lucene恢复到默认的分析器(StandardAnalyzer)。当我找到罪魁祸首时,我会在这里报告。
将@Analyzer(impl = ChemicalNameAnalyzer.class)添加到字段可以解决问题,但我想要的是我的原始设置,默认分析器在config中定义一次,如下所示:
<property name="hibernate.search.analyzer">path.to.ChemicalNameAnalyzer</property>