Hibernate搜索如何正确搜索UUID

时间:2016-03-21 20:20:01

标签: java hibernate lucene hibernate-search

我使用PatternTokenizerFactory将UUID正确索引为整个单词,例如024bb09c-86b4-4d73-8483-bf7839e407d8

但是在搜索时,带有此完整字符串的查询将返回错误,

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,我们的原始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;

1 个答案:

答案 0 :(得分:0)

我终于想出了一个解决方案,即明确指定用于ID查询的KeywordAnalyzer。找到它有点棘手,因为最初我使用Hibernate Search DSL代码来构建查询,但是使用专用分析器我只能使用Lucene Parser找到代码。

这是一个片段,

            QueryParser parser = new QueryParser(Version.LUCENE_31, "instanceId", new KeywordAnalyzer());
            try {
                Query lucene = parser.parse(keyword);
            }

我只是将此查询添加到通过Hibernate Search DSL构建的其他查询中。