1

假设我索引了一个看起来像这样的对象:

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

1 回答 1

4

只有在映射中将电子邮件字段配置为嵌套类型时,才需要使用嵌套查询。我认为这对您的情况没有意义,因为您在电子邮件下有一个子字段,称为规范。您可以再次使用匹配查询和点表示法,将字段称为.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字段配置为嵌套在映射中,那么您需要使用嵌套查询。我看不出你在做什么有什么问题,你只是错过了最小应该匹配的参数。

于 2013-05-20T20:58:02.553 回答