【问题标题】:How to index field as suggest type?如何将字段索引为建议类型?
【发布时间】:2019-02-25 17:16:39
【问题描述】:

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

【问题讨论】:

  • suggest 不是类型而是功能,你可以在任何你想要的 es 索引类型上使用它。您可以使用 hibernate-search 客户端索引任何 json 是的。如果您想测试建议,只需索引一些文档(可能使用 curl),网上有很多教程(qbox.io/blog/…
  • several options 用于建议者(例如术语、短语、完成等),因此您的字段映射将取决于您要使用的建议类型。如果您可以指定要使用哪种类型的建议,这将有助于缩小指向您的答案的范围。
  • 不,这在 Hibernate Search 5 中是不可能的。

标签: java elasticsearch hibernate-search


【解决方案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;

请注意,“dummy”字段是必需的,因为 Hibernate Search 5 中存在一些限制,以确保“edgeNGram_query”分析器在您的索引中可用。 有关此 hack 的详细信息,请参阅 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 中消失,它仍在开发中。

【讨论】:

  • 感谢 yrodiere 提供如此详细的回答。我看到了这种方法,但是我可以看到查询并没有消除重复(而且我有很多重复),并且据我所知,当前版本的休眠搜索不支持聚合功能,除了方面,但我不能使用方面针对文本分析字段(其实我不太了解这个限制)
猜你喜欢
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
相关资源
最近更新 更多