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

许多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 Arguments”窗格中:
    -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队列应用程序中使用它来管理大量数据的索引。

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

参考:来自我们的JCG合作伙伴 Tugdual Grall的Google AppEngine全文搜索与Cloud SQL,来自Tug的Blog博客。


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

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

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

相关文章

php 数组值sum,php sum数组值(如果特定列的值重复)

我有一个阵列。我要检查是否有重复的费用,如果有,我要用相同的费用列汇总所有值。[12] > Array([type] > Other Miscellaneous Fees[fee] > 158[amount] > -22.56[code] > COL_AUDIO[feedesc] > COLLEGE AUDIO VISUAL FEE)[13] > Array([type] > Other…

hdu-5734 Acperience(数学)

题目链接: Acperience Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem DescriptionDeep neural networks (DNN) have shown significant improvements in several application domains including computer vision and…

Ninject依赖注入(一)

Ninject学习笔记(一) Ninject学习笔记(一)理解依赖注入DI概念什么是DI?DI是如何工作的?什么是DI容器使用Ninject如何使用NinjectNinject对象生命周期暂时范围单例范围线程范围请求范围自定义范围Ninject模块…

我如何向团队解释依赖注入

最近,我们公司开始开发基于Java的新Web应用程序,经过一些评估过程,我们决定使用Spring。 但是许多团队成员并不了解Spring和Dependency Injection的原理。 因此,我被要求给出一个速成班,介绍什么是Spring上的依赖注入和…

可以添加自定义的Select控件

1.控件dom <select name"WebSiteTarget" id"WebSiteTarget" class"w1" onchange"editable2(this);"><option value"-1">请选择城市</option><option>福州</option><option>厦门</op…

innodb_io_capacity =innodb_lru_scan_depth*inoodb_buffer_pool_instances。与 checkpoint

innodb_lru_scan_depth:每个缓冲池刷脏页的能力 innodb_io_capacity: iops inoodb_buffer_pool_instances8 :缓冲池的个数 .关系&#xff1a; innodb_io_capacity > innodb_lru_scan_depth * inoodb_buffer_pool_instances 转载于:https://www.cnblogs.com/zengkefu/…

Java中的责任链模式

当应有几个处理器来执行某项操作并为这些处理器定义特定顺序时&#xff0c;就需要采用责任链设计模式。 在运行时处理器顺序的可变性也很重要。模式的UML表示如下&#xff1a; 处理程序定义处理器对象的一般结构。 这里的“ HandleRequest”是抽象处理器方法。 处理程序还具有自…

php的excel源码下载,PHPExcel-5 - 源码下载|Windows编程|其他小程序|源代码 - 源码中国...

文件名大小更新时间PHPExcel02019-05-11PHPExcel\.gitattributes702019-01-02PHPExcel\.gitignore1082019-01-02PHPExcel\.travis.yml5122019-01-02PHPExcel\16329.xlsx510662019-05-11PHPExcel\19093.xlsx511932019-05-11PHPExcel\43877.xlsx530952019-05-11PHPExcel\62045.xl…

使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(六)-- 依赖注入

本篇将介绍Asp.Net Core中一个非常重要的特性&#xff1a;依赖注入&#xff0c;并展示其简单用法。 第一部分、概念介绍 Dependency Injection&#xff1a;又称依赖注入&#xff0c;简称DI。在以前的开发方式中&#xff0c;层与层之间、类与类之间都是通过new一个对方的实例进行…

基于JAX-WS的webService开发实例

最近因为工作原因接触到webService&#xff0c;所以记录下开发中碰到的问题&#xff0c;方便自己以后复习&#xff0c;顺便发扬一下开源精神。刚刚接触webServie如果有什么错误欢迎大家指正。 本地环境&#xff1a;myEclipse10.6 tomcat7 JDK7 jaxws-ri-2.2.10 第一步&#xff…

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

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

lempel ziv matlab,基于Python的LempelZiv算法的熵估计

此函数允许估计时间序列的熵。它基于Lempel-Ziv压缩算法。对于长度为n的时间序列&#xff0c;熵估计为&#xff1a;E(1/n和L_i)^-1 ln(n)式中&#xff0c;L逯i是从位置i开始的最短子串的长度&#xff0c;该子串之前没有从位置1出现到i-1。当n接近无穷大时&#xff0c;估计的熵收…

Android使用绘图Path总结

Path作为Android中一种相对复杂的绘图方式&#xff0c;官方文档中的有些解释并不是很好理解&#xff0c;这里作一个相对全面一些的总结&#xff0c;供日后查看&#xff0c;也分享给大家&#xff0c;共同进步。 1.基本绘图方法 addArc(RectF oval, float startAngle, float swee…

2017.3.23下午

下午通过对OSPF基本原理进一步的学习&#xff0c;对上午学习的内容进行了复习。 转载于:https://www.cnblogs.com/bgd140206206/p/6606192.html

编写Eclipse插件教程–第1部分

Eclipse是三个最受欢迎的Java开发IDE之一。 其成功的原因之一是其可扩展性。 对于任何知道该怎么做并且已经做到的人来说&#xff0c;编写eclipse插件都可以非常轻松快捷。 不幸的是&#xff0c;第一次在Eclipse中进行操作可能会非常耗时且令人沮丧。 Eclipse框架非常庞大&…

简单Window下 Android Studio的安装

&#xff08;1&#xff09;首先安装JDK 下载JDK 本人觉得官方网站下JDK比较慢&#xff0c;可以直接百度JDK&#xff0c;&#xff08;如果是64位 百度搜索记得64位&#xff09; 类似于这样的下载 安装可以看下教程&#xff0c;包括环境变量的配置 如何安装JDK &#xff08;2&…

日期处理一之NSLalendar的使用

一、日期和时间模式 日期和时间格式由日期和时间模式字符串组成&#xff0c;在日期和时间模式字符串中未加引号的A到‘Z’和a到‘z’被解释为模式字母&#xff0c;用来表示日期或时间。字符串元素&#xff0c;文本可以使用单引号&#xff08;‘’&#xff09;引起来使用。定义以…

java的使用Pair要导入什么包,第三方jar包的使用

被导入的外部类所在源文件通常要打包成jar包&#xff0c;java中的jar文件装的是 .class 文件。它是一种压缩格式和zip兼容&#xff0c;被称为jar包。JDK提供的许多类&#xff0c;也是以jar包的形式提供的。在用的时候呢&#xff0c;你的文件里有很多个类&#xff0c;把这些类和…

十大最受欢迎的新Eclipse插件

Eclipse Marketplace仍然是发现有趣且相关的Eclipse插件的地方。 通过Eclipse Marketplace客户端&#xff0c;每月成功安装100,000多个基于Eclipse的产品。 我们提供了过去30天 以来所有时间最受欢迎的插件列表。 我认为看看过去12个月中最受欢迎的新插件会很有趣。 以下列出了…

在桌面显示我电脑

打开Windows PowerShell&#xff08;一个像是命令提示符的东西[蓝底白字]&#xff0c;但不是命令提示符&#xff09;&#xff0c;在Windows PowerShell内输入cmd回车&#xff0c;当返回如下信息&#xff1a; Microsoft Windows [版本 6.2.9200](c) 2012 Microsoft Corporation。…