栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Hibernate Search:如何正确使用通配符?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Hibernate Search:如何正确使用通配符?

简短答案:请勿使用通配符查询,请使用带有的自定义分析器

EdgeNGramFilterFactory
。另外,不要尝试自己分析查询(这就是通过将查询分为术语来完成的):Lucene会做得更好(特别是使用
WhitespaceTokenizerFactory
,an
ASCIIFoldingFilterFactory
和a
LowercaseFilterFactory
)。

长答案:

通配符查询作为解决一次性问题的快速简便的方法很有用,但通配符不是很灵活,可以很快达到其极限。特别是,如@femtoRgon所述,不会对这些查询进行分析,因此,例如,大写查询将不匹配小写名称。

解决Lucene世界中大多数问题的经典解决方案是在索引时间和查询时间(不一定相同)使用特制的分析器。在您的情况下,您将需要在建立索引时使用这种分析器:

@AnalyzerDef(name = "edgeNgram",    tokenizer = @TokenizerDef(factory = WhitespaceTokenizerFactory.class),    filters = { @TokenFilterDef(factory = ASCIIFoldingFilterFactory.class), // Replace accented characeters by their simpler counterpart (è => e, etc.) @TokenFilterDef(factory = LowerCaseFilterFactory.class), // Lowercase all characters @TokenFilterDef(         factory = EdgeNGramFilterFactory.class, // Generate prefix tokens         params = {      @Parameter(name = "minGramSize", value = "1"),      @Parameter(name = "maxGramSize", value = "10")         } )    })

这种查询时:

@AnalyzerDef(name = "edgeNGram_query",    tokenizer = @TokenizerDef(factory = WhitespaceTokenizerFactory.class),    filters = { @TokenFilterDef(factory = ASCIIFoldingFilterFactory.class), // Replace accented characeters by their simpler counterpart (è => e, etc.) @TokenFilterDef(factory = LowerCaseFilterFactory.class) // Lowercase all characters    })

索引分析器会将“ Mauricio Ubilla Carvajal”转换为以下令牌列表:

  • m
  • ma
  • mau
  • maur
  • mauri
  • mauric
  • maurici
  • mauricio
  • u
  • ub
  • ubilla
  • C
  • ca
  • carvajal

然后查询分析器会将查询“ mau UB”转换为[“ mau”,“ ub”],这将与索引名称匹配(两个令牌都存在于索引中)。

请注意,您显然必须将分析器分配给该字段。对于索引部分,它是使用

@Analyzer
注释完成的。对于查询部分,你将不得不使用
overridesForField
的查询生成器如图所示在这里:

QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Hospital.class)    .overridesForField( "name", "edgeNGram_query" )    .get();// Then it's business as usual

还要注意,在Hibernate Search 5中,只有在将它们实际分配给索引的情况下,Elasticsearch分析器定义才由Hibernate
Search生成。因此,默认情况下不会生成查询分析器定义,Elasticsearch将抱怨它不知道分析器。这是一种解决方法:https :
//discourse.hibernate.org/t/cannot-find-the-overridden-analyzer-when-using-
overridesforfield/1043/4?u=yrodiere



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/399371.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号