Skip to main content

クエリの構築

クエリの制限について 利用しているアクセスレベルに応じて、クエリには制限があります。 従量課金制のお客様の場合、クエリは最大 512 文字まで、Enterprise 契約のお客様の場合は最大 4,096 文字まで指定できます。 Enterprise アクセスをご利用の場合は、担当のアカウントマネージャーまでご連絡ください。 オペレーターの利用可否 ほとんどのオペレーターはすべての開発者が利用できますが、一部には Enterprise アクセスの承認を受けた方のみ利用できるものがあります。各オペレーターがどのアクセスレベルで利用可能かは、次のラベルを用いてlist of operatorsの表に記載しています。
  • コアオペレーター: 任意のProjectを使用している場合に利用可能。
  • アドバンスドオペレーター: Enterprise アクセスを持つ Project を使用している場合に利用可能。   

演算子の種類: 単独使用可能なものと結合必須のもの

単独使用可能な演算子 は、それ単体でも、あるいは他の任意の演算子 (結合が必要な演算子を含む) と組み合わせても使用できます。 たとえば、次のクエリは単独使用可能な演算子である #hashtag 演算子を使用しているため、有効です。 #xapiv2 結合必須の演算子 は、クエリ内でそれ単体では使用できません。少なくとも 1 つの単独使用可能な演算子と組み合わせて使用する場合にのみ利用できます。これは、これらの演算子のみを使用するとクエリがあまりに一般的になりすぎ、極めて大量の投稿にマッチしてしまうためです。 たとえば、次のクエリは、結合必須の演算子だけを含んでいるためサポートされません。 has:media has:links OR is:retweet “X data” のような単独使用可能な演算子 (フレーズ) を追加すると、そのクエリは正しく動作します。 “X data” has:mentions (has:media OR has:links)

ブール演算子とグルーピング

1つのクエリ内で複数の演算子を組み合わせたい場合、次のような手法が利用できます。 否定に関する注意 演算子 -is:nullcast は常に否定形で使用する必要があります。 否定された演算子を単独で使用することはできません。 丸括弧でグループ化した一連の演算子全体をまとめて否定しないでください。代わりに、各演算子を個別に否定してください。たとえば、skiing -(snow OR day OR noschool) を使用する代わりに、skiing -snow -day -noschool を使用することをお勧めします。  演算の順序 AND と OR の機能を組み合わせる場合、次の演算順序によってクエリの評価方法が決まります。
  1. AND ロジックで接続された演算子が最初に結合される
  2. 次に、OR ロジックで接続された演算子が適用される
たとえば:
  • apple OR iphone ipad は、apple OR (iphone ipad) として評価されます
  • ipad iphone OR android は、(iphone ipad) OR android として評価されます
あいまいさをなくし、意図したとおりにクエリが評価されるようにするために、必要に応じて丸括弧で用語をグループ化してください。  たとえば:
  • (apple OR iphone) ipad
  • iphone (ipad OR android)  
句読点、ダイアクリティカルマーク、大文字小文字の区別 アクセントやダイアクリティカルマークを含む文字でキーワードやハッシュタグのクエリを指定した場合、そのアクセントやダイアクリティカルマーク付きの語と、通常の文字で書かれた語の両方を含む投稿テキストにマッチします。たとえば、キーワード Diacrítica またはハッシュタグ #cumpleaños を含むクエリは、Diacrítica#cumpleaños に加え、チルダ付きの í やエニェのない Diacritica#cumpleanos にもマッチします。 アクセントやダイアクリティカルマーク付きの文字は通常の文字と同様に扱われ、単語境界とは見なされません。たとえば、キーワード cumpleaños を含むクエリは、単語 cumpleaños を含むアクティビティにのみマッチし、cumpleacumpleanos を含むアクティビティにはマッチしません。 すべての演算子は大文字小文字を区別せずに評価されます。たとえば、クエリ cat は、catCATCat を含む投稿すべてにマッチします。 filtered stream のマッチング動作は、投稿数の集計とは異なります。building a filtered stream rule の際には、アクセントやダイアクリティカルマークを含むキーワードやハッシュタグは、同じくアクセントやダイアクリティカルマークを含む語にのみマッチし、代わりに通常の文字を使用している語にはマッチしないことを理解しておいてください。  たとえば、キーワード Diacrítica またはハッシュタグ #cumpleaños を含む filtered stream のルールは、Diacrítica#cumpleaños にのみマッチし、チルダ付きの í やエニェのない Diacritica#cumpleanos にはマッチしません。 具体性と効率性 クエリの作成を始める際には、いくつか心に留めておくべき点があります。
  • 単一のキーワードや #hashtag だけといった、広く単独で使われるオペレーターをクエリに使用することは、通常おすすめしません。このようなクエリは、非常に大量の投稿にマッチしてしまう可能性が高いためです。より堅牢なクエリを作成することで、より絞り込まれた投稿の集合にマッチさせることができ、ポスト数の精度向上が期待できるため、より価値の高いインサイトを得る助けになります。 
    • たとえば、クエリが単にキーワード happy だけだった場合、1日あたりおよそ 200,000〜300,000 件の投稿が返される可能性があります。
    • さらに条件オペレーターを追加すると結果が絞り込まれます。例: (happy OR happiness) place_country:GB -birthday -is:retweet
  • 効率的なクエリを書くことは、クエリの文字数制限内に収めるうえでも有益です。文字数には、スペースやオペレーターを含むクエリ文字列全体が含まれます。
    • たとえば、次のクエリは 59 文字です: (happy OR happiness) place_country:GB -birthday -is:retweet
Quote Tweet のマッチング動作 Post counts エンドポイントを使用する場合、オペレーターは引用元のオリジナルポストの内容にはマッチせず、Quote Tweet に含まれる内容にのみマッチします。 ただし、filtered stream は、引用されたオリジナルポストの内容と Quote Tweet 側の内容の両方にマッチする点に注意してください。   クエリを反復的に構築する クエリは早い段階から、頻繁にテストする 最初の試行で「正しい」結果を返すクエリを書けることはほとんどありません。X 上には非常に多くの情報があり、最初は明確でないものもありますし、前述のクエリ構文を希望するクエリにうまく当てはめるのが難しい場合もあります。 クエリを構築する際には、Search Post エンドポイントのいずれかを使って定期的にテストし、クエリにマッチしている投稿があなたのユースケースに関連していることを確認することが重要です。 このセクションでは、次のクエリから開始し、テストの結果に基づいて調整していきます。  happy OR happiness 結果を使ってクエリを絞り込む Search Posts でクエリをテストするときは、返された投稿をざっと確認し、期待しているデータが含まれているかどうかを確認してください。広いクエリと、そのクエリにマッチする投稿のスーパーセットから始めることで、結果をレビューし、望ましくない結果を除外するようにクエリを絞り込むことができます。   サンプルクエリをテストしたところ、さまざまな言語の投稿が返されることに気付きました。このケースでは英語の投稿のみを受け取りたいので、lang: オペレーターを追加します: (happy OR happiness) lang:en テストでは「happy birthday」を願う投稿が多数返ってきたため、否定キーワードオペレーターとして -birthday を追加します。また、オリジナルの投稿のみを受け取りたいので、否定オペレーター -is:retweet も追加します: (happy OR happiness) lang:en -birthday -is:retweet 必要に応じて包含方向に調整する Search Posts で、期待しているデータを受け取れておらず、返ってくるはずの既存投稿があると分かっている場合は、望むデータをフィルタリングしてしまっている可能性のあるオペレーターを削除して、クエリを広げる必要があるかもしれません。  この例では、自分のタイムラインに、求めている感情を表現しているにもかかわらずテスト結果に含まれていない他の投稿があることに気付きました。カバレッジを広げるため、excitedelated というキーワードを追加します。 (happy OR happiness OR excited OR elated) lang:en -birthday -is:retweet 期間中の人気トレンドや急増に応じて調整する X ではトレンドが素早く移り変わります。クエリのメンテナンスは継続的なプロセスであるべきです。あるクエリをしばらく使い続ける予定の場合は、定期的に受け取っているデータを確認し、調整が必要かどうかをチェックすることをおすすめします。 この例では、「happy holidays」と人々に挨拶している投稿が届き始めたことに気付きました。これらの投稿を結果に含めたくないので、否定キーワード -holidays を追加します。 (happy OR happiness OR excited OR elated) lang:en -birthday -is:retweet -holidays  クエリを十分にテストし、反復して調整できたら、Post counts エンドポイントにそのクエリを送信し始めることで、完全な投稿ペイロードではなく、投稿数のみを受け取れるようになります。

リクエストへのクエリの追加

クエリをリクエストに追加するには、query パラメータを使用する必要があります。ほかのクエリパラメータと同様に、作成したクエリは必ず HTTP エンコード (URL エンコード) してください。 以下は、cURL コマンドを使用した場合の例です。このコマンドを使用する場合は、必ず $BEARER_TOKEN をご自身の ベアラートークン に置き換えてください。

クエリ例

自然災害の追跡 次のクエリは、2017 年にヒューストンを襲ったハリケーン・ハービーについて言及している、気象機関や観測所からのオリジナルのポストにマッチしたものです。 HTTP エンコードを行っていない場合のクエリは次のようになります。 has:geo (from:NWSNHC OR from:NHC_Atlantic OR from:NWSHouston OR from:NWSSanAntonio OR from:USGS_TexasRain OR from:USGS_TexasFlood OR from:JeffLindner1) -is:retweet そして、HTTP エンコード、クエリパラメータ、および直近のポスト数の URI を含めると、クエリは次のようになります。 https://api.x.com/2/tweets/counts/recent?query=-is%3Aretweet%20has%3Ageo%20(from%3ANWSNHC%20OR%20from%3ANHC_Atlantic%20OR%20from%3ANWSHouston%20OR%20from%3ANWSSanAntonio%20OR%20from%3AUSGS_TexasRain%20OR%20from%3AUSGS_TexasFlood%20OR%20from%3AJeffLindner1) 会話のセンチメントを確認する 次のルールは、ハッシュタグ #nowplaying 周辺で展開している会話のセンチメントを、北米内で公開されたポストに範囲を絞ってよりよく理解するために利用できます。 HTTP エンコードを行っていない場合、ポジティブとネガティブの 2 つの異なるクエリは次のようになります。 #nowplaying (happy OR exciting OR excited OR favorite OR fav OR amazing OR lovely OR incredible) (place_country:US OR place_country:MX OR place_country:CA) -horrible -worst -sucks -bad -disappointing #nowplaying (horrible OR worst OR sucks OR bad OR disappointing) (place_country:US OR place_country:MX OR place_country:CA) -happy -exciting -excited -favorite -fav -amazing -lovely -incredible そして、HTTP エンコード、クエリパラメータ、および直近のポスト数の URI を含めると、クエリは次のようになります。 https://api.x.com/2/tweets/counts/recent?query=%23nowplaying%20(happy%20OR%20exciting%20OR%20excited%20OR%20favorite%20OR%20fav%20OR%20amazing%20OR%20lovely%20OR%20incredible)%20(place_country%3AUS%20OR%20place_country%3AMX%20OR%20place_country%3ACA)%20-horrible%20-worst%20-sucks%20-bad%20-disappointing https://api.x.com/2/tweets/counts/recent?query=%23nowplaying%20(horrible%20OR%20worst%20OR%20sucks%20OR%20bad%20OR%20disappointing)%20(place_country%3AUS%20OR%20place_country%3AMX%20OR%20place_country%3ACA)%20-happy%20-exciting%20-excited%20-favorite%20-fav%20-amazing%20-lovely%20-incredible 特定のポスト注釈に関連するポストを検索する このルールは、猫ではないペットの画像を含み、ポストで判定された言語が日本語であるオリジナルのポストをフィルタリングするために作成されました。これを行うために、context: 演算子を使用して、Post annotation 機能を活用しました。まず、Post lookup エンドポイントと tweet.fields=context_annotations フィールドパラメータを使用し、クエリで利用する必要がある domain.entity ID を特定しました。
  • 猫に関連するポストは、domain 66 (Interests and Hobbies カテゴリ) と entity 852262932607926273 (Cats) を返します。 
  • ペットに関連するポストは、domain 65 (Interests and Hobbies Vertical) と entity 852262932607926273 (Pets) を返します。 
HTTP エンコードを行っていない場合のクエリは次のようになります。 context:65.852262932607926273 -context:66.852262932607926273 -is:retweet has:images lang:ja そして、HTTP エンコード、クエリパラメータ、および直近のポスト数の URI を含めると、クエリは次のようになります。 https://api.x.com/2/tweets/counts/recent?query=context%3A65.852262932607926273%20-context%3A66.852262932607926273%20-is%3Aretweet%20has%3Aimages%20lang%3Aja

演算子