> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 検索クエリを使用してユーザーを一覧表示・検索する方法

> すべてのユーザープロファイルの一覧を取得し、Lucene 検索クエリ文字列で結果を絞り込みます。

export const AuthCodeGroup = ({children, dropdown}) => {
  const [processedChildren, setProcessedChildren] = useState(children);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      unsubscribe = window.autorun(() => {
        const processChildren = node => {
          if (typeof node === "string") {
            let processedNode = node;
            for (const [key, value] of window.rootStore.variableStore.values.entries()) {
              const escapedKey = key.replaceAll(/[.*+?^${}()|[\]\\]/g, (String.raw)`\$&`);
              processedNode = processedNode.replaceAll(new RegExp(escapedKey, "g"), value);
            }
            return processedNode;
          } else if (Array.isArray(node)) {
            return node.map(processChildren);
          } else if (node && node.props && node.props.children) {
            return {
              ...node,
              props: {
                ...node.props,
                children: processChildren(node.props.children)
              }
            };
          }
          return node;
        };
        setProcessedChildren(processChildren(children));
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  return <CodeGroup dropdown={dropdown}>{processedChildren}</CodeGroup>;
};

export const AuthCodeBlock = ({filename, icon, language, highlight, children}) => {
  const [displayText, setDisplayText] = useState(children);
  const [copyText, setCopyText] = useState(children);
  const wrapperRef = React.useRef(null);
  useEffect(() => {
    let unsubscribe = null;
    function init() {
      if (!window.autorun || !window.rootStore) {
        return;
      }
      unsubscribe = window.autorun(() => {
        let processedChildrenForDisplay = children;
        let processedChildrenForCopy = children;
        for (const [key, value] of window.rootStore.variableStore.values.entries()) {
          const escapedKey = key.replaceAll(/[.*+?^${}()|[\]\\]/g, (String.raw)`\$&`);
          let displayValue = value;
          if (key === "{yourClientSecret}" && value !== "{yourClientSecret}") {
            displayValue = value.substring(0, 3) + "*****MASKED*****";
          }
          processedChildrenForDisplay = processedChildrenForDisplay.replaceAll(new RegExp(escapedKey, "g"), displayValue);
          processedChildrenForCopy = processedChildrenForCopy.replaceAll(new RegExp(escapedKey, "g"), value);
        }
        setDisplayText(processedChildrenForDisplay);
        setCopyText(processedChildrenForCopy);
      });
    }
    if (window.rootStore) {
      init();
    } else {
      window.addEventListener("adu:storeReady", init);
    }
    return () => {
      window.removeEventListener("adu:storeReady", init);
      unsubscribe?.();
    };
  }, [children]);
  useEffect(() => {
    if (!wrapperRef.current) return;
    const originalWriteText = navigator.clipboard.writeText.bind(navigator.clipboard);
    let isOverriding = false;
    const handleClick = e => {
      const button = e.target.closest('[data-testid="copy-code-button"]');
      if (!button || !wrapperRef.current.contains(button)) return;
      isOverriding = true;
      navigator.clipboard.writeText = text => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
          return originalWriteText(copyText);
        }
        return originalWriteText(text);
      };
      setTimeout(() => {
        if (isOverriding) {
          isOverriding = false;
          navigator.clipboard.writeText = originalWriteText;
        }
      }, 100);
    };
    const wrapper = wrapperRef.current;
    wrapper.addEventListener('click', handleClick, true);
    return () => {
      wrapper.removeEventListener('click', handleClick, true);
      if (navigator.clipboard.writeText !== originalWriteText) {
        navigator.clipboard.writeText = originalWriteText;
      }
    };
  }, [copyText]);
  return <div ref={wrapperRef}>
      <CodeBlock filename={filename} icon={icon} language={language} lines highlight={highlight}>
        {displayText}
      </CodeBlock>
    </div>;
};

Auth0 Dashboard または Management API を使用すると、ユーザー一覧を取得し、指定した検索条件で結果を絞り込むことができます。

<div id="list-and-search-for-users">
  ## ユーザーの一覧表示と検索
</div>

<Tabs>
  <Tab title="Auth0 Dashboard">
    ユーザーの一覧を表示するには、[Auth0 Dashboard > User Management > Users](https://manage.auth0.com/#/users)に移動します。

    <img src="https://mintcdn.com/translations/-d41Muac7Op9CEDm/docs/images/user-management/users.png?fit=max&auto=format&n=-d41Muac7Op9CEDm&q=85&s=81c22fb01f56a93ce730d8e1c39938c4" alt="Auth0 Dashboard の Users ページ" width="1229" height="459" data-path="docs/images/user-management/users.png" />

    ページ上部の検索フィールドとドロップダウンメニューで、次のプロパティを指定して検索できます。

    * ユーザー
    * メール
    * アイデンティティプロバイダー
    * 接続
    * 組織ID
    * ログイン回数
    * 最終ログイン
    * 電話番号

    **Lucene Syntax (Advanced)** を選択して、検索条件を指定することもできます。[検索クエリ構文リファレンス](./user-search-query-syntax)では、サポートされている検索機能とクエリの例について詳しく説明しています。
  </Tab>

  <Tab title="Management API">
    Management API の [List or Search Users endpoint](/docs/ja-jp/api/management/v2/users/get-users) (`GET /users`) は最終的整合性 (eventually consistent) であるため、直近に完了した書き込み操作の結果がすぐに反映されない場合があります。既存ユーザーの表示名の変更など、厳密な即時性が求められない操作にはこのエンドポイントの使用を推奨します。

    <Warning>
      **List または Search Users エンドポイントを使用する場合**

      * このエンドポイントは、authentication プロセスの一環、[account linking](/docs/ja-jp/manage-users/user-accounts/user-account-linking)、または即時整合性が必要な場合には使用しないでください。代わりに、Management API エンドポイントを使用して、[ID またはメールアドレスでユーザーを取得](/docs/ja-jp/manage-users/user-search/get-users-by-id-or-email)してください。

      * List または Search Users エンドポイントをユーザーのエクスポートに使用しないでください。代わりに、[一括ユーザーエクスポート](/docs/ja-jp/manage-users/user-migration/bulk-user-exports)を使用してください。
    </Warning>

    Management API ですべてのユーザーを一覧表示するには、[List or Search Users endpoint](/docs/ja-jp/api/management/v2/users/get-users) (`GET /users`) を呼び出します。ユーザーを検索するには、[`q` クエリパラメータ](/docs/ja-jp/api/management/v2/users/get-users#parameter-q)と[Lucene 検索クエリ文字列](./user-search-query-syntax)を使用して検索条件を指定します。

    たとえば、名前が `example` と完全に一致するユーザーを検索するには:

    <AuthCodeGroup>
      ```bash curl theme={null}
      curl --request GET \
        --url 'https://{yourDomain}/api/v2/users?q=name%3A%22example%22&search_engine=v3' \
        --header 'authorization: Bearer {yourMgmtApiAccessToken}'
      ```

      ```csharp C# theme={null}
      var client = new RestClient("https://{yourDomain}/api/v2/users?q=name%3A%22example%22&search_engine=v3");
      var request = new RestRequest(Method.GET);
      request.AddHeader("authorization", "Bearer {yourMgmtApiAccessToken}");
      IRestResponse response = client.Execute(request);
      ```

      ```go Go theme={null}
      package main

      import (
      	"fmt"
      	"net/http"
      	"io/ioutil"
      )

      func main() {
      	url := "https://{yourDomain}/api/v2/users?q=name%3A%22example%22&search_engine=v3"
      	req, _ := http.NewRequest("GET", url, nil)
      	req.Header.Add("authorization", "Bearer {yourMgmtApiAccessToken}")

      	res, _ := http.DefaultClient.Do(req)
      	defer res.Body.Close()
      	body, _ := ioutil.ReadAll(res.Body)

      	fmt.Println(res)
      	fmt.Println(string(body))
      }
      ```

      ```java Java theme={null}
      HttpResponse<String> response = Unirest.get("https://{yourDomain}/api/v2/users?q=name%3A%22example%22&search_engine=v3")
        .header("authorization", "Bearer {yourMgmtApiAccessToken}")
        .asString();
      ```

      ```javascript Node.JS theme={null}
      var axios = require("axios").default;

      var options = {
        method: 'GET',
        url: 'https://{yourDomain}/api/v2/users',
        params: {q: 'name:"example"', search_engine: 'v3'},
        headers: {authorization: 'Bearer {yourMgmtApiAccessToken}'}
      };

      axios.request(options).then(function (response) {
        console.log(response.data);
      }).catch(function (error) {
        console.error(error);
      });
      ```

      ```php PHP theme={null}
      $curl = curl_init();

      curl_setopt_array($curl, [
        CURLOPT_URL => "https://{yourDomain}/api/v2/users?q=name%3A%22example%22&search_engine=v3",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_HTTPHEADER => [
          "authorization: Bearer {yourMgmtApiAccessToken}"
        ],
      ]);

      $response = curl_exec($curl);
      $err = curl_error($curl);
      curl_close($curl);

      if ($err) {
        echo "curl Error #:" . $err;
      } else {
        echo $response;
      }
      ```

      ```python Python theme={null}
      import http.client

      conn = http.client.HTTPSConnection("")
      headers = { 'authorization': "Bearer {yourMgmtApiAccessToken}" }
      conn.request("GET", "/{yourDomain}/api/v2/users?q=name%3A%22example%22&search_engine=v3", headers=headers)

      res = conn.getresponse()
      data = res.read()

      print(data.decode("utf-8"))
      ```

      ```ruby Ruby theme={null}
      require 'uri'
      require 'net/http'
      require 'openssl'

      url = URI("https://{yourDomain}/api/v2/users?q=name%3A%22example%22&search_engine=v3")

      http = Net::HTTP.new(url.host, url.port)
      http.use_ssl = true
      http.verify_mode = OpenSSL::SSL::VERIFY_PEER

      request = Net::HTTP::Get.new(url)
      request["authorization"] = 'Bearer {yourMgmtApiAccessToken}'

      response = http.request(request)
      puts response.read_body
      ```
    </AuthCodeGroup>

    検索クエリが2秒以内に完了しない場合、タイムアウトし (HTTP ステータスコード 503) 、処理が中断されます。検索クエリがタイムアウトする場合、それは処理負荷の高いクエリであるか、時間内に完了しないエラーが含まれている可能性があります。

    エラー `414 Request-URI Too Large` は、クエリ文字列がサポートされている最大長を超えていることを示します。この場合は、検索条件を絞り込んでください。

    [検索クエリ構文リファレンス](./user-search-query-syntax)には、サポートされている検索機能とクエリの例に関する詳細が記載されています。
  </Tab>
</Tabs>

<div id="sort-results">
  ## 結果を並べ替える
</div>

<Tabs>
  <Tab title="Auth0 Dashboard">
    Auth0 Dashboard では、ユーザー一覧に表示される列を選択して、結果を並べ替えることができます。

    * 名前
    * ユーザー ID
    * 接続
    * ログイン数
    * 最終ログイン

    列の見出しを1回選択すると昇順に、もう一度選択すると降順に並べ替えられます。ほかのフィールドで結果を並べ替えるには、Management API を使用します。
  </Tab>

  <Tab title="Management API">
    ユーザー検索結果を並べ替えるには、[`sort` クエリパラメータ](/docs/ja-jp/api/management/v2/users/get-users#parameter-sort)を`field:order`の値に設定します。各要素は次のとおりです。

    * `field` は並べ替えに使用するフィールド名です
    * `order` は昇順の場合は `1`、降順の場合は `-1` です。

    たとえば、作成日時の昇順でユーザーを並べ替えるには、`sort` パラメータに `created_at:1` を指定します。

    <AuthCodeGroup>
      ```bash curl theme={null}
      curl --request GET \
        --url 'https://{yourDomain}/api/v2/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3' \
        --header 'authorization: Bearer {yourMgmtApiAccessToken}'
      ```

      ```csharp C# theme={null}
      var client = new RestClient("https://{yourDomain}/api/v2/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3");
      var request = new RestRequest(Method.GET);
      request.AddHeader("authorization", "Bearer {yourMgmtApiAccessToken}");
      IRestResponse response = client.Execute(request);
      ```

      ```go Go theme={null}
      package main

      import (
      	"fmt"
      	"net/http"
      	"io/ioutil"
      )

      func main() {
      	url := "https://{yourDomain}/api/v2/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3"
      	req, _ := http.NewRequest("GET", url, nil)
      	req.Header.Add("authorization", "Bearer {yourMgmtApiAccessToken}")

      	res, _ := http.DefaultClient.Do(req)
      	defer res.Body.Close()
      	body, _ := ioutil.ReadAll(res.Body)

      	fmt.Println(res)
      	fmt.Println(string(body))
      }
      ```

      ```java Java theme={null}
      HttpResponse<String> response = Unirest.get("https://{yourDomain}/api/v2/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3")
        .header("authorization", "Bearer {yourMgmtApiAccessToken}")
        .asString();
      ```

      ```javascript Node.JS theme={null}
      var axios = require("axios").default;

      var options = {
        method: 'GET',
        url: 'https://{yourDomain}/api/v2/users',
        params: {q: 'logins_count:[100 TO 200]', sort: 'created_at:1', search_engine: 'v3'},
        headers: {authorization: 'Bearer {yourMgmtApiAccessToken}'}
      };

      axios.request(options).then(function (response) {
        console.log(response.data);
      }).catch(function (error) {
        console.error(error);
      });
      ```

      ```php PHP theme={null}
      $curl = curl_init();

      curl_setopt_array($curl, [
        CURLOPT_URL => "https://{yourDomain}/api/v2/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_HTTPHEADER => [
          "authorization: Bearer {yourMgmtApiAccessToken}"
        ],
      ]);

      $response = curl_exec($curl);
      $err = curl_error($curl);

      curl_close($curl);

      if ($err) {
        echo "curl Error #:" . $err;
      } else {
        echo $response;
      }
      ```

      ```python Python theme={null}
      import http.client

      conn = http.client.HTTPSConnection("")
      headers = { 'authorization': "Bearer {yourMgmtApiAccessToken}" }
      conn.request("GET", "/{yourDomain}/api/v2/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3", headers=headers)

      res = conn.getresponse()
      data = res.read()

      print(data.decode("utf-8"))
      ```

      ```ruby Ruby theme={null}
      require 'uri'
      require 'net/http'
      require 'openssl'

      url = URI("https://{yourDomain}/api/v2/users?q=logins_count%3A%5B100%20TO%20200%5D&sort=created_at%3A1&search_engine=v3")

      http = Net::HTTP.new(url.host, url.port)
      http.use_ssl = true
      http.verify_mode = OpenSSL::SSL::VERIFY_PEER

      request = Net::HTTP::Get.new(url)
      request["authorization"] = 'Bearer {yourMgmtApiAccessToken}'

      response = http.request(request)
      puts response.read_body
      ```
    </AuthCodeGroup>
  </Tab>
</Tabs>

<div id="performance-recommendations">
  ## パフォーマンスに関する推奨事項
</div>

ユーザー検索のパフォーマンスを向上させるには、次のガイドラインに従ってください。

* Management API の List または Search Users エンドポイント は、決定論的な順序で結果を返します。そのため、同じクエリでは毎回、論理的に同じ順序の結果が返されます。非決定論的検索の方が高速なため、ユースケースで決定論的検索が不要な場合は、`primary_order=false` を設定して非決定論的検索を使用してください。

* スペース文字はエスケープしてください (例: `q=name:John Doe` は `q=name:John\ Doe` と記述します) 。

* 特に大規模なデータセットでは、ワイルドカードの使用を最小限に抑えてください。ワイルドカードを使用する場合は、検索タームの接頭辞ではなく接尾辞として使用してください。

* 1,000 件を超える結果を返す検索条件は避けてください。

* 存在クエリ (例: 「値にかかわらず、特定のプロパティを持つすべてのユーザーを返す」) は避けてください。

* `app_metadata` および `user_metadata` のユーザー定義属性については、次の点に注意してください。

  * メタデータフィールドは 2 KB 以下にしてください。

  * メタデータプロパティには、一貫したデータ型と固定の名前を使用してください。

  * 大きなスキーマや深い構造は避けてください。

* `post-login` Actions などのログインフローの拡張ポイント内でユーザー検索を行うことは避けてください。

* 検索 API をポーリングしないでください。

<div id="limits">
  ## 制限
</div>

* 検索では、クエリに一致するユーザーが1,000人を超える場合でも、返されるのは最大1,000人です。API を使用する場合、大量の結果は[ページネーション](/docs/ja-jp/api/management/v2#pagination)されます。

* Management API の List または Search Users エンドポイントでは、インデックス化、クエリ、返却できる[ユーザーデータのサイズは、ユーザーあたり最大1 MB](/docs/ja-jp/manage-users/user-accounts/metadata/metadata-fields-data#size-limits-and-storage)です。サイズの大きいユーザープロファイルのすべてのユーザー属性を取得するには、[ID またはメールアドレスでユーザーを取得](/docs/ja-jp/manage-users/user-search/get-users-by-id-or-email)してください。

* Management API の List または Search Users エンドポイントでは、`app_metadata` または `user_metadata` による並べ替えはサポートされていません。
