我已经使用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>