多个 regexpQuery 与启用 fielddata 的单个 matchQuery

multiple regexpQuery vs single matchQuery with fielddata enabled

假设我有一个包含消息实体列表的主题实体。 我希望能够检索所有具有“消息”的“主题”,这些“消息”在其“正文”属性中包含多个单词(如“elasticsearch”和“数据”)。

我正在使用 spring 数据弹性搜索来创建 NativeSearchQuery。

一种方法是不启用字段数据并像这样执行多个正则表达式查询

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
for (String word : wordsToSearchFor) {
    queryBuilder.filter(QueryBuilders.regexpQuery(message.body, ".*" + word.toLowerCase() + ".*"));
}
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(queryBuilder).build()

另一种方法是启用字段数据并执行单个查询,就像这样

NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
    .withQuery(matchQuery("message.body", "elasticsearch data"))
    .build();

但从我在官方弹性网站上读到的内容来看,这种方法不被鼓励,因为堆内存使用率高,点击时间低:https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html

在这种情况下哪种方法更好?

不确定您的 use-case 是什么,简单的 full-text 搜索不需要在文本字段上启用 fielddata(默认情况下禁用),正如您已经知道的那样不推荐成本高昂,相反,您应该为 text 字段设置 .keyword 字段,并在该字段上进行排序和聚合。

通过查看您的搜索查询,您没有进行排序和聚合,因此您不应使用字段数据。此外,正则表达式查询非常昂贵,如果您可以提供 use-case 我们可以为您提供更好的方法来构建这些查询。