首先 你需要維護乙個tag庫,這個庫不能太大,我測試的是 1w條資料,如果是乙個垂直**應該差不多能夠用了.
tag 表應該有如下字段
tag_id 標籤id
tag_word 標籤內容
tag_lent 標籤長度
tag_content_id 所有含有該標籤的id集合
使用的檔案生成
取得tag標籤,作為詞庫檔案生成 暫時叫 ciku.tmp 吧
然後取得 tag_content_id 連上文章表,取得id跟文章標題
然後儲存成檔案 暫時叫 cache.temp
這2個檔案什麼時候都可以建立.並不影響使用者使用,因為這些全是準備工作,並沒有真正的給使用者使用,也就是說,使用者去搜尋的時候
並不是時時的 資料,而且搜尋我們儲存的快取檔案.
那好我們現在開始 使用者的前台使用
現在使用者輸入了 乙個 詞 比較叫 我愛搜尋,但是我不會
好我們開始匹配,
我們載入詞庫
然後 進行迴圈比對 我們現在取得 現在得到了乙個 次,是我們庫里的tag 就是搜尋
而搜尋有1w條資料.
我們現在載入 tag 搜尋 的 檔案 首先,檔案裡儲存的資料是有格式的,我的格式是 檔案id||欄目id||標題
現在我們開始分析 結果集合裡的資料
然後根據固定的url格式生成url,給使用者展現.ok搜尋完成了.這也就是個 搜尋的 索引
現在說另外乙個問題
tag_lent 這個我們並沒用用到,是幹什麼用的呢? 這個減少我們的詞庫用的,比如使用者錄入的 資料 是4個長度的,那麼我們從資料庫中
就把長度長過4的tag過濾掉,好處就是減少詞的量,加快搜尋速度.
現在另外乙個問題就分頁
我們把所有的資料都放帶乙個檔案裡了,我們都載入近來,然後我們根據分頁來分析陣列顯示就行了.
現在再說乙個問題,就是復合搜尋了
那麼好,我們現在從使用者輸入的資料裡匹配出來了我們詞庫中的2個tag,那麼我們就載入2個檔案,這個時候有個問題,我要跟大家說下,如果是2個檔案的話,大概資料就不好整理了
我們需要把2個檔案裡的資料整理到乙個陣列裡,然後分析就可以了,或者我們採用php的陣列原理,我們不使用 file()這個函式,而是直接include近來檔案,但是我檔案的格式
要有所約定了比如 $search 這樣的形式,那麼我們就可以順利的分頁了.關於其他的方式還是大家自己努力想想吧
或者是多個陣列,有乙個命名規則
利用 array_diff 取得差集
利用array_intersect 交集
利用 array_unshift 在 差集 頭插入 交集
執行不定引數的php函式
$a = array('a','b','c');
$b = array('b','c','d');
eval("/$t=array_diff(/$a,/$b);");
print_r($t);
$a0 = array('a','b','c');
$a1 = array('b','c','d');
for($i=0;$i<2;$i++)";}
eval("/$t=array_diff(".implode(',',$str).");");
print_r($t);
關於這個搜尋解決方案的缺點
由於,是預先生成的,所有會有延時
缺點2,由於是都要載入到記憶體裡操作,有可能會出現陣列過大,超過php最大記憶體使用的情況,請大家酌情使用.
缺點3,沒辦法增量建立索引
現在給大家乙個我的測試用例
[code]
<?php
include_once("fileio.class.php");
class exectime
function gettime()
function showtime()
}$f = "|!|";
for($i=0;$i<10000;$i++)
0123我愛你";
}$filename = "cache.temp";
fileio::writefile($filename,implode("/n",$search));
$str = "我來了我來了我來了我來勒令";
$exec = new exectime();
$c=count($search);
for($i=0;$i<$c;$i++)
$content = file($filename);
$c=count($content);
for($i=0;$i<$c;$i++)
------------";
}$exec->showtime();
?>
[/code]
使用的時間是 page exec time is :1.80978298187 s
我感覺 如果順利的話,大概能在 2s內解決問題,這樣基本是在使用者的耐心裡完成的
python jieba分詞庫的使用
測試環境 py3 win10 import jieba str test 有很多人擔心,美國一聲令下,會禁止所有的開源軟體被中國使用,這樣的擔憂是不必要的。返回迭代器 c1 jieba.cut str test c2 jieba.cut str test,cut all true c3 jieba....
有關Lucene的問題 6 Lucene的事務性
所謂事務性,本多指資料庫的屬性,包括acid四個基本要素 原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 我們這裡主要討論隔離性,lucene的indexreader和indexwriter具有隔離性。下面我們舉幾個例子來說明上述...
有關Lucene的問題 6 Lucene的事務性
所謂事務性,本多指資料庫的屬性,包括acid四個基本要素 原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 我們這裡主要討論隔離性,lucene的indexreader和indexwriter具有隔離性。下面我們舉幾個例子來說明上述...