2013年8月29日 星期四

全文檢索(Full-text)的停用字詞(stopwords)

在資料庫中有一個電影資料表Video , 為了做搜尋功能所以使用了全文索引, 但是要找這一部"Now You See Me",影片時 卻找不到該影片, 即使只用"Now"或是"You"這些常出現的字眼也找不到資料!

上網查了一些資料發現, 原來有所謂的"停用字詞"
http://technet.microsoft.com/zh-tw/library/ms142551.aspx

如果要使用"停用字詞" , 就要在資料庫內下SQL語法 :
ALTER FULLTEXT INDEX ON Video SET STOPLIST = OFF

2013年8月17日 星期六

在社群網路中找Fiona是否是Adm的朋友的朋友的~~的朋友

// 字典
function Dict(elements) {
    // 允許選擇性的初始對映表
    this.elements = elements || {};
}
Dict.prototype.has = function (key) {
    // 只有自有特性 (own property)
    return {}.hasOwnProperty.call(this.elements, key);
};
Dict.prototype.get = function (key) {
    // 只有自有特性
    return this.has(key) ? this.elements[key] : undefined;
};
Dict.prototype.set = function (key, val) {
    return this.elements[key] = val;
};
Dict.prototype.remove = function (key) {
    delete this.elements[key];
};
// 任意挑選集合元素
Dict.prototype.pick = function () {
    for (var key in this.elements) { // 這裡的elementsMember實體
        if (this.has(key)) {
            return key;
        }
    }
    throw new Error("空的字典");
};
// 為了避免字典被汙染, 所以建立一個工作集, 把字典放在這個類別中, 用來追蹤目前集合中的元素項目
function WorkSet() {
    this.entries = new Dict();
    this.count = 0;
}
WorkSet.prototype.isEmpty = function () {
    return this.count === 0;
};
WorkSet.prototype.add = function (key, val) {
    if (this.entries.has(key)) {
        return;
    }
    this.entries.set(key, val);
    this.count++;
};
WorkSet.prototype.get = function (key) {
    return this.entries.get(key);
};
WorkSet.prototype.remove = function (key) {
    if (!this.entries.has(key)) {
        return;
    }
    this.entries.remove(key);
    this.count--;
};
WorkSet.prototype.pick = function () {
    return this.entries.pick();
};
// 社交網路成員
function Member(name) {
    this.name = name;
    this.friends = [];
}
// 關聯朋友 方法1:用一個while迴圈來實作, 每次從集合中挑選出一個任意的元素, 並從work-set中移除
Member.prototype.inNetworkSet = function (other) {
    var visited = {};
    var workset = new WorkSet();
    workset.add(this.name, this); // 呼叫者的名子當 key, 用來先查找該呼叫者的朋友
    while (!workset.isEmpty()) {
        var name = workset.pick(); // 取出 key
        var member = workset.get(name);
        workset.remove(name);
        if (name in visited) { // 不要重新訪問成員
            continue;
        }
        visited[name] = member;
        if (member === other) { // 找到成員
            return true;
        }
        member.friends.forEach(function (friend) {
            workset.add(friend.name, friend);
        });
    }
    return false;
};
// 關聯朋友 方法2:將工作項目存到陣列中而非一個集合(set), 以完全相同的順序來巡訪社交網路路線
Member.prototype.inNetworkList = function (other) {
    var visited = {};
    var worklist = [this];
    while (worklist.length > 0) {
        var member = worklist.pop();
        if (member.name in visited) {// 不要重新訪問成員
            continue;
        }
        visited[member.name] = member;
        if (member === other) {
            return true;
        }
        member.friends.forEach(function (friend) {
            worklist.push(friend); // 加入工作清單
        });
    }
    return false;
};
var a = new Member("Adm"),
    b = new Member("Bob"),
    c = new Member("Chris"),
    d = new Member("David"),
    e = new Member("Eason"),
    f = new Member("Fiona");
a.friends.push(b);
b.friends.push(c);
c.friends.push(e);
d.friends.push(b);
e.friends.push(d, f); // a f 關聯

console.log(a.inNetworkList(f));

建立公司,雇用員工:從子類別的建構式呼叫超類別的建構式 (借用建構式)

// 公司
function Company(name, address) {
    this.name = name;
    this.address = address;
    this.stafts = [];
}
// 雇用
Company.prototype.hire = function (staft) {
    this.stafts.push(staft);
};
// 開除
Company.prototype.fire = function (staft) {
    var i = this.stafts.indexOf(staft);
    if (i >= 0) {
        this.stafts.splice(i, 1);
    }
};
// 員工
function Staff(company, name) {
    this.company = company; // 每個員工都會儲存對其公司的參考
    this.name = name;
    company.hire(this); // 把自己加到公司的雇用表(staft hire)

}
// 離職
Staff.prototype.quit = function () {
    this.company.fire(this);
};
// 經理 (將特定類型的員工實作為 Staff 的子類別)
function Manager(company, name) {
    // 為了確保 Manager 實體會正確地被初始化為 Staff, 這個建構式必須明確地呼叫 Staft 建構式
    // 把新產生的物件bind Staff 的接收者
    // 呼叫 Staff 建構首先能先確保 Staff 所建立的所有實體特性都會被加入到新物件中
    Staff.call(this, company, name);
    // 接著 Manager 就能定義他自己的實體特性, 例如 title
    this.title = "Manager";
}
// 為了使 Manager 成為 Staff 的子類別, 他的原形(prototype)必須繼承自 Staff.prototype
Manager.prototype = Object.create(Staff.prototype);
// 一旦建立了 Manager 的原形物件, 就可以為他加上所有實體都會共用的特性
Manager.prototype.duty = "lead stafts";
// 建立公司
var hc = new Company("TheHappyCompany", "taiwan");
// 新增員工
var ian = new Manager(hc, "Ian"); // Manager {company: Company, name: "Ian", title: "Manager", duty: "lead stafts", quit: function} 
var jay = new Staff(hc, "Jay"); // Staff {company: Company, name: "Jay", quit: function}
var ben = new Staff(hc, "Ben");
hc.fire(jay); // 將指定員工開除