Java中的嵌套弹性搜索查询

时间:2013-05-20 19:14:05

标签: elasticsearch

让我们说我已经索引了一个看似如下的对象:

{
  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")))));

1 个答案:

答案 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字段配置为嵌套在映射中,则需要使用嵌套查询。我没有看到你在做什么有什么问题,你只是错过了最小匹配参数。