gkz cloud sql_使用Cloud SQL的Google App Engine全文搜索
gkz cloud sql
許多Google AppEngine開(kāi)發(fā)人員一直在等待全文搜索功能,特別是來(lái)自網(wǎng)絡(luò)上最大的搜索引擎Google。 我很高興看到Google團(tuán)隊(duì)正在努力,您可以在Google I / O 2011會(huì)議上查看:Bo Majewski和Ged Ellis進(jìn)行的全文本搜索 。 據(jù)我所知,非常有前途的索引服務(wù)尚不可用。在本文中,我將說(shuō)明如何使用可用的App Engine服務(wù)在應(yīng)用程序中提供某種全文本搜索。
在我的特定用例中,我不需要很多功能,只需要簡(jiǎn)單地在與實(shí)例無(wú)關(guān)的情況下在我的實(shí)體的各種屬性中搜索字符串,以及可能的特殊字符(例如è,é,…)。 我還遠(yuǎn)不是Google Datastore API的專家,但我沒(méi)有找到直接使用Java API實(shí)現(xiàn)此目標(biāo)的任何簡(jiǎn)單方法。 解決此問(wèn)題的方法是將部分?jǐn)?shù)據(jù)復(fù)制到Google Cloud SQL中,以使用MySQL全文搜索功能。
先決條件
要完成以下任務(wù),您需要:
- 安裝Google AppEngine SDK for Java
- 安裝MySQL 5.5
- 具有AppEngine和Cloud SQL服務(wù)的Google帳戶。
- 可選: Eclipse插件,用于開(kāi)發(fā),調(diào)試和部署我的Web應(yīng)用程序到GAE
內(nèi)容
在以下各段中,我將解釋用于全文搜索的Cloud SQL集成的基礎(chǔ)知識(shí),但是如果需要,可以跳至:
- 完整的應(yīng)用程序代碼: https : //github.com/tgrall/gae-full-text-search
- 看一下正在運(yùn)行的應(yīng)用程序: http : //gae-fulltext-search.appspot.com/
1.創(chuàng)建文章實(shí)體
首先創(chuàng)建一些具有某些屬性的簡(jiǎn)單實(shí)體,例如,具有標(biāo)題和正文屬性的實(shí)體名稱Article。
如果您查看數(shù)據(jù)存儲(chǔ)區(qū)API,甚至JDO或JPA,就沒(méi)有簡(jiǎn)單的方法來(lái)查找與鐵人三項(xiàng),數(shù)據(jù)庫(kù)或?qū)嶓w相關(guān)的所有文章。 Google DataStore不支持在不同字段之間使用“或”的子句; 我不想提及一個(gè)事實(shí),即不可能以簡(jiǎn)單的方式忽略文本大小寫。
這就是為什么我們需要一些全文功能。 你們中的某些人肯定在考慮使用Apache Lucene來(lái)解決問(wèn)題,是的,這是可能的。 例如,您可以使用GAELucene項(xiàng)目: http : //code.google.com/p/gaelucene/ 。 我使用另一種方法,在“索引/搜索”選項(xiàng)方面可能不太先進(jìn),但足以滿足我的用例:
- 我將要在其中進(jìn)行搜索的文本值存儲(chǔ)在Google Cloud SQL中,并使用MySQL的“全文本”功能。
2.創(chuàng)建一個(gè)SQL表來(lái)存儲(chǔ)文本值(在開(kāi)發(fā)環(huán)境中)
使用Google AppEngine時(shí),將使用特定的驅(qū)動(dòng)程序和配置訪問(wèn)Cloud SQL實(shí)例,我們將在以后看到。 目前,我們?nèi)蕴幱陂_(kāi)發(fā)環(huán)境中,這是您必須使用本地MySQL實(shí)例的地方。
在這個(gè)特定的用例中,我們將在表中復(fù)制這兩個(gè)字段,并基于實(shí)體鍵添加一個(gè)新的唯一鍵。 所以在這里用SQL創(chuàng)建這個(gè):
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行在這里創(chuàng)建數(shù)據(jù)庫(kù)模式并使用它。 然后腳本將創(chuàng)建一個(gè)表,其中將包含來(lái)自實(shí)體的標(biāo)題和正文的副本。
3.配置您的開(kāi)發(fā)環(huán)境
本部分是Cloud SQL文檔的簡(jiǎn)短說(shuō)明: 入門:Java
現(xiàn)在,您的開(kāi)發(fā)環(huán)境已準(zhǔn)備就緒,可以使用本地MySQL數(shù)據(jù)庫(kù)了。 現(xiàn)在,使用此數(shù)據(jù)庫(kù)。
4.使用您MySQL表并將文本值從Google Datastore復(fù)制到MySQL表
將數(shù)據(jù)從數(shù)據(jù)存儲(chǔ)區(qū)實(shí)體復(fù)制到表非常簡(jiǎn)單:
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) {}}與標(biāo)準(zhǔn)的Java Web Development相比,這里有一些特別的東西:
- 我直接在代碼中管理連接( 如果可以在Google AppEngine的上下文中使用數(shù)據(jù)源/連接池,我還沒(méi)有看過(guò) )
- 第3行:注冊(cè)負(fù)責(zé)管理連接的AppEngine驅(qū)動(dòng)程序,特別是在開(kāi)發(fā)-本地MySQL-或生產(chǎn)模式-CloudSQL-中工作。
- 第4行:獲取連接。 有趣的是,在開(kāi)發(fā)中,連接URL是從您先前設(shè)置的環(huán)境變量Drdbms.url中獲取的。 稍后我們將看到如何將其轉(zhuǎn)移到云中。 這是AppEngineDriver的神奇部分,它可以根據(jù)上下文管理不同的連接類型Local MySQL或CloudSQL
- 在這些行之后,代碼非常簡(jiǎn)單:
- 從數(shù)據(jù)存儲(chǔ)區(qū)獲取所有Articles實(shí)體并循環(huán)
- “更新”數(shù)據(jù)庫(kù)記錄(REPLACE INTO語(yǔ)法)
- 第15行使用KeyFactory.keyToString()方法將實(shí)體的Key存儲(chǔ)在安全的字符串中。
如果要測(cè)試此代碼,只需將此行放在servlet中,以將數(shù)據(jù)存儲(chǔ)中的數(shù)據(jù)“ sycnhronize”到MySQL表中。 顯然,這些代碼只是在這里用于學(xué)習(xí)建議,應(yīng)該以更好的方式集成到實(shí)際應(yīng)用程序中。 首先是在創(chuàng)建/更新(和刪除;)實(shí)體時(shí)將數(shù)據(jù)推送到數(shù)據(jù)庫(kù)中)。 GitHub上的示例代碼包含這些方法。
5.實(shí)施搜索方法
目標(biāo)是簡(jiǎn)單返回由簡(jiǎn)單搜索條件返回的實(shí)體列表:
- 公共Iterable searchEntities(字符串查詢)
邏輯很簡(jiǎn)單:
在這種方法中,系統(tǒng)連接到數(shù)據(jù)庫(kù),然后執(zhí)行查詢以使用任何類型SQL / MySQL查詢搜索數(shù)據(jù)。 在此示例中,我將全文功能與“ WITH QUERY EXPANSION ”一起使用。 如果這足以滿足您的應(yīng)用程序需求,那么顯然可以使用任何類型SQL查詢,例如簡(jiǎn)單的LIKE語(yǔ)句。
通過(guò)這種方法,當(dāng)我搜索:
- “數(shù)據(jù)庫(kù)”:該方法獨(dú)立于大小寫,返回有關(guān)數(shù)據(jù)庫(kù),mysql,RDBMS的所有文章。
- “索引”:該方法返回所有有關(guān)索引/索引或搜索的文章。
6.部署到GAE
一旦創(chuàng)建了應(yīng)用程序,并激活并配置了CloudSQL實(shí)例( 在此處) ,就可以部署應(yīng)用程序,并享受將全文搜索與GAE結(jié)合使用的簡(jiǎn)便方法。
結(jié)論
在本文中,我解釋了如何基于MySQL對(duì)全文的支持,使用Google Cloud SQL輕松支持全文搜索查詢。
我在本文中分享的代碼段確實(shí)是基本的,還沒(méi)有為實(shí)際使用做好準(zhǔn)備,但仍然是一個(gè)不錯(cuò)的起點(diǎn)。 例如,我在我的GAE Queues應(yīng)用程序中一直使用它來(lái)管理大量數(shù)據(jù)的索引。
如前所述,您可以在http://gae-fulltext-search.appspot.com/上在線測(cè)試該應(yīng)用程序,并且源代碼可在GitHub上找到: https : //github.com/tgrall/gae-full-text-搜索
參考:來(lái)自Tug博客博客的JCG合作伙伴 Tugdual Grall 使用Google Cloud Cloud SQL進(jìn)行Google AppEngine全文搜索 。
翻譯自: https://www.javacodegeeks.com/2012/06/google-app-engine-full-text-search-with.html
gkz cloud sql
總結(jié)
以上是生活随笔為你收集整理的gkz cloud sql_使用Cloud SQL的Google App Engine全文搜索的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用JavaFX构建反应系统
- 下一篇: iRobot 推出 Roomba j9+