gkz cloud sql_使用Cloud SQL的Google App Engine全文搜索

gkz cloud sql

许多Google AppEngine开发人员一直在等待全文搜索功能,特别是来自网络上最大的搜索引擎Google。 我很高兴看到Google团队正在努力,您可以在Google I / O 2011会议上查看:Bo Majewski和Ged Ellis进行的全文本搜索 。 据我所知,非常有前途的索引服务尚不可用。

在本文中,我将说明如何使用可用的App Engine服务在应用程序中提供某种全文本搜索。

在我的特定用例中,我不需要很多功能,只需要简单地在与实例无关的情况下在我的实体的各种属性中搜索字符串,以及可能的特殊字符(例如è,é,…)。 我还远不是Google Datastore API的专家,但我没有找到直接使用Java API实现此目标的任何简单方法。 解决此问题的方法是将部分数据复制到Google Cloud SQL中,以使用MySQL全文搜索功能。

先决条件
要完成以下任务,您需要:

  • 安装Google AppEngine SDK for Java
  • 安装MySQL 5.5
  • 具有AppEngine和Cloud SQL服务的Google帐户。
  • 可选: Eclipse插件,用于开发,调试和部署我的Web应用程序到GAE

内容

在以下各段中,我将解释用于全文搜索的Cloud SQL集成的基础知识,但是如果需要,可以跳至:

  • 完整的应用程序代码: https : //github.com/tgrall/gae-full-text-search
  • 看一下正在运行的应用程序: http : //gae-fulltext-search.appspot.com/

1.创建文章实体
首先创建一些具有某些属性的简单实体,例如,具有标题和正文属性的实体名称Article。

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;//...
//...Entity article = new Entity("Article");article.setProperty("title", "MySQL Tutorial");article.setProperty("body", "DBMS stands for DataBase ...");datastore.put(article);article = new Entity("Article");article.setProperty("title", "Datastore Index Selection and Advanced Search");article.setProperty("body", "Learn how recent improvements to the query planner ... function in your application");datastore.put(article);

如果您查看数据存储区API,甚至JDO或JPA,就没有简单的方法来查找与铁人三项,数据库或实体相关的所有文章。 Google DataStore不支持在不同字段之间使用“或”的子句; 我不想提及一个事实,即不可能以简单的方式忽略文本大小写。

这就是为什么我们需要一些全文功能。 你们中的某些人肯定在考虑使用Apache Lucene来解决问题,是的,这是可能的。 例如,您可以使用GAELucene项目: http : //code.google.com/p/gaelucene/ 。 我使用另一种方法,在“索引/搜索”选项方面可能不太先进,但足以满足我的用例:

  • 我将要在其中进行搜索的文本值存储在Google Cloud SQL中,并使用MySQL的“全文本”功能。

2.创建一个SQL表来存储文本值(在开发环境中)

使用Google AppEngine时,将使用特定的驱动程序和配置访问Cloud SQL实例,我们将在以后看到。 目前,我们仍处于开发环境中,这是您必须使用本地MySQL实例的地方。

在这个特定的用例中,我们将在表中复制这两个字段,并基于实体键添加一个新的唯一键。 所以在这里用SQL创建这个:

CREATE SCHEMA search_values DEFAULT CHARACTER SET utf8 ;USE search_values;CREATE TABLE articles  (entity_key varchar(250),title text,body text,PRIMARY KEY RESULTS_PK (entity_key),FULLTEXT (title,body)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

第1行和第3行在这里创建数据库模式并使用它。 然后脚本将创建一个表,其中将包含来自实体的标题和正文的副本。

3.配置您的开发环境

本部分是Cloud SQL文档的简短说明: 入门:Java

  1. 将MySQL JDBC驱动程序复制到/lib/impl/下的Google App Engine SDK目录中。 您可以在此处下载MySQL JDBC驱动程序。
  2. 在Eclipse中,选择您的Java包。
  3. 单击运行 > 运行配置
  4. 展开“ Web应用程序”菜单项。
  5. 将以下行添加到“ VM参数”窗格中:
    -Drdbms.server=local
    -Drdbms.driver=com.mysql.jdbc.Driver
    -Drdbms.url=jdbc:mysql://localhost:3306/search_values?user=username&password=password
  6. 单击类路径选项卡。
  7. 选择您的项目,然后单击“ 添加外部JAR”。
  8. 导航到Google App Engine SDK目录,然后导航到lib/impl ,然后选择JDBC驱动程序JAR文件。 点击打开 。 驱动程序JAR在“ 用户条目”下列出
  9. 点击应用

现在,您的开发环境已准备就绪,可以使用本地MySQL数据库了。 现在,使用此数据库。

4.使用您MySQL表并将文本值从Google Datastore复制到MySQL表

将数据从数据存储区实体复制到表非常简单:

Connection conn = null;try {DriverManager.registerDriver(new AppEngineDriver());conn = DriverManager.getConnection("jdbc:google:rdbms://[your db instance]/search_values");conn.setAutoCommit(false);  String statement = "REPLACE INTO articles (entity_key, title, body) VALUES( ? , ? , ? )";PreparedStatement stmt = conn.prepareStatement(statement);DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();Query q = new Query("Article");   PreparedQuery pq = datastore.prepare(q);// loop on each entity and insert the values in the SQL Tablefor (Entity result : pq.asIterable()) {stmt.setString(1,  KeyFactory.keyToString(result.getKey())   );stmt.setString(2,  result.getProperty("title").toString() );stmt.setString(3,  result.getProperty("body").toString() );stmt.executeUpdate();conn.commit();}} catch (SQLException e) {e.printStackTrace();} finally {if (conn != null)try {conn.close();} catch (SQLException ignore) {}}

与标准的Java Web Development相比,这里有一些特别的东西:

  • 我直接在代码中管理连接( 如果可以在Google AppEngine的上下文中使用数据源/连接池,我还没有看过
  • 第3行:注册负责管理连接的AppEngine驱动程序,特别是在开发-本地MySQL-或生产模式-CloudSQL-中工作。
  • 第4行:获取连接。 有趣的是,在开发中,连接URL是从您先前设置的环境变量Drdbms.url中获取的。 稍后我们将看到如何将其转移到云中。 这是AppEngineDriver的神奇部分,它可以根据上下文管理不同的连接类型Local MySQL或CloudSQL
  • 在这些行之后,代码非常简单:
    • 从数据存储区获取所有Articles实体并循环
    • “更新”数据库记录(REPLACE INTO语法)
  • 第15行使用KeyFactory.keyToString()方法将实体的Key存储在安全的字符串中。

如果要测试此代码,只需将此行放在servlet中,以将数据存储中的数据“ sycnhronize”到MySQL表中。 显然,这些代码只是在这里用于学习建议,应该以更好的方式集成到实际应用程序中。 首先是在创建/更新(和删除;)实体时将数据推送到数据库中)。 GitHub上的示例代码包含这些方法。

5.实施搜索方法

目标是简单返回由简单搜索条件返回的实体列表:

  • 公共Iterable searchEntities(字符串查询)

逻辑很简单:

  1. 执行SQL查询
  2. 对于每个结果,请使用密钥获取实体
  3. 返回实体列表
public IterablesearchEntity(String query) {List results = new ArrayList();Connection conn = null;try {DriverManager.registerDriver(new AppEngineDriver());conn = DriverManager.getConnection("jdbc:google:rdbms://[your db instance]/search_values");String statement = "SELECT entity_key FROM articles WHERE MATCH (title,body) AGAINST (? WITH QUERY EXPANSION);";PreparedStatement stmt = conn.prepareStatement(statement);stmt.setString(1, query);ResultSet rs = stmt.executeQuery();while (rs.next()) {String keyAsString = rs.getString(1);    Entity article = DatastoreServiceFactory.getDatastoreService().get( KeyFactory.stringToKey(keyAsString)  );results.add(article);}} catch (SQLException e) {e.printStackTrace();} catch (EntityNotFoundException e) {e.printStackTrace();} finally {if (conn != null)try {conn.close();} catch (SQLException ignore) {}}return results;}

在这种方法中,系统连接到数据库,然后执行查询以使用任何类型SQL / MySQL查询搜索数据。 在此示例中,我将全文功能与“ WITH QUERY EXPANSION ”一起使用。 如果这足以满足您的应用程序需求,那么显然可以使用任何类型SQL查询,例如简单的LIKE语句。

通过这种方法,当我搜索:

  • “数据库”:该方法独立于大小写,返回有关数据库,mysql,RDBMS的所有文章。
  • “索引”:该方法返回所有有关索引/索引或搜索的文章。

6.部署到GAE

一旦创建了应用程序,并激活并配置了CloudSQL实例( 在此处) ,就可以部署应用程序,并享受将全文搜索与GAE结合使用的简便方法。

结论

在本文中,我解释了如何基于MySQL对全文的支持,使用Google Cloud SQL轻松支持全文搜索查询。

我在本文中分享的代码段确实是基本的,还没有为实际使用做好准备,但仍然是一个不错的起点。 例如,我在我的GAE Queues应用程序中一直使用它来管理大量数据的索引。

如前所述,您可以在http://gae-fulltext-search.appspot.com/上在线测试该应用程序,并且源代码可在GitHub上找到: https : //github.com/tgrall/gae-full-text-搜索

参考:来自Tug博客博客的JCG合作伙伴 Tugdual Grall 使用Google Cloud Cloud SQL进行Google AppEngine全文搜索 。


翻译自: https://www.javacodegeeks.com/2012/06/google-app-engine-full-text-search-with.html

gkz cloud sql

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

poj1419 Graph Coloring 最大独立集(最大团)

最大独立集&#xff1a; 顶点集V中取 K个顶点&#xff0c;其两两间无连接。 最大团&#xff1a; 顶点集V中取 K个顶点&#xff0c;其两两间有边连接。 最大独立集补图的最大团最大团补图的最大独立集 #include<iostream> #include<cstring> #include<cstdio>…

android短信增加条目,Android仿短信条目右上角的红色小圆球提示气泡

可以重写View的onDraw完成该功能&#xff0c;也可以写布局文件完成该功能。现在使用布局文件完成。暂时先简单写一个TextView右上角的提示小红球&#xff0c;也可以根据需要写一个ImageView右上角的小红球提示。android:layout_width"match_parent"android:layout_he…

AccuREST Stub Runner发布

最近发布时间不错&#xff01; 我在Too Much Coding博客上的博客更多是关于发布&#xff0c;然后是关于任何具体主题;&#xff09; 在作为Brixton RC1的一部分发布Spring Cloud Sleuth之后&#xff0c;我们刚刚发布了AccuREST 1.0.4版本。 我们修复了一些错误&#xff0c;但引…

idea使用码云

每更改项目的内容会弹出框提示你是否需要发送码云更新 如果没选yes后想要更新码云 联合开发 发现回到A同事的项目中&#xff0c;Student.java并没有修改 完成后&#xff0c;发现的Student.java已经更新了&#xff0c;跟B同事的代码也是一样。因为从服务器下载了最新的代码。 …

android webview rem,Android部分webview rem计算误差记录

上周做了一个原生H5小游戏页面&#xff0c;使用rem来布局&#xff0c;然后在三星和华为的部分机型里面出现了rem计算出现误差的情况&#xff0c;截图如下在页面rem计算完成后&#xff0c;用两种方式获取font-size。然后结果不一样&#xff0c;导致某些元素通过rem计算后的值&am…

android usb弹窗权限r,Android USB权限对话框永远不会出现

我写了一个简单的应用程序,通过USB将命令发送到连接到Android 4.0平板电脑的USB打印机.出于某种原因,我无法获得声明接口和打开连接的权限.这是相关的代码&#xff1a;public class TestPrintActivity extends Activity {private UsbManager mUsbManager;private UsbDevice mDe…

mvvm 耗时加载进度条_ZK的实际应用:MVVM –加载和渲染数据

mvvm 耗时加载进度条先前的文章简要介绍了RIA框架ZK&#xff0c;以及其CSS Selector启发的控制器机制如何通过使在控制器类中引用UI组件的任务变得相对灵活来减轻UI更改所带来的一些负担。 然后&#xff0c;我们在上一篇文章中探讨了ZK中的MVVM模式如何允许单个ViewModel提供不…

@Autowired和可选依赖项

Autowired注释使我们的生活更轻松。 如果我们在类的属性上使用它&#xff0c;也可能导致代码量减少。 我们既不需要构造函数也不需要setter方法。 乍一看看起来很棒&#xff0c;但好处很少是没有成本的。 今天&#xff0c;我想让您知道必须支付的费用。 Autowired&#xff08…

¥人民币符号怎么打

有一种快捷键的方法&#xff08;不方便记忆&#xff09; 按住Alt0165 此方法适合任何输入法。转载于:https://www.cnblogs.com/wulibo/p/7575348.html

android 使用javascript,可以在Android中使用JavaScript吗?

可以在Android中使用JavaScript吗&#xff1f;如果是这样&#xff0c;怎么办&#xff1f;请提供一些示例。谢谢。最佳答案我在这里参加聚会很晚&#xff0c;但是我确实有这个需要。 iOS 7现在包含JavaScriptCorenative &#xff0c;并且确实很容易使用(尽管文档有限)。问题是我…

[POJ2151]Check the difficulty of problems(概率DP)

传送门 每个队之间是独立的 f[i][j]表示当前队伍前i个题答对j个的概率 满足条件的概率 全部方案&#xff08;除去答对0&#xff09;的概率 - 不满足条件的概率&#xff08;每个队伍答对1~n-1&#xff09; #include <cstdio> #include <cstring> #define N 101int …

ejb jsf jpa_完整的WebApplication JSF EJB JPA JAAS –第2部分

ejb jsf jpa视图–创建和JSF设置 本教程是第1部分的继续。 让我们创建一个新的Dynamic Web Project 。 如下图所示创建它&#xff1a; 请注意&#xff1a;在某些时候&#xff0c;Eclipse会询问您是否要添加JSF功能&#xff08;自动完成&#xff09;&#xff0c;然后启用它。 …

android ios logo原型,iOS关于logo和LaunchImage处理

1、软件测试的时候&#xff0c;程序员总会被测试的妹纸问到&#xff1a;这个logo怎么是黑底的呀&#xff1f;这个logo明明提供的正方形的&#xff0c;显示出来的怎么是圆角的&#xff1f;安卓都是正方形的呢&#xff1f;直接根据效果图来解释吧。不包含Alpha通道的logo包含Alph…

JavaFX:TouchGesture内存泄漏?

在我的一个项目中&#xff0c;最近几天我在与内存泄漏作斗争&#xff08;是……“耦合”&#xff09;&#xff0c;我得出的结论是可能存在与触摸/滚动手势有关的问题。 在下面的示例中&#xff0c;我有两个按钮。 第一个创建具有一千行的列表视图&#xff0c;第二个将其删除。 …

第2章 状态机思维与状态机变量

12312312转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/7590199.html

荣耀v40可以升级华为鸿蒙,网传荣耀V40机型也能升级鸿蒙OS 首批更新机型有望是这5款...

此前华为官方曾透露&#xff0c;所有可以升级到EMUI11系统的华为荣耀手机以后都可以升级更新到华为鸿蒙2.0系统&#xff0c;首批可以升级至EMUI11的手机和平板电脑共有55款。后续&#xff0c;又有传闻称&#xff0c;麒麟710处理器以上机型很可能都能更新EMUI11&#xff0c;也就…

Calendar

1. before&#xff0c;after 方法 &#xff0c;源码为&#xff1a; public boolean after(Object when) {return when instanceof Calendar&& compareTo((Calendar)when) > 0;} 这两方法参数类型是 Object 但只有是 Calendar 类型时才有可能返回true。转载于:https…

Android检测是否有悬浮窗,Android 获取判断是否有悬浮窗权限的方法

现在很多应用都会用到悬浮窗&#xff0c;很多国产rom把悬浮窗权限加入控制了&#xff0c;你就需要判断是否有悬浮窗权限&#xff0c;然后做对应操作。Android 原生有自带权限管理的&#xff0c;只是被隐藏了。看android源码在android.app下就有个AppOpsManager类。类说明如下&a…

在虚拟机中的Ubuntu搭建java开发环境

前提&#xff1a; 安装好虚拟机 在虚拟机中装好了Ubuntu系统 以上两步请参见我的博客&#xff08;python进阶&#xff09; 1 安装JDK 1.1 到官网下载jdk压缩包并保存在本地 jdk1.8&#xff1a;点击前往 1.2 在Ubuntu中创建一个文件用于存放下载好的jdk文件 利用 rz 命令将下载到…

mockito_Mockito和Hamcrest的试驾制造商

mockito过去&#xff0c;很多人问我是否测试吸气剂和吸气剂&#xff08;属性&#xff0c;属性等&#xff09;。 他们还问我是否测试我的建筑商。 在我看来&#xff0c;答案取决于情况。 当使用遗留代码时&#xff0c;我不会费心去测试数据结构&#xff0c;这意味着对象只带有ge…