sqlite に仮想テーブルがあり、それに対してクエリを実行してキーワードの一致を探していますが、カウントは常に 1 になります。構造は次のとおりです。
var insertStatement2 = "INSERT INTO pagesfts3 (url,content) VALUES (?, ?)";
var createStatement2 = "CREATE VIRTUAL TABLE pagesfts3 USING fts3 (url VARCHAR,content TEXT)";
var selectStatement2 = "SELECT COUNT(*),url FROM pagesfts3 WHERE content MATCH ? GROUP BY url";
try {
var db = openDatabase("search", "1.0", "search engine", 200000);
db.transaction(function(tx) {
//for example use drop table on each load
tx.executeSql(dropStatement, [], null, onError);
tx.executeSql(dropStatement2, [], null, onError);
tx.executeSql(createStatement, [], null, onError);
tx.executeSql(createStatement2, [], null, onError);
});
db.transaction(function(tx) {
});
}
catch (error) {
$('body').prepend('<div class="alert alert-danger">This script requires a SQlite compatible browser<br/> try Safari 4, iOS OS3, Chrome 5, or Opera 10.5</div>');
}
function onError(tx, error) {
alert(error.message);
}
基本的に、Webページのデータとそれに対応するURLを保存します。ページのクエリを実行するときに、これを実行します
var query = $('#query').val().toLowerCase();
var searchResults = $('#queryResult');
searchResults.html('');
db.transaction(function(tx) {
//run static select statment 2 on the virtual table
tx.executeSql(selectStatement2, [query], function(tx, result) {
var dataset = result.rows;
if (dataset.length > 0) {
for (var i = 0, item = null; i < dataset.length; i++) {
item = dataset.item(i);
console.debug(item);
var url = item['url'];
var count = item['COUNT(*)'];
var str = '<p><a href="' + url + '">' + url + '</a> has the word <b>' + query + '</b></p>';
searchResults.append(str);
}
}else{
searchResults.append('no results');
}
});
});
しかし、キーワードが複数回存在することはわかっていますが、列カウント(*)は常に1です。私は仮想テーブルにあまり慣れていないので、何かが足りないかもしれません。