使用 Google Books API 的推荐结果不相关

2024-01-10

我正在尝试使用 Google Books API 构建书名推荐系统。 不幸的是,我得到的结果与https://books.google.com https://books.google.com。例如,这是我通过单词“sher”搜索得到的列表(主要期待像夏洛克·福尔摩斯这样的东西)。

`She Said Yes;The Oh She Glows Cookbook;What Can She Know?;She-Wolf;Murder She Wrote;My Mother She Killed Me, My Father He Ate Me;22 Things a Woman Must Know If She Loves a Man with Asperger's Syndrome;Where She Danced;The Israeli-Palestinian Peace Negotiations, 1999-2001`

正如您所看到的,甚至没有最相关的标题。如果您在谷歌图书网站上输入“Sher”,您将获得绝对正确的相关推荐。我对 Google API 的理解正确吗?我的代码有什么问题?

            var request = 'https://www.googleapis.com/books/v1/volumes';
            var outputbookslistshow = 0; 
            $('#myTextArea').on('keyup', function(){
                if(outputbookslistshow == 0){
                  outputbookslistshow = 1;
                  $('#outputgbooksrec').show(300); // it's a div for outputting titles
                }
            $('#outputgbooksrec').empty();
                 var keywords = $(this).val();
                if(keywords.length > 0 ){
                      $.getJSON(request + '?q=' + keywords, function(response){
                        for (var i = 0; i < response.items.length; i++) {
                    var item = response.items[i];
             document.getElementById("outputgbooksrec").innerHTML += "<br>"
 + "<div class='itembook'>" + item.volumeInfo.title + "</div>";
        } 
        })
        }

    });

0. TLDR

这是一个工作小提琴 http://jsfiddle.net/8h7yowxb/1/使用谷歌的https://suggestqueries.google.com/complete/search https://suggestqueries.google.com/complete/search

参数:

output/client  # "toolbar" => xml, "firefox" => json, "chrome" => jsonp
ds             #  which site to search in ("bo" for books, "yt" for youtube...)
q              #  search term: "sher"

Query:

Results:

["sher",["sherlock holmes","sherrilyn kenyon","sherman alexie","sheryl sandberg","sherlock","sherlock holmes short stories","sherlock holmes book","sher o shayari","sherlock holmes novels","sher shah suri"]]

1. 建议与搜索结果

首先要认识到的是,当谷歌提​​出建议时,它们并不是你按回车键时它会显示的结果。

搜索结果如果您的查询中包含相关术语,则该术语是相关的。

建议假设您的查询不完整,因此将您的查询与其他查询进行比较,以猜测查询的完整版本可能是什么。

当我搜索“sher”时http://books.google.com http://books.google.com我看到的结果是:

  • 以色列-巴勒斯坦和平谈判,1999-2001
  • 超越中立:完美主义与政治
  • Desert
  • 拒绝选择!:利用你所有的兴趣、激情……

其原因是author:前三个是“George Sher”,第四个是“Barbara Sher”。这是理想的行为,因为当我搜索“sher”时,我不希望“Sherlock”结果埋葬“George Sher”。


2. 解决方案

谷歌也有一种API来提供建议。关于它的一些信息可以在这里找到 http://shreyaschand.com/blog/2013/01/03/google-autocomplete-api/。更重要的是,使用开发者工具,您可以准确地看到 Google 正在做什么。

Using Developer Tools: Inspect the https://books.google.com https://books.google.com page (CTRL+SHIFT+i in Chrome). Go to the network tab and wait until everything is loaded.

当您开始输入时,Google 会向服务器发出请求,您将看到该请求填充在列表中。当我输入“sher”时,Google 发送了以下请求:

https://suggestqueries.google.com/complete/search?client=books&ds=bo&q=sher&callback=_callbacks_._1id33zyi5

查看变量:

client   = books
ds       = bo
q        = sher
callback = _callbacks_._1id33zyi5
  • client确定您收到的结果类型(XML [工具栏]、JSON [firefox]、JSONP [chrome])
  • ds将搜索限制在特定站点(书籍 [bo]、youtube [yt] 等)。
  • q当然是查询文本
  • callback是用于 JSONP 的参数(它有一些与 JSON 的重要区别 http://json-jsonp-tutorial.craic.com/index.html)。不用太担心,因为 jQuery 可以为您处理这个问题。

我通过查看此请求并阅读,将有关这些参数的信息拼凑在一起this http://shreyaschand.com/blog/2013/01/03/google-autocomplete-api/ and this http://agichevski.com/2014/06/10/google-search-autocomplete-api/.

CORS:因为您是从不是 google.com 的域发出请求,所以您将得到一个Access-Control-Allow-Origin错误。这是一项试图防止的安全措施XSS https://en.wikipedia.org/wiki/Cross-site_scripting。为了解决这个问题,您需要使用 JSONP。

使用 jQuery,我们不需要担心回调,所以让我们将客户端参数更改为chrome并使用最终查询:

下面的工作示例:在此示例中,您可能需要注意"google:suggestrelevance"key,这是使用 JSONP 的额外好处(Google 仅在 JSONP 数据中返回该信息)。

var requestUrl = "https://suggestqueries.google.com/complete/search?client=chrome&ds=bo&q=";
var xhr;

$(document).on("input", "#query", function () {
    typewatch(function () {
        // Here's the bit that matters
        var queryTerm = $("#query").val();
        $("#indicator").show();
        if (xhr != null) xhr.abort();
        xhr = $.ajax({
            url: requestUrl + queryTerm,
            dataType: "jsonp",
            success: function (response) {
                $("#indicator").hide();
                $("#response").html(syntaxHighlight(response));
            }
        });
    }, 500);
});


/*
 *  --------- YOU ONLY NEED WHAT IS ABOVE THIS LINE ---------
 */
$(document).ready(function () {
    $("#indicator").hide();
});

// Just for fun, some syntax highlighting...
// Credit: http://stackoverflow.com/a/7220510/123415
function syntaxHighlight(json) {
    if (typeof json != 'string') {
        json = JSON.stringify(json, undefined, 2);
    }
    json = json.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
    return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
        var cls = 'number';
        if (/^"/.test(match)) {
            if (/:$/.test(match)) {
                cls = 'key';
            } else {
                cls = 'string';
            }
        } else if (/true|false/.test(match)) {
            cls = 'boolean';
        } else if (/null/.test(match)) {
            cls = 'null';
        }
        return '<span class="' + cls + '">' + match + '</span>';
    });
}

// And automatic searching (when you stop typing)
// Credit: http://stackoverflow.com/a/2219966/123415
var typewatch = (function () {
    var timer = 0;
    return function (callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
})();
/* 
 * Safe to ignore:
 * This is just to make stuff look vaguely decent
 */
body {
  padding: 10px;
}
div * {
    vertical-align: top;
}
#indicator {
    display: inline-block;
    background: no-repeat center/100% url('http://galafrica.actstudio.ro/img/busy_indicator.gif');
    width: 17px;
    height: 17px;
    margin: 3px;
}
/*
 *
 * CREDIT:
 * http://stackoverflow.com/a/7220510/123415
 */
 pre {
    outline: 1px solid #ccc;
    padding: 5px;
}
.string {
    color: green;
}
.number {
    color: darkorange;
}
.boolean {
    color: blue;
}
.null {
    color: red;
}
.key {
    color: #008;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
    <input type=text id="query" placeholder="Start typing..." /><span id="indicator"></span>

</div>
<pre id="response"></pre>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Google Books API 的推荐结果不相关 的相关文章

  • 如何用按钮打开所有infoWIndows

    现在我想添加打开所有引脚弹出窗口的按钮 infoWindows 所以我添加功能openAllInfoWindows并添加infoWindows i open 命令 但是不起作用 HTML 代码 a href Close a a href O
  • 使用 .NET 2.0 解析 JSON

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 我有一个用 C 编写的应用程序 带有 NET Framework 2 0 版本 不幸的是 我无法选择更新到较新版本的 NET
  • JQuery 动画文本

    找到简单 简单的动画文本是非常困难的 喜欢这个网站上的 内爆 http codecanyon net item jquery text animation full screen preview 233445 http codecanyon
  • 简单的 jQuery 帖子无法在 Internet Explorer 9 上运行(访问被拒绝)

    我使用 JQuery 和 PHP 编写了一个验证器 该验证器适用于除 Internet Explorer 9 之外的所有浏览器 我收到错误消息 SCRIPT5 访问被拒绝 jQuery 代码 contact send click funct
  • 如何在 Bootstrap 3 中制作进度条动画?

    我正在尝试为 Bootstrap 进度条设置动画 但我不知道该怎么做 我得到了宽度的值但是console log bar width 返回宽度px但不是 如内联所示style width 90 我用代码重新创建了一个 bootply Boo
  • jQuery Blur() 在 Chrome 上不起作用

    我在 MacOSX 上运行这个http jsfiddle net q84wv http jsfiddle net q84wv on Chrome最新版本 它不会工作 在 Firefox 上运行时它工作得很好 有什么线索吗 假设您想要aler
  • JQuery DataTable 单元格从行单击

    我正在尝试在 jquery 数据表上实现一个函数 该函数返回单击行的第一列和第四列 我正在遵循这个示例 它允许我操作单击的行http datatables net examples api select single row html ht
  • Javascript 选择 onchange='this.form.submit()'

    我有一个带有选择和一些文本输入的表单 我希望在更改选择时提交表单 使用以下方法可以正常工作 onchange this form submit 但是 如果表单还包含提交按钮 则当选择更改时 表单不会提交 我猜有某种冲突 我在这里有什么选择
  • 如何在 angularjs 中修剪()字符串?

    有角度特定的方法吗 如果没有 我应该使用内置的jquery 来做到这一点吗 如果我应该使用内置的jquery 如何在不使用 的情况下访问trim 函数 或者这是必要的 编辑 是的 我知道 str trim 对不起 我需要这个才能在 IE 8
  • 理论上防止 WebSocket 中第一个收到的消息丢失

    服务器端代码发送消息立即地连接打开后 它向客户端发送初始配置 问候语 以下代码是在客户端 var sock new WebSocket url sock addEventListener error processError sock ad
  • Meteor.js 登录事件

    因此 我对 Meteor 框架和 JavaScript 总体来说还很陌生 但我正在使用该框架开发一个小项目 以尝试让自己达到标准 基本上我正在开发一个微博客网站 目前 用户可以通过多种服务登录 fb google 等 我通过插入所需 url
  • 如何在粘贴时获取文本区域输入字段的新值?

    我发现当我尝试从文本区域字段读取值时onpaste调用函数时 我得到字段的旧值 粘贴操作之前的值 而不是新值 粘贴操作之后的值 以下是此行为的演示 http jsfiddle net qsDnr http jsfiddle net qsDn
  • ThreeJS无法加载Json文件

    首先 我已经读过这个问题 https stackoverflow com questions 17201888 three js exporter export object not working with jsonloader r58没
  • 使用 jQuery Tablesorter 操作后如何恢复当前页面?

    我正在使用 tablesorter 但无法找到有关插件 tablesorter 寻呼机的任何文档 问题是我有一个显示一些数据的表 并且在每一行中都有一个删除链接 该链接附加了要删除的元素的唯一标识符 显然 是否可以保存我正在删除的页面 然后
  • 使用 React React-router 登录后重定向到主页,并且 usenavigate 不起作用?

    我希望用户在成功登录后重定向到主页 我将用户登录的 api 请求的数据存储在一个名为 currentUser 的变量中 因此如果 currentUser 为 true 它应该重定向到主页 这就是我处理登录请求的方式 export const
  • 在 Google Apps 脚本中的文本前插入换行符

    我需要在 Google 文档中的某些文本之前插入一些换行符 尝试过这种方法但出现错误 var body DocumentApp getActiveDocument getBody var pattern WORD 1 var found b
  • 如何根据所需表单输入的值更改 CSS 样式

    我想知道如何编写 javascript 来改变所需的表单元素的样式 如果它们有价值的话就改变它们 我想要做的是当所需的文本字段为空时 在它们周围有一个彩色边框 并在它们有值时删除边框样式 我想做的是编写一个 javascript 函数来检查
  • 使用 jquery 提供附加功能时菜单未正确对齐

    I need to make a mega menu similar to one as show in image below 到目前为止 我已经能够在某种程度上使其发挥作用 例如jsFiddle 在这里 http jsfiddle ne
  • Serviceworker Bug event.respondWith

    我的 serviceworker 的逻辑是 当发生获取事件时 它首先获取包含一些布尔值 而不是 event request url 的端点 并根据我正在调用的值检查该值event respondWith 对于当前的获取事件 我正在提供来自缓
  • 获取淘汰赛中被点击元素的索引

    获取无序列表中单击元素的索引的最佳方法是什么 让我举个例子 假设我有以下 HTML 代码 ul li p p li ul 现在我有以下 javascript 代码来获取索引 self itemClicked function data it

随机推荐

  • “导入日期时间”与“从日期时间导入日期时间”

    我有一个脚本需要在脚本中的不同行执行以下命令 today date datetime date today date time datetime strp date time string Y m d H M In my import我有以
  • 尝试让 powershell 在 C#/Visual Studio 中工作

    我试图学习如何在 C 中使用 powershell 我正在关注本教程 https blogs msdn microsoft com kebab 2014 04 28 executing powershell scripts from c 但
  • 有关于这种类型编程的文献吗?

    在大学里 我选修了一门现代物理学课程 我们在其中学习了狭义相对论 不同的参考系实际上可以观察到一个物体的物理属性是不同的 但又都是不正确的 这让我彻底震惊了 随着时间的推移 这个概念慢慢地改变了我的编程方式 现在我倾向于将类分为两个主要类别
  • 为什么 GCC 警告我这条线“被误导性地缩进,就好像它被 if 保护一样”?

    警告是 home dronz OF apps myApps HexMap src HexMap cpp 48 5 warning this if clause does not guard Wmisleading indentation i
  • 构建所有 csproj 文件,测试项目除外

    在 DevOps 中 您可以创建一个dotnet build任务 其中 项目路径 可以设置为 csproj建造所有项目 这工作得很好 但它 显然 也建立了我的 Test csproj项目 我发现一些帖子提到了排除模式 因此我尝试执行与这些帖
  • 如何在 Notepad++ 中排除双引号内的搜索模式

    我有以下行 我想用空格 制表符 替换空格 但想保留双引号内的空格 我在记事本 上 11 May 2020 10 10 20 0400 GET HTTP 1 1 302 523 52197 url com TLSv1 2 19922 Mozi
  • C++ 0 和 0.0 之间的区别

    C 中0和0 0有区别吗 您应该使用哪个来初始化双精度 Thanks 字面意义0被认为是一个int文字 文字0 0 is a double文字 当分配给一个double 两者都可以工作 因为int可以在扩大转换中进行铸造 然而 铸造0 0
  • 具有动态分区的 CTAS

    我想将包含文本格式的现有表更改为 orc 格式 我能够通过以下方式做到这一点 1 手动创建一个orc格式的表并进行分区 然后 2 使用INSERT OVERWRITE 语句填充表 我正在尝试为此使用 CTAS 创建表 AS Select 语
  • 如何在Javascript中组合多个字典?

    var dictA male 10 female 20 unassigned 30 var dictB male 11 female 21 unassigned 31 var dictC male 12 female 22 unassign
  • 如何在 C# 中打开平板电脑模式屏幕键盘?

    我想使用代码启动新的屏幕键盘 OSK 您可以在任务栏中找到这个 如果没有 您可以通过右键单击任务栏找到它 我已经尝试过常规的 System Diagnostics Process Start osk exe 但我想启动另一个 不是在窗口模式
  • java netcdf 4 教程

    我在这里使用 unidata 网站上最新的 netcdf jar 库 http www unidata ucar edu downloads netcdf index jsp http www unidata ucar edu downlo
  • 访问类受保护字段而不修改原始类

    我正在使用一些公开某些类型的第三方库 由方法返回 这种类型有一些我感兴趣的受保护字段 但是我无法使用它们 因为它们的可见性是受保护的 这是问题的简化 public class A protected object Something pub
  • 提交后挂钩失败(退出代码 3)并输出

    我正在尝试使用提交后脚本远程调用 Jenkins 作业 我目前正在通过 Eclipse Kepler Subversive SVNKit Connector 提交代码 提交后脚本 if svnlook dirs changed r REV
  • const 指针固定为变量

    我不知道如何告诉 C 我想要一个不会移动的指针 它将始终指向同一个数组 也就是说 数组成员不是恒定的 但数组本身是全局的 因此它位于固定位置 所以 当我编码时 include
  • 在没有 .plist 文件的情况下使用适用于 iOS 的 Google Analytics

    根据 Google 的文档 iOS 分析 他们希望您下载一些自动生成的 plist 文件来配置您的应用程序 不幸的是 我有多个报告套件 调试 发布 需要根据构建动态切换 所以我正在尝试做两件事之一 有没有办法完全放弃 plist 文件并动态
  • 构造函数继承和自定义构造函数

    使用这个层次结构 struct TestBase Constructor TestBase TestBase int a TestBase TestBase const testBase Destructor virtual TestBas
  • 无法解析主要引用,因为它是针对比当前目标框架更高版本的 .NET 框架构建的

    我正在尝试构建一个引用第 3 方 SlingshotClient dll 的项目 该项目在其他开发人员工作站上构建良好 但是 我收到以下错误 我可以想象导致我的问题的一个差异是我的计算机上还安装了 VS 2012 和 NET Framewo
  • 对 .NET Framework 程序集的间接依赖

    所以我更新了我的 Telerik dll 将新的 dll 放在顶部 然后清理我的解决方案并重建 以产生以下错误 警告 3 无法解析主要引用 Telerik Windows Documents FormatProviders Xaml 因为它
  • setup.py 安装本地包

    如果我有一棵树 看起来像 project package init py setup py env setup py 有没有办法将嵌套的 setup py 包含在顶部 setup py 的安装中 我想避免这种情况 pip install e
  • 使用 Google Books API 的推荐结果不相关

    我正在尝试使用 Google Books API 构建书名推荐系统 不幸的是 我得到的结果与https books google com https books google com 例如 这是我通过单词 sher 搜索得到的列表 主要期待