Spring Data ElasticSearch多个过滤器

问题描述

考虑映射(消息是通道内的嵌套类型)

@Document(indexName = "index",type = "channel")
@Data
public class Channel {

    @Id
    @Field(type = FieldType.Text)
    private String id;

    @Field(type = FieldType.Date,format = DateFormat.date_hour_minute_second_millis)
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private LocalDateTime issuedTimestamp;

    @Field(type = FieldType.Text)
    private String clientUsername;

    @Field(type = FieldType.nested,includeInParent = true)
    private List<Message> messages;

}

@Data
public class Message {

    @Id
    @Field(type = FieldType.Text)
    private String id;

    @Field(type = FieldType.Date,format = DateFormat.date_hour_minute_second_millis)
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private LocalDateTime issuedTimestamp;

    @Field(type = FieldType.Text)
    private String body;

}

我想检索某个客户的所有渠道,以及在其body属性中包含的所有消息(包含部分空格)的“ searchString”参数中的所有单词(或单词的一部分)。

我有以下代码,到目前为止似乎还不错,但是由于我是弹性搜索的新手,下面的代码是否存在任何问题,或者是否有更好的选择来实现此目的(例如,从性能上视角)?

BoolQueryBuilder query = QueryBuilders.boolQuery()
                    .filter(QueryBuilders.termsQuery("clientUsername",userId));

List<String> wordsToSearchFor = Arrays.asList(searchString.split(" "));
                for (String word : wordsToSearchFor) {
                    query.filter(QueryBuilders.regexpQuery("messages.body",".*"+word+".*"));
                }
Query searchQuery = new NativeSearchQueryBuilder().withQuery(query).build();
SearchHits<Channel> channels = elasticsearchRestTemplate.search(searchQuery,Channel.class,IndexCoordinates.of("index"));

编辑:,如果我只想检索与regexpQuery兼容的嵌套Message对象,有什么办法可以从spring数据elasticsearch中做到这一点?我相信借助内部匹配可以做到这一点,但这仅在spring data elasticsearch 4.1(Getting InnerHits Result from SearchHits Class at Spring Data Elastic Search 4.0.0)中可用

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)