如何将字段索引为建议类型?

时间:2019-02-25 17:16:40

标签: java elasticsearch hibernate-search

我想使用弹性搜索的建议功能进行自动完成。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html 它完全符合我的要求,但是我找不到为该字段创建索引的方法。搜索索引类型有FieldType枚举类型,但是它不包含suggest类型,并且我看不到任何扩展它的方法。文档中对此一无所知。甚至有可能通过休眠搜索来索引某些弹性特定字段?

1 个答案:

答案 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中消失。