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

gkz cloud sql_使用Cloud SQL的Google App Engine全文搜索相关推荐

  1. 使用Cloud SQL的Google App Engine全文搜索

    许多Google AppEngine开发人员一直在等待全文搜索功能,特别是来自网络上最大的搜索引擎Google. 很高兴看到Google团队正在努力,您可以在Google I / O 2011大会上签 ...

  2. 探索Google App Engine背后的奥秘

    探索Google App Engine背后的奥秘(1)--Google的核心技术 作者: ikewu | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及 版权声明 网址: http://w ...

  3. 通过google app engine 在google cloud 部署支持quic的Java web 应用(多种方式)

    quic最先是由google提出并完善的,18年google cloud支持了quic协议,我尝试在google上部署一套自己的应用,并使其支持quic协议 google的文档还是非常完善的,只是类似 ...

  4. spring roo_使用Spring Roo进行快速云开发–第1部分:Google App Engine(GAE)

    spring roo Spring Roo是在Java平台上提供快速应用程序开发的工具. 我已经解释了何时使用它: http : //www.kai-waehner.de/blog/2011/04/0 ...

  5. 使用Spring Roo进行快速云开发–第1部分:Google App Engine(GAE)

    Spring Roo是在Java平台上提供快速应用程序开发的工具. 我已经解释了何时使用它: http : //www.kai-waehner.de/blog/2011/04/05/when-to-u ...

  6. 如何使用Python的Flask和Google App Engine构建网络应用

    by Tristan Ganry 由Tristan Ganry 这是一个小型教程项目,用于为初学者学习Flask,API和Google App Engine. (This is a small tut ...

  7. 使用 Grails 开发 Google App Engine 应用

    Grails 作为 Web 框架的新生力量,已经被越来越多的开发人员所接受.而 Google App Engine(以下简称 GAE)作为云计算的平台,为应用提供了广阔的扩展空间.如何将二者擦出绚丽的 ...

  8. 闭关纪要17.Google app engine的简单应用

    在上面用了十一篇博客的文章详细的介绍了,Step1账户登录系统之后,从现在开始,继续写闭关纪要,因为Step1账户登录系统也是闭关工作的一部分,因此保留序号,这篇纪要在上次的闭关纪要5.WML,UTF ...

  9. Google App Engine 学习和实践

    这个周末玩了玩Google App Engine,随手写点东西,算是学习笔记吧.不当之处,请多多指正. 作者:liigo,2009/04/26夜,大连 原创链接:http://blog.csdn.ne ...

最新文章

  1. Python多线程中阻塞(join)与锁(Lock)的使用误区
  2. Linux系统命令三剑客之 awk
  3. jvm 崩溃日志设置_记一次JVM疯狂GC导致CPU飙高的问题解决
  4. BZOJ 3479: [Usaco2014 Mar]Watering the Fields( MST )
  5. php的mktime,PHP mktime()函数获得本地时间戳
  6. citrix+netscaler配置第一次培训
  7. TX2开发板Ubuntu16.04设置静态IP
  8. P2S、P2P、P2SP之对比
  9. M2Det 论文解读
  10. AD软件系统参数的一些基本设置(Altium Designer 20 19(入门到精通全38集)四层板智能车PCB设计视频教程AD19 AD20 凡亿)
  11. 深信服AC1100上网行为管理
  12. 苹果apple pay原理_Apple Pay的工作原理
  13. 800万像素摄像头,评估可以看到多远的红绿灯【1】?
  14. 20145312 《信息安全系统设计基础》实验三 实时系统的移植
  15. 高等数学——多元函数最值问题
  16. java 判断两个单链表是否相交
  17. 【数据结构(2)】1.2 数据结构的基本概念和术语
  18. 基于C++的机械图形零件模型展示系统
  19. 第十二届蓝桥杯 2021年省赛真题 (C/C++ 大学A组) 第一场
  20. ubuntu下面kill掉卡巴斯基shell脚本

热门文章

  1. 乐观锁的一种实现方式——CAS
  2. 通过实例理解 JDK8 的 CompletableFuture
  3. 手把手教你搭建Maven项目
  4. db9针232接口波特率标准_理解串口通信以及232,485,422常见问题
  5. python中ls是什么_使用Python代码实现Linux中的ls遍历目录命令的实例代码
  6. tomcat(11)org.apache.catalina.core.StandardWrapper源码剖析
  7. java github_GitHub Research:超过50%的Java记录语句写错了
  8. tcga癌症亚型获取_亚型多态性应用于元组的危险
  9. 关于RabbitMQ集群分区的通知
  10. jsf 单元测试_构建和测试JSF.next