2016-03-21 37 views
0

我有UUID通过使用PatternTokenizerFactory正确索引为一个完整的单词,例如024bb09c-86b4-4d73-8483-bf7839e407d8休眠搜索如何正确搜索UUID

但搜索时,这种满弦的查询将返回一个错误,

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(); 

编辑:

下面是用于索引的分析,我们的原料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; 
+0

你看过这篇文章http://stackoverflow.com/questions/12753642/searching-for-uuid-in-lucene-not-working? – Filip

+0

请分享实体映射,至少如何将id编入索引。 – Sanne

+0

听起来像这样的问题可能是,一旦分析器完成它,查询就没有了。你的分析仪是什么样的? – femtoRgon

回答

0

我终于想出了一个解决方案,它明确指定一个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内置的其他问题。