跳转到主要内容

构建 query(查询)

query(查询)限制 您的 query(查询)会因所使用的访问级别而受到限制。 如果您拥有 Pro 访问权限,单个 query(查询)最长可达 512 个字符。 如果您拥有 Enterprise 访问权限,请联系您的客户经理。 运算符可用性 尽管大多数运算符对所有开发者均可用,但有些仅限已获批 Enterprise 访问权限的用户使用。我们在运算符列表表格中使用以下标签标注各运算符对应的可用访问级别:
  • Core 运算符:使用任何Project时均可用。
  • Advanced 运算符:在具有 Enterprise 访问权限的 Project 中可用。   

运算符类型:可独立使用与需搭配使用

可独立使用的运算符 可以单独使用,或与任何其他运算符(包括那些需要搭配使用的运算符)一同使用。 例如,下面的 query(查询)可以正常运行,因为它使用了可独立使用的 #hashtag 运算符: #xapiv2 需搭配使用的运算符 不能在 query(查询)中单独出现;只有当 query(查询)中至少包含一个可独立使用的运算符时才能使用。原因是单独使用这些运算符范围过于宽泛,可能匹配到数量极其庞大的 Post。 例如,以下 query(查询)不受支持,因为它们只包含需搭配使用的运算符: has:media has:links OR is:retweet 如果我们加入一个可独立使用的运算符,例如短语 “X data”,该 query(查询)就能正常运行。 “X data” has:mentions (has:media OR has:links)

布尔运算符与分组

如果你希望在单个 query 中串联多个运算符,可以使用以下工具:
AND 逻辑连续运算符之间以空格分隔将产生布尔 “AND” 逻辑,即仅当同时满足两个条件时才会匹配 Post。例如,snow day #NoSchool 将匹配包含术语 snow、day 以及话题标签 #NoSchool 的 Post。
OR 逻辑连续运算符之间以 OR 连接将产生 OR 逻辑,即只要满足任一条件就会匹配 Post。例如,指定 grumpy OR cat OR #meme 将匹配任何至少包含术语 grumpy 或 cat,或话题标签 #meme 的 Post。
NOT 逻辑,取反在关键字(或任何运算符)前添加短横线(-)可将其取反(NOT)。例如,cat #meme -grumpy 将匹配包含话题标签 #meme 且包含术语 cat 的 Post,但前提是它们不包含术语 grumpy。一个常见的 query 子句是 -is:retweet,它不会匹配转发,因此只匹配原始 Post、Quote Tweets 和回复。所有运算符都可取反,但被取反的运算符不能单独使用。
分组你可以使用括号将运算符分组。例如,(grumpy cat) OR (#meme has:images) 将返回包含术语 grumpy 和 cat 的 Post,或包含话题标签 #meme 且带图片的 Post。注意,先应用 AND,再应用 OR。
关于取反的说明 运算符 -is:nullcast 必须始终以取反形式使用。 被取反的运算符不能单独使用。 不要对一组用括号分组的运算符整体取反。应分别对每个运算符取反。例如,与其使用 skiing -(snow OR day OR noschool),建议使用 skiing -snow -day -noschool。  运算顺序 当组合 AND 和 OR 功能时,以下运算顺序将决定你的 query 如何被评估。
  1. 先合并由 AND 逻辑连接的运算符
  2. 然后应用由 OR 逻辑连接的运算符
例如:
  • apple OR iphone ipad 将被评估为 apple OR (iphone ipad)
  • ipad iphone OR android 将被评估为 (iphone ipad) OR android
为消除不确定性并确保你的 query 按预期被评估,请在合适的位置使用括号将术语分组。  例如:
  • (apple OR iphone) ipad
  • iphone (ipad OR android)  
标点、变音符号与大小写不敏感 如果你在关键字或话题标签的 query 中指定了带有重音或变音符号的字符,它将匹配同时包含带重音/变音的形式以及对应普通字符形式的 Post 文本。例如,包含关键字 Diacrítica 或话题标签 #cumpleaños 的查询将匹配 Diacrítica#cumpleaños,也会匹配不带波浪符 í 或 eñe 的 Diacritica#cumpleanos 带有重音或变音符号的字符与普通字符同等处理,不作为词边界。例如,包含关键字 cumpleaños 的 query 只会匹配包含单词 cumpleaños 的活动,不会匹配包含 cumpleacumpleanos 的活动。 所有运算符的评估均不区分大小写。例如,query cat 将匹配包含以下任意形式的 Post:catCATCat 过滤的流 的匹配行为与 Post 计数不同。当你构建过滤的流规则时,请注意,包含重音和变音符号的关键字和话题标签只会匹配同样包含这些重音和变音的术语,不会匹配使用普通字符的术语。  例如,包含关键字 Diacrítica 或话题标签 #cumpleaños 的过滤的流规则只会匹配术语 Diacrítica#cumpleaños,不会匹配不带波浪符 í 或 eñe 的 Diacritica#cumpleanos 特异性与效率 当你开始构建 query 时,需要牢记以下几点。
  • 通常不建议在你的 query 中使用宽泛的、独立的运算符(例如单个关键词或#hashtag),因为这很可能会匹配到海量的 Posts。构建更严谨的 query 将得到更具体的一组匹配 Posts,并有望提高 Post 计数的准确性,帮助你获得更有价值的洞察。 
    • 例如,如果你的 query 只是关键词 happy,你每天可能会得到 200,000–300,000 条 Posts。
    • 添加更多条件运算符会缩小结果范围,例如 (happy OR happiness) place_country:GB -birthday -is:retweet
  • 编写高效的查询还有助于遵守 query 的字符长度限制。字符计数包含整个 query 字符串,包括空格和运算符。
    • 例如,下面的 query 长度为 59 个字符:(happy OR happiness) place_country:GB -birthday -is:retweet
Quote Tweet 匹配行为 使用 Post counts endpoints 时,运算符不会匹配被引用的原始 Post 的内容,但会匹配 Quote Tweet 中包含的内容。 但是,请注意,filtered stream 将同时匹配被引用的原始 Post 的内容以及 Quote Tweet 的内容。   迭代构建 query 尽早且频繁地测试你的 query 第一次就让一个 query 返回“正确”的结果非常罕见。X 上的内容非常多,很多情况一开始并不明显,上文描述的 query 语法也可能不易直接契合你的目标 query。 在构建 query 的过程中,定期使用任一 Search Post endpoint 进行测试非常重要,以确保与你的 query 匹配的 Posts 与你的用例相关。 在本节中,我们将从以下 query 开始,并根据测试期间获得的结果进行调整:  happy OR happiness 使用结果来收窄 query 当你使用 Search Posts 测试 query 时,应查看返回的 Posts,判断它们是否包含你期望接收的 data。先从宽泛的 query 和 Post 匹配的超集入手,便于先审阅结果,再收窄 query,过滤掉不需要的结果。   在我们测试示例 query 时,我们注意到收到的 Posts 包含多种不同语言。在这种情况下,我们只想接收英文的 Posts,所以我们将添加 lang: 运算符: (happy OR happiness) lang:en 测试返回了许多祝别人生日快乐的 Posts,因此我们将添加 -birthday 作为取反的关键词运算符。我们还只想接收原创 Posts,于是添加了取反的 -is:retweet 运算符: (happy OR happiness) lang:en -birthday -is:retweet 在需要时为纳入范围进行调整 如果你发现通过 Search Posts 未收到你预期的数据,且你知道存在应当返回的 Posts,则可能需要通过移除可能过滤掉目标 data 的运算符来放宽 query。  在我们的示例中,我们注意到个人时间线上还有其他表达我们所寻找情绪的 Posts,但未包含在测试结果中。为确保更广的覆盖,我们将添加关键词 excited 和 elated。 (happy OR happiness OR excited OR elated) lang:en -birthday -is:retweet 针对时间段内的热门趋势/激增进行调整 X 上的趋势变化很快。维护你的 query 应是一个持续的过程。如果你计划长期使用一个 query,我们建议定期检查你接收到的 data,以确定是否需要进行调整。 在我们的示例中,我们注意到开始收到一些祝人们“happy holidays”的 Posts。由于我们不希望这些 Posts 包含在结果中,因此将添加一个取反的 -holidays 关键词。 (happy OR happiness OR excited OR elated) lang:en -birthday -is:retweet -holidays  一旦你对 query 进行了充分测试和迭代,就可以开始将其与 Post counts endpoints 搭配发送,以只接收 Posts 的数量,而非完整的 Post 负载。

将 query 添加到您的请求中

要将 query 添加到请求中,您必须使用 query 参数。与任何查询参数一样,必须确保对已编写的 query 进行 HTTP 编码。 下面是使用 cURL 命令的示例。若要使用该命令,请务必将 $BEARER_TOKEN 替换为您自己的 Bearer Token
      curl https://api.x.com/2/tweets/counts/recent?query=cat%20has%3Amedia%20-grumpy&tweet.fields=created_at&max_results=100 -H "Authorization: Bearer $BEARER_TOKEN"

查询示例

跟踪自然灾害 以下 query(查询)用于匹配来自气象机构和监测站、讨论 2017 年袭击休斯顿的飓风 Harvey 的原始 Post。 下面是不带 HTTP 编码的 query(查询)示例: 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 编码、query(查询)参数以及近期 Post 计数 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 展开的会话情感,但范围仅限于在北美发布的 Post。 下面是两个不同的 query(查询)——一个用于正向,一个用于负向——在不带 HTTP 编码时的示例: #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 编码、query(查询)参数以及近期 Post 计数 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 查找与特定 Post 注解相关的 Post 此规则用于筛选包含宠物(非猫)图片的原始 Post,且该 Post 的语言被识别为日语。为此,我们使用了 context: 运算符来利用Post 注解功能。我们首先使用Post 查询 endpoint,并通过 tweet.fields=context_annotations fields 参数来确定在 query(查询)中需要使用的 domain.entity ID:
  • 与猫相关的 Post 会返回 domain 66(Interests and Hobbies 类别),其 entity 为 852262932607926273(Cats)。
  • 与宠物相关的 Post 会返回 domain 65(Interests and Hobbies Vertical),其 entity 为 852262932607926273(Pets)。
下面是不带 HTTP 编码的 query(查询)示例: context:65.852262932607926273 -context:66.852262932607926273 -is:retweet has:images lang:ja 下面是带有 HTTP 编码、query(查询)参数以及近期 Post 计数 URI 的示例: https://api.x.com/2/tweets/counts/recent?query=context%3A65.852262932607926273%20-context%3A66.852262932607926273%20-is%3Aretweet%20has%3Aimages%20lang%3Aja

运算符

操作符类型可用性描述
keyword独立Core匹配 Post 正文中的关键词。这是一种分词匹配,意味着您的关键词字符串将与 Post 正文的分词文本进行匹配。分词会根据标点符号、符号和 Unicode 基本平面分隔符字符来分割单词。例如,包含文本”I like coca-cola”的 Post 将被分割为以下词元:I、like、coca、cola。然后将这些词元与您查询中使用的关键词字符串进行比较。要匹配包含标点符号(例如 coca-cola)、符号或分隔符字符的字符串,您必须将关键词用双引号括起来。示例:pepsi OR cola OR "coca cola"
emoji独立Core匹配 Post 正文中的表情符号。与关键词类似,表情符号是分词匹配,意味着您的表情符号将与 Post 正文的分词文本进行匹配。请注意,如果表情符号有变体,您必须将其用双引号括起来才能添加到查询中。示例:(😃 OR 😡) 😬
"exact phrase match"独立Core匹配 Post 正文中的确切短语。示例:("X API" OR #v2) -"recent counts"
#独立Core匹配包含已识别话题标签的任何 Post,如果话题标签是 Post 中的已识别实体。此操作符执行精确匹配,而非分词匹配,意味着规则 #thanku 将匹配包含确切话题标签 #thanku 的 Post,但不会匹配包含话题标签 #thankunext 的 Post。示例:#thankunext #fanart OR @arianagrande
@独立Core匹配提及给定用户名的任何 Post,如果用户名是已识别实体(包括 @ 字符)。示例:(@XDevelopers OR @API) -@X
$独立Advanced匹配包含指定”股票标签”的任何 Post(其中词元的前导字符是”"字符)。请注意,股票标签操作符依赖于 X 的"符号"实体提取来匹配股票标签,而不是尝试从正文本身提取股票标签。示例:`twtr OR @XDevelopers -$fb`
from:独立Core匹配来自特定用户的任何 Post。值可以是用户名(不包括 @ 字符)或用户的数字用户 ID。每个 from: 操作符只能传递一个用户名/ID。示例:from:XDevelopers OR from:API -from:X
to:独立Core匹配回复特定用户的任何 Post。值可以是用户名(不包括 @ 字符)或用户的数字用户 ID。每个 to: 操作符只能传递一个用户名/ID。示例:to:XDevelopers OR to:API -to:X
url:独立Core对 Post 的任何有效格式 URL 执行分词匹配。此操作符可以匹配 urlexpanded_url fields 的内容。例如,包含”You should check out X Developer Labs: https://t.co/c0A36SWil4"的 Post(短 URL 重定向到 https://developer.x.com)将匹配以下两个规则:`from:XDevelopers url:“https://developer.x.com”`from:XDevelopers url:"https://t.co"。包含标点符号或特殊字符的词元和短语应该用双引号括起来。
retweets_of:独立Core匹配指定用户的转发 Post。值可以是用户名(不包括 @ 字符)或用户的数字用户 ID。每个 retweets_of: 操作符只能传递一个用户名/ID。示例:retweets_of:XDevelopers OR retweets_of:API
context:独立Core匹配具有特定域 id/实体 id 对的 Post。每个 context: 操作符只能传递一个域/实体。示例:context:domain_id.entity_id。您可以使用 OR 操作符组合多个域/实体:(context:47.113922 9372198469633 OR context:11.1088514520308342784)
entity:独立Core匹配具有特定实体字符串值的 Post。您只能传递一个 entity: 操作符。示例:entity:"string declaration of entity/place"。请注意,这仅适用于最近搜索。
conversation_id:独立Core匹配共享相同 conversation_id 的 Post。conversation_id 设置为开始对话的 Post 的 Post ID。当发布对 Post 的回复时,甚至是对回复的回复,conversation_id 都会添加到其 JSON 负载中。每个 conversation_id: 操作符只能传递一个对话 ID。示例:conversation_id:1334987486343299072 (from:XDevelopers OR from:API)
list:独立Advanced匹配由指定 List 成员用户发布的 Post。例如,如果 @XDevelopers 和 @API 是 List 123 的成员,并且您在查询中包含 list:123,您的响应将仅包含这些账户发布的 Post。您可以通过使用 List 查找 endpoint 找到 List ID。示例:list:123
place:独立Advanced匹配标记有指定位置或 X 地点 ID 的 Post。多词地点名称(“New York City”、“Palo Alto”)应该用引号括起来。每个 place: 操作符只能传递一个地点。注意:有关如何获取 X 地点 ID,请参阅 GET geo/search Standard v1.1 endpoint。示例:place:"new york city" OR place:seattle OR place:fd70c22040963ac7
place_country:独立Advanced匹配与标记地点/位置关联的国家代码与给定 ISO alpha-2 字符代码匹配的 Post。您可以在维基百科上找到有效 ISO 代码列表。每个 place_country: 操作符只能传递一个 ISO 代码。示例:place_country:US OR place_country:MX OR place_country:CA
point_radius:独立Advanced当存在时,匹配 Post 的 place.geo.coordinates 对象,在 X 中,匹配地点地理多边形,其中地点多边形完全包含在定义区域内。point_radius:[longitude latitude radius]。支持的半径单位是英里(mi)和公里(km)。半径必须小于 25 英里。经度范围为 ±180。纬度范围为 ±90。所有坐标均为十进制度。规则参数包含在方括号内,用空格分隔。示例:point_radius:[2.355128 48.861118 16km] OR point_radius:[-41.287336 174.761070 20mi]
bounding_box:独立Advanced当存在时,匹配 Post 的 place.geo.coordinates 对象,在 X 中,匹配地点地理多边形,其中地点多边形完全包含在定义区域内。bounding_box:[west_long south_lat east_long north_lat]。边界框的宽度和高度必须小于 25 英里。经度范围为 ±180。纬度范围为 ±90。所有坐标均为十进制度。规则参数包含在方括号内,用空格分隔。示例:bounding_box:[-105.301758 39.964069 -105.178505 40.09455]
is:retweet需要连接Core匹配符合其余指定规则的转发。此操作符仅查找真正的转发(例如,使用转发按钮生成的转发)。引用 Tweet 不会被此操作符匹配。示例:data @XDevelopers -is:retweet
is:reply需要连接Core仅传递匹配规则的明确回复。也可以否定以排除匹配查询的回复。注意:此操作符也适用于过滤的流 endpoint。与过滤的流一起使用时,此操作符匹配对原始 Post 的回复、引用 Post 中的回复以及转发中的回复。示例:from:XDevelopers is:reply
is:quote需要连接Core返回所有引用 Tweet,也称为带评论的 Post。示例:"sentiment analysis" is:quote
is:verified需要连接词核心仅返回作者已通过 X 认证的 Post。示例:#nowplaying is:verified
-is:nullcast需要连接词高级移除仅为在 ads.x.com 上推广而创建的、具有 "source":"Twitter for Advertisers (legacy)""source":"Twitter for Advertisers" 的 Post。此操作符必须使用否定形式。有关 Nullcasted Post 的更多信息,请参阅我们的 Post 可用性页面。示例:"mobile games" -is:nullcast
has:hashtags需要连接词核心匹配包含至少一个话题标签的 Post。示例:from:XDevelopers -has:hashtags
has:cashtags需要连接词高级匹配包含股票标签符号(带有前导 ‘' 字符,例如 `tag)的 Post。示例:#stonks has:cashtags`
has:links需要连接词核心此操作符匹配在 Post 正文中包含链接和媒体的 Post。示例:from:XDevelopers announcement has:links
has:mentions需要连接词核心匹配提及其他 X 用户的 Post。示例:#nowplaying has:mentions
has:media需要连接词核心匹配包含媒体对象(如照片、GIF 或视频)的 Post,由 X 判定。此操作符不会匹配使用 Periscope 创建的媒体,或包含其他媒体托管网站链接的 Post。示例:(kittens OR puppies) has:media
has:images需要连接词核心匹配包含可识别图像 URL 的 Post。示例:#meme has:images
has:videos需要连接词核心匹配包含原生 X 视频(直接上传到 X)的 Post。此操作符不会匹配使用 Periscope 创建的视频,或包含其他视频托管网站链接的 Post。示例:#icebucketchallenge has:videos
has:geo需要连接词高级匹配具有 X 用户提供的 Post 特定地理位置数据的 Post。这可以是 X 地点形式的位置,包含相应的显示名称、地理多边形和其他字段,或在极少数情况下,是地理经纬度坐标。注意:匹配地点(Post 地理位置)的操作符仅包含来自原始 Post 的匹配结果。转发不包含任何地点数据。示例:recommend #paris has:geo -bakery
lang:需要连接词核心匹配已被 X 分类为特定语言的 Post(当且仅当该 Post 已被分类时)。需要注意的是,每个 Post 目前仅被分类为一种语言,因此对多种语言进行 AND 操作将不会产生任何结果。每个 lang: 操作符只能传递一个 BCP 47 语言标识符。注意:如果无法进行语言分类,提供的结果是 ‘und’(表示未定义)。示例:recommend #paris lang:en
阿姆哈拉语: am德语: de马拉雅拉姆语: ml斯洛伐克语: sk
阿拉伯语: ar希腊语: el迪维希语: dv斯洛文尼亚语: sl
亚美尼亚语: hy古吉拉特语: gu马拉地语: mr索拉尼库尔德语: ckb
巴斯克语: eu海地克里奥尔语: ht尼泊尔语: ne西班牙语: es
孟加拉语: bn希伯来语: iw挪威语: no瑞典语: sv
波斯尼亚语: bs印地语: hi奥里亚语: or他加禄语: tl
保加利亚语: bg拉丁化印地语: hi-Latn旁遮普语: pa泰米尔语: ta
缅甸语: my匈牙利语: hu普什图语: ps泰卢固语: te
克罗地亚语: hr冰岛语: is波斯语: fa泰语: th
加泰罗尼亚语: ca印度尼西亚语: in波兰语: pl藏语: bo
捷克语: cs意大利语: it葡萄牙语: pt繁体中文: zh-TW
丹麦语: da日语: ja罗马尼亚语: ro土耳其语: tr
荷兰语: nl卡纳达语: kn俄语: ru乌克兰语: uk
英语: en高棉语: km塞尔维亚语: sr乌尔都语: ur
爱沙尼亚语: et韩语: ko简体中文: zh-CN维吾尔语: ug
芬兰语: fi老挝语: lo信德语: sd越南语: vi
法语: fr拉脱维亚语: lv僧伽罗语: si威尔士语: cy
格鲁吉亚语: ka立陶宛语: lt
I