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 クエリを使用する場合は、minimum should match を設定することを忘れないでください。これにより、クエリで提供されたもののうち、少なくとも何個の should 句が一致する必要があるかがわかります。あなたの場合、 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フィールドをマッピングでネストされたように構成した場合は、ネストされたクエリを使用する必要があります。あなたがやっていることには何も問題はありません.minimum should matchパラメータが欠けているだけです。

于 2013-05-20T20:58:02.553 に答える