问题描述
考虑映射(消息是通道内的嵌套类型)
@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 (将#修改为@)