我想使用 flex 搜索的建议功能进行自动完成。
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html
它完全符合我的要求,但是我找不到为该字段创建索引的方法。搜索索引类型有FieldType
枚举类型,但是它不包含suggest
类型,并且我看不到任何扩展它的方法。文档中对此一无所知。甚至有可能通过冬眠搜索来索引某些 flex 特定字段?
最佳答案
详细说明一下:不,这在Hibernate Search 5中是不可能的,但是...
您可以自己实现自动完成功能。
定义一个分析器,该分析器使用edge-ngram token 文件管理器进行索引,并使用另一个供查询,如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中消失。关于java - 如何将字段索引为建议类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54871428/