让我们说我已经索引了一个看似如下的对象:
{
firstName: "Ben"
lastName: "McCann"
urls: [{ canonical: "http://www.benmccann.com" }]
emails: [{ canonical: "ben@ben.com" }]
}
如何创建搜索" Ben"或者" McCann"或" ben@ben.com"?
SearchRequest request = new SearchRequest(INDEX)
.source(new SearchSourceBuilder().query(QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("firstName", "Ben"))
.should(QueryBuilders.matchQuery("lastName", "McCann"))
.should(QueryBuilders.nestedQuery("emails", QueryBuilders.matchQuery("emails.canonical", "ben@ben.com")))));
答案 0 :(得分:4)
只有在映射中将电子邮件字段配置为nested query时,才需要使用nested type。我不认为你的情况有意义,因为你在电子邮件下有一个名为canonicals的子字段。您可以再次使用匹配查询和点表示法,将字段称为emails.canonical
。
如果您使用bool查询,请不要忘记设置最小匹配,这会告诉您至少应该与查询中提供的子句匹配的子句数。在你的情况下,1应该没问题。
SearchRequest request = Requests.searchRequest(INDEX)
.source(SearchSourceBuilder.searchSource().query(QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("firstName", "Ben"))
.should(QueryBuilders.matchQuery("lastName", "McCann"))
.should(QueryBuilders.matchQuery("emails.canonical", "ben@ben.com"))
.minimumShouldMatch(1)));
另一方面,如果您确实将emails
字段配置为嵌套在映射中,则需要使用嵌套查询。我没有看到你在做什么有什么问题,你只是错过了最小匹配参数。