Google自定义搜索JSON API存在不一致的搜索结果

7
我们正在使用谷歌自定义搜索JSON API进行高等教育研究,实际上我们正在解析大量的URL,以找到有关各种组织对COVID-19的反应的信息。我们使用谷歌的API来查找顶级搜索结果。但是,我们发现在API查询中使用不同的搜索参数时存在不一致的结果。这些不一致性是一个问题,因为我们试图将查询调整到特定的错误率(错误率是提供有效研究信息的URL占所有URL的比率)。我们正在寻找帮助解释谷歌API工作原理的人,因为文档非常简略。 我们基本查询的一个示例: 'https://www.googleapis.com/customsearch/v1?key=KEY&cx=SEARCHENGINE&q="School Name" intext:(term1 | term2 | term3) -inurl:(unwanted1 | unwanted2 | unwanted3) inurl:(wanted1 | wanted2 | wanted3)&start=1' 其中“学校名称”是高等教育机构的名称。Term1,term2等都是我们想在搜索结果的正文中找到的特定变量。intext参数有助于避免某些文档中的不可见文本。例如,insidehighered.com 在不适用实际文章的情况下包含许多高等教育机构的不可见文本。Unwanted1等是我们不希望包含在URL标题中的单词或短语。例如,我们想避免PDF文档,所以一个可能是“.pdf”。Wanted1等是我们希望在URL中包含的单词,如“新闻”。我们使用“|”表示“或”,这使我们能够为多种类型的搜索利用一个查询,从而有助于最小化API使用成本。
到目前为止,我们发现了以下问题/不一致之处:
  1. 使用"-" 和 "NOT" 作为取反词会返回不同的结果。
  2. 参数的顺序很重要。例如,"inurl:(一些想要的搜索词) -inurl:(一些不想要的搜索词)" 返回的结果与 "-inurl:(一些不想要的搜索词) inurl:(一些想要的搜索词)" 不同
  3. 术语的嵌套也是不一致的。例如,“inurl:((想要的术语| 想要的术语) NOT(不想要的术语| 不想要的术语))” 返回的结果与“inurl:(想要的术语| 想要的术语| NOT不需要的术语NOT不需要的术语)”不同
  4. 此外,API有时会返回不同的结果,即使在相同查询两次使用完全相同的查询。它似乎会返回10个结果,但自发地将最后1或2个从下一页或其他位置混合在一起。例如,此查询:“https://www.googleapis.com/customsearch/v1?key=KEY&cx=SEARCHENGINE&q="Miami University-Hamilton" intext:(reduce tuition | freeze tuition | decrease tuition | lower tuition) inurl:(news | announcement | article | story) -inurl:(registrar | admissions | tuition-and-fees | tuition-schedule | schedule | state | office | employment-opportunities | about-us | about | linkedin | events | .uk | irs | .gov | information-technology | wikipedia | wiki | employee-handbook | student-handbook | shop | annual | youtube | pinterest | store | openings | indeed | amazon | contact | job-board | jobboard | policies | frequently-asked-questions | faq | forms | hours | academic-calendar | calendar | directory | glassdoor | facebook | encyclopedia)&start=31”(然后是start=41的下一页)将" http://www.harbison.one/archive/z_1985_national_cc_directory.pdf "作为第四页的最后一项和第五页的第一项返回。当我们运行GET请求时,它有时会返回不同的结果,以便在第四页的最后一项上返回该重复网址,但是然后将该重复网址返回两个页面。

我们用于从每个页面中获取项目的代码如下:

response = requests.get(query)
content = response.json()
hrefs = []

try:
    for i in content['items'][0:num]:
        hrefs.append(i['link'].lower())
  

except Exception as e:
    print(str(e))
    hrefs.append('a')



感谢您!

你尝试过使用较小的查询参数(例如仅使用q参数)调用API吗?我想知道,即使只有最少量的参数,如果仍然存在不一致性,那么它们可能不是由NLP技术引起的(如@katzenklavier所提到的),而是由新资源的最近索引引起的。相反,如果没有发现不一致性,则查询中使用太多参数可能是问题的原因。 - Overasyco
@Labaguette 很好的观点。当我们运行程序时,我们只使用了“q”参数,并且这产生了一致的结果。使用多个参数的策略可以减少90%的必要搜索,但正如我们所讨论的那样,它是不一致的。 - nxl10
1个回答

4
抱歉,您很难找到符合您要求的答案。为了保护其商业机密等方面,谷歌在搜索引擎算法方面非常保密。我们从官方消息中所知道的是以下内容
Google广泛使用自然语言处理(NLP),并会尽力揣摩您的查询意图,即使这意味着忽略您实际搜索的内容; 它喜欢包含您搜索关键字的页面,但也有复杂的保护机制来防止“关键词堆积”,即有人将大量可能的搜索条件塞入其网页以试图获得额外流量; 它维护一个可信任的内部页面列表,如果这些页面链接到内容(或者这些页面链接到链接到内容的页面等等),则会对该内容进行更高排名; 它根据一组可用性标准对页面进行评分,并不喜欢加载缓慢或未针对不同设备进行优化的页面; 最后,它使用您的位置和过去的搜索历史记录来确定要提供哪种类型的结果。
这些要点中,第一个可能是最重要的。使用API进行搜索可能不会给您的搜索任何特殊待遇,这在API行为方面是不寻常的,但对于谷歌来说却是意料之中的。谷歌很乐意为了用户体验而弯曲自己的规则,我强烈怀疑您的搜索结果正在受到他们这种行为的影响。此外,鉴于目前的情况,他们已经将涉及COVID-19的特殊内容硬编码到引擎的行为中,这可能会进一步复杂化事情。
我希望我能给您更好的消息,但您可能只能让搜索引擎返回的奇怪和不一致的结果起作用。结果几乎肯定无法再现,并且由于上述第五点的原因,它们甚至可能在以后无法被您自己复制。很抱歉。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接