我想使用elastic-search的建议功能来搜索自动补全。https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html它完全符合我的要求,但我找不到为该字段创建索引的方法。有用于搜索索引类型的FieldType
枚举类型,但它不包含suggest
类型,我看不到任何方法来扩展它。文档中没有任何关于这方面的内容。有没有可能通过hibernate-search来索引一些弹性的特定字段?
发布于 2019-02-26 17:40:27
详述我的评论:不,这在Hibernate Search 5中是不可能的,但是...
你可以自己实现自动补全。
定义一个分析器,该分析器具有一个用于索引的edge-ngram令牌过滤器和另一个用于查询的分析器,如here所述。
然后在要添加自动完成功能的字段上使用这些分析器:
@Field(name = "myField_autocomplete", analyzer = @Analyzer(definition = "edgeNGram"))
@Field(name = "dummy", analyzer = @Analyzer(definition = "edgeNGram_query")
String myField;
注意:由于Hibernate Search 5中的一些限制,"dummy“字段是必需的,以确保"edgeNGram_query”分析器在您的索引中可用。有关此攻击的详细信息,请参阅here。
然后重新索引您的数据。
然后,您将通过以下方式查询:
String userInput = ...;
QueryBuilder builder = fullTextEntityManager.getSearchFactory().buildQueryBuilder()
.forEntity(Contact.class)
.overridesForField("myField", "edgeNGram_query")
.get();
Query luceneQuery = builder.keyword().onField("myField").matching(userInput).createQuery();
FullTextQuery query = fullTextEntityManager.createQuery( luceneQuery, MyEntity.class );
List<MyEntity> results = query.getResultList();
注意,这些限制(不能使用suggest
类型,为了定义一个只查询的分析器而不得不修改)将在Hibernate Search 6中消失,它还在开发中。
https://stackoverflow.com/questions/54871428
复制相似问题