196
Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg, Google

Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Creating a Client-Side Search Engine with

Gears and DojoBrad Neuberg, Google

Page 2: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Agenda

• Gears

• PubTools Search

• Gears Modules

• Search Architecture

• Dojo

• Tips, Tricks, and Code

Page 3: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScript

What is Gears?

Page 4: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScript

What is Gears?

Page 5: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScript

What is Gears?

Page 6: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScript

What is Gears?

Page 7: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScript

What is Gears?

HTML 5

Page 8: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScript

What is Gears?

HTML 5

Page 9: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScript

Ajax++

Page 10: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScriptDatabase

Ajax++

Page 11: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScriptDatabase

Ajax++

Client-Side Search

Page 12: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScriptDatabase

Worker Pool

Ajax++

Client-Side Search

Page 13: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScriptDatabase

Worker Pool

Desktop API

Ajax++

Client-Side Search

Page 14: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScriptDatabase

Local Server

Worker Pool

Desktop API

Ajax++

Client-Side Search

Page 15: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScriptDatabase

Local Server

Worker Pool

Desktop API

Ajax++

Client-Side Search

Blobs

Page 16: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScript

Ajax++

Page 17: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScript

Ajax++

File System API

Page 18: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

HTML

CSS

JavaScript

Ajax++

Geolocation

File System API

Page 19: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

PubTools Search

• Not part of Gears

• Independent open source project

• Simple scripts

• Sprinkle HTML

• Client-side search engine

Page 20: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Demo

Page 21: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Why?

Page 22: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Why?

• Fast, Fast, Fast

Page 23: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Why?

• Fast, Fast, Fast

• No network latency

Page 24: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Why?

• Fast, Fast, Fast

• No network latency

• No server

Page 25: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Why?

• Fast, Fast, Fast

• No network latency

• No server

• Your documents

Page 26: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Why?

• Fast, Fast, Fast

• No network latency

• No server

• Your documents

• Simple

Page 27: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Why?

• Fast, Fast, Fast

• No network latency

• No server

• Your documents

• Simple

• Good Gears and Dojo example

Page 28: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

How to UseCreate text file with URLs to index

search.txt:version=0.1resources/descartes.txtresources/goethe.txtresources/goldman.txtresources/machiavelli.txtresources/montaigne.txtresources/kafka.htmlresources/plato.html

Page 29: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

How to UsePull in CSS and JavaScript:<link rel="stylesheet" type="text/css" href="pubtools-search.css"></link>

<script src="pubtools-util.js"></script><script src="pubtools-search.js"></script>

Page 30: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

How to UseAdd DIV to HTML:<div id="st-widget"></div>

Page 31: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

How to UseUpdate search file:

search.txt:version=0.2resources/descartes.txtresources/goethe.txtresources/goldman.txtresources/machiavelli.txtresources/montaigne.txtresources/kafka.htmlresources/plato.htmlresources/woolf.html

Page 32: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Done!

Page 33: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Gears Modules

Page 34: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database

Page 35: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database

• Local SQL storage

• SQLite: Open source, mature, small (343K), fast

• Full-featured relational database

• Gigabytes of storage capacity

• Strict same-origin security model

Page 36: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Code

Page 37: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar db = google.gears.factory.create('beta.database');

Page 38: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar db = google.gears.factory.create('beta.database');

db.open('database-test');

Page 39: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar db = google.gears.factory.create('beta.database');

db.open('database-test');

db.execute('CREATE TABLE IF NOT EXISTS Test' +

Page 40: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar db = google.gears.factory.create('beta.database');

db.open('database-test');

db.execute('CREATE TABLE IF NOT EXISTS Test' + ' (Phrase TEXT, Timestamp INT)');

Page 41: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar db = google.gears.factory.create('beta.database');

db.open('database-test');

db.execute('CREATE TABLE IF NOT EXISTS Test' + ' (Phrase TEXT, Timestamp INT)');

db.execute('INSERT INTO Test VALUES (?, ?)', ['Monkey!',

Page 42: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar db = google.gears.factory.create('beta.database');

db.open('database-test');

db.execute('CREATE TABLE IF NOT EXISTS Test' + ' (Phrase TEXT, Timestamp INT)');

db.execute('INSERT INTO Test VALUES (?, ?)', ['Monkey!', new Date().getTime()]);

Page 43: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Code

Page 44: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar rs;

Page 45: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar rs;

try {

Page 46: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar rs;

try {rs = db.execute('SELECT * FROM Test ORDER BY Timestamp DESC');

Page 47: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar rs;

try {rs = db.execute('SELECT * FROM Test ORDER BY Timestamp DESC');

while (rs.isValidRow()) {

Page 48: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar rs;

try {rs = db.execute('SELECT * FROM Test ORDER BY Timestamp DESC');

while (rs.isValidRow()) { console.log(rs.fieldByName(‘Phrase’) + '@'

Page 49: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar rs;

try {rs = db.execute('SELECT * FROM Test ORDER BY Timestamp DESC');

while (rs.isValidRow()) { console.log(rs.fieldByName(‘Phrase’) + '@'

+ rs.fieldByName(‘Timestamp’));

Page 50: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar rs;

try {rs = db.execute('SELECT * FROM Test ORDER BY Timestamp DESC');

while (rs.isValidRow()) { console.log(rs.fieldByName(‘Phrase’) + '@'

+ rs.fieldByName(‘Timestamp’)); rs.next();

Page 51: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar rs;

try {rs = db.execute('SELECT * FROM Test ORDER BY Timestamp DESC');

while (rs.isValidRow()) { console.log(rs.fieldByName(‘Phrase’) + '@'

+ rs.fieldByName(‘Timestamp’)); rs.next();}

Page 52: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar rs;

try {rs = db.execute('SELECT * FROM Test ORDER BY Timestamp DESC');

while (rs.isValidRow()) { console.log(rs.fieldByName(‘Phrase’) + '@'

+ rs.fieldByName(‘Timestamp’)); rs.next();}

} finally {

Page 53: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar rs;

try {rs = db.execute('SELECT * FROM Test ORDER BY Timestamp DESC');

while (rs.isValidRow()) { console.log(rs.fieldByName(‘Phrase’) + '@'

+ rs.fieldByName(‘Timestamp’)); rs.next();}

} finally {rs.close();

Page 54: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar rs;

try {rs = db.execute('SELECT * FROM Test ORDER BY Timestamp DESC');

while (rs.isValidRow()) { console.log(rs.fieldByName(‘Phrase’) + '@'

+ rs.fieldByName(‘Timestamp’)); rs.next();}

} finally {rs.close();db.close();

Page 55: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Database Codevar rs;

try {rs = db.execute('SELECT * FROM Test ORDER BY Timestamp DESC');

while (rs.isValidRow()) { console.log(rs.fieldByName(‘Phrase’) + '@'

+ rs.fieldByName(‘Timestamp’)); rs.next();}

} finally {rs.close();db.close();

}

Page 56: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Full-Text Search

Page 57: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Full Text Search•Gears added FTS2 to SQLite

•Create the databasedb.execute('CREATE VIRTUAL TABLE recipe USING fts2(dish, ingredients)');

•Search the databasedb.execute('SELECT dish FROM recipe WHERE recipe MATCH ?', ['tomatoes']);

Fun queries: dish:stew tomatoes Find rows with 'stew' in the dish field, and 'tomatoes' in any field.

Page 58: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Worker Pool

Page 59: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Worker PoolJavaScript needs threads after all? Brendan!

Browser JavaScript Engine

WorkerPool

WorkerPool

window, document no access

Page 60: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Worker Pool Codevar pool = google.gears.factory.create('beta.workerpool');

pool.onmessage = function(message) { alert('next prime is: ' + message);}

function nextPrime(n) { // TODO: Prime-finding algorithm goes here. google.gears.workerPool.sendMessage(result);}

var runMe = String(nextPrime) + '; nextPrime()';

var worker = pool.createWorker(runMe);

Page 61: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Architecture

Page 62: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,
Page 63: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

SearchTools

search(query)handleError(err)

ready_()getDatabaseName_()createDatabaseTables_()

Page 64: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

SearchTools

search(query)handleError(err)

ready_()getDatabaseName_()createDatabaseTables_()

UI

constructor(id)

embed()status(msg)clearStatus()tickProgress(msg)showResults(entries)clearResults()

Page 65: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

SearchTools

search(query)handleError(err)

ready_()getDatabaseName_()createDatabaseTables_()

UI

constructor(id)

embed()status(msg)clearStatus()tickProgress(msg)showResults(entries)clearResults()

SearchManifest

constructor(url)

fetch_(url)parse_()process_()getDBVersion_()putDBVersion_(version)getFinishedIndexing_()

Page 66: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

SearchTools

search(query)handleError(err)

ready_()getDatabaseName_()createDatabaseTables_()

UI

constructor(id)

embed()status(msg)clearStatus()tickProgress(msg)showResults(entries)clearResults()

SearchManifest

constructor(url)

fetch_(url)parse_()process_()getDBVersion_()putDBVersion_(version)getFinishedIndexing_()

Documents

constructor(urls)

filter_(urls, callback)download_(urls)

Page 67: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

SearchTools

search(query)handleError(err)

ready_()getDatabaseName_()createDatabaseTables_()

UI

constructor(id)

embed()status(msg)clearStatus()tickProgress(msg)showResults(entries)clearResults()

SearchManifest

constructor(url)

fetch_(url)parse_()process_()getDBVersion_()putDBVersion_(version)getFinishedIndexing_()

Documents

constructor(urls)

filter_(urls, callback)download_(urls)

Indexer

constructor(numDocs)index(url, mimeType, doc)

indexWorker_(message)getTitle_(url, mimeType,

doc)

Page 68: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

SearchTools

search(query)handleError(err)

ready_()getDatabaseName_()createDatabaseTables_()

UI

constructor(id)

embed()status(msg)clearStatus()tickProgress(msg)showResults(entries)clearResults()

SearchManifest

constructor(url)

fetch_(url)parse_()process_()getDBVersion_()putDBVersion_(version)getFinishedIndexing_()

Documents

constructor(urls)

filter_(urls, callback)download_(urls)

Indexer

constructor(numDocs)index(url, mimeType, doc)

indexWorker_(message)getTitle_(url, mimeType,

doc)

Searcher

search(query, callback)

getSnippet_(query, mimeType, content)

escapeString_(str)

Page 69: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

SearchTools

Page 70: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

SearchTools

get database name

Page 71: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

SearchTools

get database name

create database tables

Page 72: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

SearchTools

get database name

create database tables

wait for page to finish loading

Page 73: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

UI

Page 74: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

UI

initialize UI

Page 75: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

UI

initialize UI

get search manifest URL

SearchTools

Page 76: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

SearchManifest

Page 77: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

SearchManifest

fetch and parse search manifest file

Page 78: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

do we need to

index?

Yes

Nodone

SearchManifest

fetch and parse search manifest file

Page 79: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

persist new search manifest version

Page 80: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

persist new search manifest version

Documents

Page 81: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

persist new search manifest version

Documents

filter URLs by mime type

Page 82: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

persist new search manifest version

Documents

filter URLs by mime type

for HTML, XML, and text documents...

download documents

Page 83: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

Indexer

as each document’s contents comes in...

Page 84: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

Indexer

as each document’s contents comes in...

extract title

Page 85: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

Indexer

as each document’s contents comes in...

extract title

insert new FTS row

Page 86: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Indexing

Indexer

as each document’s contents comes in...

extract title

insert new FTS row

done

when all documents downloaded and indexed....

Page 87: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Searching

UI

user wants to search using query string

Page 88: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Searching

UI

user wants to search using query string

start search

SearchTools

Page 89: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Searching

Searcher

Page 90: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Searching

Searcher

execute query against FTS index

Page 91: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Searching

Searcher

execute query against FTS index

for each match...

generate result snippet

Page 92: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Searching

UI

display results

Page 93: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,
Page 94: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,
Page 95: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,
Page 96: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,
Page 97: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,
Page 98: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,
Page 99: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Open source

Page 100: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Open source

• http://dojotoolkit.org

Page 101: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Open source

• http://dojotoolkit.org

• Three pieces

Page 102: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Open source

• http://dojotoolkit.org

• Three pieces

• core - 24K gzipped

Page 103: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Open source

• http://dojotoolkit.org

• Three pieces

• core - 24K gzipped

• dijit

Page 104: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Open source

• http://dojotoolkit.org

• Three pieces

• core - 24K gzipped

• dijit

• dojoX

Page 105: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,
Page 106: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Includes build system

Page 107: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Includes build system

• Special build for PubTools

Page 108: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Includes build system

• Special build for PubTools

• pubtools-util.js

Page 109: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,
Page 110: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Re-namespaced ‘dojo’ element

Page 111: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Re-namespaced ‘dojo’ element

• ‘pu’

Page 112: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Re-namespaced ‘dojo’ element

• ‘pu’

• No collisions

Page 113: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Re-namespaced ‘dojo’ element

• ‘pu’

• No collisions

• Example:

Page 114: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Re-namespaced ‘dojo’ element

• ‘pu’

• No collisions

• Example:

• dojo.hitch()

Page 115: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

• Re-namespaced ‘dojo’ element

• ‘pu’

• No collisions

• Example:

• dojo.hitch()

• pu.hitch()

Page 116: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

XHRdownload_: function(downloadMe) { var idx = new Indexer(downloadMe.length); pu.forEach(downloadMe, function(entry) { var url = entry.url; var mimeType = entry.mimeType; pu.xhrGet({ url: url, load: function(data) { idx.index(url, mimeType, data); }, error: function(err) { searchTools.handleError(err); } }); });}

Page 117: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Declare

pu.declare('Searcher', null, { search: function(query, callback) { },

escapeString_: function(str) { }, getSnippet_: function(query, mimeType, content) { }});

Page 118: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Hitchpu.declare('Documents', null, { constructor: function(urls) { this.filter_(urls, pu.hitch(this, this.download_)); },

filter_: function(urls, callback) { // filter the URLs here asynchronously // ... callback(filteredURLs) },

download_: function(downloadMe) { this.doSomething_(); }});

Page 119: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Query and byId

Page 120: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Query and byId

var query = pu.query('.gsc-input')[0].value;

Page 121: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Query and byId

var query = pu.query('.gsc-input')[0].value;searchTools.search(query);

Page 122: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Query and byId

var query = pu.query('.gsc-input')[0].value;searchTools.search(query);

Page 123: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Query and byId

var query = pu.query('.gsc-input')[0].value;searchTools.search(query);

// ...

Page 124: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Query and byId

var query = pu.query('.gsc-input')[0].value;searchTools.search(query);

// ...

Page 125: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Query and byId

var query = pu.query('.gsc-input')[0].value;searchTools.search(query);

// ...

var w = pu.byId('st-widget');

Page 126: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Tips & Tricks

• Do intensive operations on Workers!

• Database

• Network

• Searching FTS

Page 127: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Tips & Tricks

• Stringify workers:index: function(url, mimeType, doc) { workerScript =

'var getTitle = ' + String(this.getTitle_) + '; ' + 'google.gears.workerPool.onmessage = ' + String(this.indexWorker_); // ...},

indexWorker_: function(a, b, message) {},

getTitle: function(url, mimeType, doc) {}

Page 128: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Tips & Tricks

• Objects are automatically serialized for Workers:

var childWorkerId = worker.createWorker(workerScript);

var msg = {url: url, mimeType: mimeType, doc: doc, dbName: dbName};

//msg = pu.toJson(msg); // used to be needed

worker.sendMessage(msg, childWorkerId);

Page 129: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Tips & Tricks

• Use a closure for encapsulation:var searchTools = function() { // top of file

pu.declare('SearchTools', null, { /* ... */ }); pu.declare('UI', null, { /* ... */ }); pu.declare('SearchManifest', null, { /* ... */ }); pu.declare('Documents', null, { /* ... */ }); pu.declare('Indexer', null, { /* ... */ }); pu.declare('Searcher', null, { /* ... */ });

searchTools = new SearchTools(); return searchTools;}(); // bottom of file

Page 130: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables

Page 131: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() {

createDatabaseTables

Page 132: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database');

createDatabaseTables

Page 133: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database'); db.open(dbName);

createDatabaseTables

Page 134: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database'); db.open(dbName);

createDatabaseTables

Page 135: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database'); db.open(dbName); db.execute('CREATE TABLE IF NOT EXISTS ClientMetadata '

createDatabaseTables

Page 136: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database'); db.open(dbName); db.execute('CREATE TABLE IF NOT EXISTS ClientMetadata ' + '(version VARCHAR UNIQUE, '

createDatabaseTables

Page 137: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database'); db.open(dbName); db.execute('CREATE TABLE IF NOT EXISTS ClientMetadata ' + '(version VARCHAR UNIQUE, ' + ' schemaVersion VARCHAR, '

createDatabaseTables

Page 138: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database'); db.open(dbName); db.execute('CREATE TABLE IF NOT EXISTS ClientMetadata ' + '(version VARCHAR UNIQUE, ' + ' schemaVersion VARCHAR, ' + ' finishedIndexing INTEGER)');

createDatabaseTables

Page 139: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database'); db.open(dbName); db.execute('CREATE TABLE IF NOT EXISTS ClientMetadata ' + '(version VARCHAR UNIQUE, ' + ' schemaVersion VARCHAR, ' + ' finishedIndexing INTEGER)');

createDatabaseTables

Page 140: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database'); db.open(dbName); db.execute('CREATE TABLE IF NOT EXISTS ClientMetadata ' + '(version VARCHAR UNIQUE, ' + ' schemaVersion VARCHAR, ' + ' finishedIndexing INTEGER)'); try {

createDatabaseTables

Page 141: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database'); db.open(dbName); db.execute('CREATE TABLE IF NOT EXISTS ClientMetadata ' + '(version VARCHAR UNIQUE, ' + ' schemaVersion VARCHAR, ' + ' finishedIndexing INTEGER)'); try { db.execute('CREATE VIRTUAL TABLE ClientSearch '

createDatabaseTables

Page 142: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database'); db.open(dbName); db.execute('CREATE TABLE IF NOT EXISTS ClientMetadata ' + '(version VARCHAR UNIQUE, ' + ' schemaVersion VARCHAR, ' + ' finishedIndexing INTEGER)'); try { db.execute('CREATE VIRTUAL TABLE ClientSearch ' + 'USING fts2(url, title, mimeType, content)');

createDatabaseTables

Page 143: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database'); db.open(dbName); db.execute('CREATE TABLE IF NOT EXISTS ClientMetadata ' + '(version VARCHAR UNIQUE, ' + ' schemaVersion VARCHAR, ' + ' finishedIndexing INTEGER)'); try { db.execute('CREATE VIRTUAL TABLE ClientSearch ' + 'USING fts2(url, title, mimeType, content)'); } catch (e) {} // just ignore if it exists

createDatabaseTables

Page 144: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database'); db.open(dbName); db.execute('CREATE TABLE IF NOT EXISTS ClientMetadata ' + '(version VARCHAR UNIQUE, ' + ' schemaVersion VARCHAR, ' + ' finishedIndexing INTEGER)'); try { db.execute('CREATE VIRTUAL TABLE ClientSearch ' + 'USING fts2(url, title, mimeType, content)'); } catch (e) {} // just ignore if it exists},

createDatabaseTables

Page 145: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

createDatabaseTables_: function() { db = google.gears.factory.create('beta.database'); db.open(dbName); db.execute('CREATE TABLE IF NOT EXISTS ClientMetadata ' + '(version VARCHAR UNIQUE, ' + ' schemaVersion VARCHAR, ' + ' finishedIndexing INTEGER)'); try { db.execute('CREATE VIRTUAL TABLE ClientSearch ' + 'USING fts2(url, title, mimeType, content)'); } catch (e) {} // just ignore if it exists},

createDatabaseTables

Page 146: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker

Page 147: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) {

indexWorker

Page 148: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body;

indexWorker

Page 149: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body;

indexWorker

Page 150: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata

indexWorker

Page 151: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc);

indexWorker

Page 152: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc);

indexWorker

Page 153: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database');

indexWorker

Page 154: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName);

indexWorker

Page 155: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName); try {

indexWorker

Page 156: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName); try { db.execute('INSERT INTO ClientSearch '

indexWorker

Page 157: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName); try { db.execute('INSERT INTO ClientSearch ' + '(url, title, mimeType, content) '

indexWorker

Page 158: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName); try { db.execute('INSERT INTO ClientSearch ' + '(url, title, mimeType, content) ' + 'VALUES (?, ?, ?, ?)',

indexWorker

Page 159: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName); try { db.execute('INSERT INTO ClientSearch ' + '(url, title, mimeType, content) ' + 'VALUES (?, ?, ?, ?)', [args.url, title, args.mimeType, args.doc]);

indexWorker

Page 160: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName); try { db.execute('INSERT INTO ClientSearch ' + '(url, title, mimeType, content) ' + 'VALUES (?, ?, ?, ?)', [args.url, title, args.mimeType, args.doc]); } finally {

indexWorker

Page 161: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName); try { db.execute('INSERT INTO ClientSearch ' + '(url, title, mimeType, content) ' + 'VALUES (?, ?, ?, ?)', [args.url, title, args.mimeType, args.doc]); } finally { db.close();

indexWorker

Page 162: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName); try { db.execute('INSERT INTO ClientSearch ' + '(url, title, mimeType, content) ' + 'VALUES (?, ?, ?, ?)', [args.url, title, args.mimeType, args.doc]); } finally { db.close(); }

indexWorker

Page 163: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName); try { db.execute('INSERT INTO ClientSearch ' + '(url, title, mimeType, content) ' + 'VALUES (?, ?, ?, ?)', [args.url, title, args.mimeType, args.doc]); } finally { db.close(); }

indexWorker

Page 164: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName); try { db.execute('INSERT INTO ClientSearch ' + '(url, title, mimeType, content) ' + 'VALUES (?, ?, ?, ?)', [args.url, title, args.mimeType, args.doc]); } finally { db.close(); } google.gears.workerPool.sendMessage('indexed:::' + args.url,

indexWorker

Page 165: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName); try { db.execute('INSERT INTO ClientSearch ' + '(url, title, mimeType, content) ' + 'VALUES (?, ?, ?, ?)', [args.url, title, args.mimeType, args.doc]); } finally { db.close(); } google.gears.workerPool.sendMessage('indexed:::' + args.url, message.sender);

indexWorker

Page 166: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName); try { db.execute('INSERT INTO ClientSearch ' + '(url, title, mimeType, content) ' + 'VALUES (?, ?, ?, ?)', [args.url, title, args.mimeType, args.doc]); } finally { db.close(); } google.gears.workerPool.sendMessage('indexed:::' + args.url, message.sender);}

indexWorker

Page 167: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

indexWorker_: function(a, b, message) { var args = message.body; // extract metadata var title = getTitle(args.url, args.mimeType, args.doc); var db = google.gears.factory.create('beta.database'); db.open(args.dbName); try { db.execute('INSERT INTO ClientSearch ' + '(url, title, mimeType, content) ' + 'VALUES (?, ?, ?, ?)', [args.url, title, args.mimeType, args.doc]); } finally { db.close(); } google.gears.workerPool.sendMessage('indexed:::' + args.url, message.sender);}

indexWorker

Page 168: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

search

Page 169: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

search: function(query, callback) {

search

Page 170: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

search: function(query, callback) { var workerScript = function(a, b, message) {

search

Page 171: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

search: function(query, callback) { var workerScript = function(a, b, message) { var params = message.body;

search

Page 172: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

search: function(query, callback) { var workerScript = function(a, b, message) { var params = message.body; var query = params.query;

search

Page 173: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

search: function(query, callback) { var workerScript = function(a, b, message) { var params = message.body; var query = params.query; var dbName = params.dbName;

search

Page 174: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

search: function(query, callback) { var workerScript = function(a, b, message) { var params = message.body; var query = params.query; var dbName = params.dbName;

search

Page 175: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

search: function(query, callback) { var workerScript = function(a, b, message) { var params = message.body; var query = params.query; var dbName = params.dbName; var db = google.gears.factory.create('beta.database');

search

Page 176: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

search: function(query, callback) { var workerScript = function(a, b, message) { var params = message.body; var query = params.query; var dbName = params.dbName; var db = google.gears.factory.create('beta.database'); db.open(dbName);

search

Page 177: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

search: function(query, callback) { var workerScript = function(a, b, message) { var params = message.body; var query = params.query; var dbName = params.dbName; var db = google.gears.factory.create('beta.database'); db.open(dbName);

search

Page 178: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

search: function(query, callback) { var workerScript = function(a, b, message) { var params = message.body; var query = params.query; var dbName = params.dbName; var db = google.gears.factory.create('beta.database'); db.open(dbName);

var rs = db.execute('SELECT * FROM ClientSearch WHERE '

search

Page 179: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

search: function(query, callback) { var workerScript = function(a, b, message) { var params = message.body; var query = params.query; var dbName = params.dbName; var db = google.gears.factory.create('beta.database'); db.open(dbName);

var rs = db.execute('SELECT * FROM ClientSearch WHERE ' + 'content MATCH ?', [query]);

search

Page 180: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

search

Page 181: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

results = [];

search

Page 182: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

results = []; while (rs.isValidRow()) {

search

Page 183: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

results = []; while (rs.isValidRow()) { var entry = {};

search

Page 184: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

results = []; while (rs.isValidRow()) { var entry = {}; entry.title = rs.fieldByName('title');

search

Page 185: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

results = []; while (rs.isValidRow()) { var entry = {}; entry.title = rs.fieldByName('title'); entry.href = rs.fieldByName('url');

search

Page 186: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

results = []; while (rs.isValidRow()) { var entry = {}; entry.title = rs.fieldByName('title'); entry.href = rs.fieldByName('url'); var mimeType = rs.fieldByName('mimeType');

search

Page 187: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

results = []; while (rs.isValidRow()) { var entry = {}; entry.title = rs.fieldByName('title'); entry.href = rs.fieldByName('url'); var mimeType = rs.fieldByName('mimeType'); var content = rs.fieldByName('content');

search

Page 188: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

results = []; while (rs.isValidRow()) { var entry = {}; entry.title = rs.fieldByName('title'); entry.href = rs.fieldByName('url'); var mimeType = rs.fieldByName('mimeType'); var content = rs.fieldByName('content'); entry.snippet = getSnippet(query, mimeType, content);

search

Page 189: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

results = []; while (rs.isValidRow()) { var entry = {}; entry.title = rs.fieldByName('title'); entry.href = rs.fieldByName('url'); var mimeType = rs.fieldByName('mimeType'); var content = rs.fieldByName('content'); entry.snippet = getSnippet(query, mimeType, content);

search

Page 190: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

results = []; while (rs.isValidRow()) { var entry = {}; entry.title = rs.fieldByName('title'); entry.href = rs.fieldByName('url'); var mimeType = rs.fieldByName('mimeType'); var content = rs.fieldByName('content'); entry.snippet = getSnippet(query, mimeType, content); results.push(entry);

search

Page 191: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

results = []; while (rs.isValidRow()) { var entry = {}; entry.title = rs.fieldByName('title'); entry.href = rs.fieldByName('url'); var mimeType = rs.fieldByName('mimeType'); var content = rs.fieldByName('content'); entry.snippet = getSnippet(query, mimeType, content); results.push(entry); rs.next();

search

Page 192: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

results = []; while (rs.isValidRow()) { var entry = {}; entry.title = rs.fieldByName('title'); entry.href = rs.fieldByName('url'); var mimeType = rs.fieldByName('mimeType'); var content = rs.fieldByName('content'); entry.snippet = getSnippet(query, mimeType, content); results.push(entry); rs.next(); }

search

Page 193: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

results = []; while (rs.isValidRow()) { var entry = {}; entry.title = rs.fieldByName('title'); entry.href = rs.fieldByName('url'); var mimeType = rs.fieldByName('mimeType'); var content = rs.fieldByName('content'); entry.snippet = getSnippet(query, mimeType, content); results.push(entry); rs.next(); } google.gears.workerPool.sendMessage(results, message.sender);

search

Page 194: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Status

• PubTools Search

• http://code.google.com/p/gears-pubtools/

• Gears - http://gears.google.com

• Dojo - http://dojotoolkit.org

• Google Code - http://code.google.com

Page 195: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Download Slides

Page 196: Creating a Client-Side Search Engine with Gears and Dojocodinginparadise.org/presentations/Creating Client... · Creating a Client-Side Search Engine with Gears and Dojo Brad Neuberg,

Creating a Client-Side Search Engine with

Gears and DojoBrad Neuberg, Google