我想使用弹性搜索的建议功能进行自动完成。
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html
它完全符合我的要求,但是我找不到为该字段创建索引的方法。搜索索引类型有FieldType
枚举类型,但是它不包含suggest
类型,并且我看不到任何扩展它的方法。文档中对此一无所知。甚至有可能通过休眠搜索来索引某些弹性特定字段?
答案 0 :(得分:1)
详细说明一下:不,这在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中消失。