lucene 的php tag 詞庫搜尋法的變通

2021-04-13 03:07:04 字數 2505 閱讀 7551

首先 你需要維護乙個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具有隔離性。下面我們舉幾個例子來說明上述...