Hibernate Search 如何正确搜索UUID
Hibernate Search how to properly search UUID
我使用 PatternTokenizerFactory
将 UUID 作为一个完整的单词正确索引,例如 024bb09c-86b4-4d73-8483-bf7839e407d8
。
但是在搜索时,使用这个完整字符串的查询会return一个错误提示,
The query string '024bb09c-86b4-4d73-8483-bf7839e407d8' applied on field 'id' has no meaningfull tokens to be matched. Validate the query input against the Analyzer applied on this field.
这是否意味着我需要在准备查询时设置特定的分析器?
报这个错误的代码如下,
lucene = builder.keyword()
.onFields("id", "status", "submitter")
.matching(keyword)
.createQuery();
编辑:
这里是用来做索引的Analyzer,我们的raw id是group/UUID
的形式,所以我用PatternTokenizer去掉前缀,
@AnalyzerDef(
name = "idanalyzer",
tokenizer = @TokenizerDef(
factory = PatternTokenizerFactory.class,
params = {
@Parameter(name = "pattern", value = ".*/(.*)"),
@Parameter(name = "group", value = "1")
}
),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
}
)
这是实体中的代码,
@Id
@DocumentId
@Analyzer(definition = "idanalyzer")
private String id;
我终于想出了一个解决办法,就是显式指定一个KeywordAnalyzer
用于ID查询。找到它有点棘手,因为最初我使用 Hibernate Search DSL 代码来构建查询,但要使用专用分析器,我只能使用 Lucene Parser 找到代码。
这是一个片段,
QueryParser parser = new QueryParser(Version.LUCENE_31, "instanceId", new KeywordAnalyzer());
try {
Query lucene = parser.parse(keyword);
}
我只是将此查询添加到通过 Hibernate Search DSL 构建的其他查询中。
我使用 PatternTokenizerFactory
将 UUID 作为一个完整的单词正确索引,例如 024bb09c-86b4-4d73-8483-bf7839e407d8
。
但是在搜索时,使用这个完整字符串的查询会return一个错误提示,
The query string '024bb09c-86b4-4d73-8483-bf7839e407d8' applied on field 'id' has no meaningfull tokens to be matched. Validate the query input against the Analyzer applied on this field.
这是否意味着我需要在准备查询时设置特定的分析器?
报这个错误的代码如下,
lucene = builder.keyword()
.onFields("id", "status", "submitter")
.matching(keyword)
.createQuery();
编辑:
这里是用来做索引的Analyzer,我们的raw id是group/UUID
的形式,所以我用PatternTokenizer去掉前缀,
@AnalyzerDef(
name = "idanalyzer",
tokenizer = @TokenizerDef(
factory = PatternTokenizerFactory.class,
params = {
@Parameter(name = "pattern", value = ".*/(.*)"),
@Parameter(name = "group", value = "1")
}
),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
}
)
这是实体中的代码,
@Id
@DocumentId
@Analyzer(definition = "idanalyzer")
private String id;
我终于想出了一个解决办法,就是显式指定一个KeywordAnalyzer
用于ID查询。找到它有点棘手,因为最初我使用 Hibernate Search DSL 代码来构建查询,但要使用专用分析器,我只能使用 Lucene Parser 找到代码。
这是一个片段,
QueryParser parser = new QueryParser(Version.LUCENE_31, "instanceId", new KeywordAnalyzer());
try {
Query lucene = parser.parse(keyword);
}
我只是将此查询添加到通过 Hibernate Search DSL 构建的其他查询中。