




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
關(guān)于搜索(站內(nèi))有一定
量的互聯(lián)
都有站內(nèi)搜索功能,比如verycd、優(yōu)酷、豆瓣、cnblogs、mop、淘寶、大眾點(diǎn)評(píng)網(wǎng)等。msg
like'%.net
%':模糊程度太低,無(wú)法匹配幾個(gè) 不挨著的;造成全表掃描,效率低。為什么不用數(shù)據(jù)庫(kù)全文檢索?數(shù)據(jù)庫(kù)全文檢索很傻瓜化,和普通SQL一樣。數(shù)據(jù)全文檢索靈活性不強(qiáng)。為什么不用
、
的站內(nèi)搜索(
):受制、于人,會(huì)被K;索引不及時(shí)、不全面、不精準(zhǔn);用戶體驗(yàn)感差這里主要講解最有廣泛應(yīng)用價(jià)值的站內(nèi)搜索技術(shù),像開發(fā)那種站外搜索相關(guān)的技術(shù)不講。Lucene.Net簡(jiǎn)介L(zhǎng)ucene.Net是由Java版本的Lucene( )移植過(guò)來(lái)的,所有的類、方法都幾乎和Lucene一模一樣,因此使用時(shí)參考Lucene
即可。Lucene.Net只是一個(gè)全文檢索開發(fā)包,不是一個(gè)成型的搜索引擎,它的功能就是:把數(shù)據(jù)扔給Lucene.Net,查詢數(shù)據(jù)的時(shí)候從Lucene.Net查詢數(shù)據(jù),可以看做是提供了全文檢索功能的一個(gè)數(shù)據(jù)庫(kù)。Lucene.Net不管文本數(shù)據(jù)怎么來(lái)的。用戶可以基于Lucene.Net開發(fā)滿足自己需求的搜索引擎。
Lucene.Net只能對(duì)文本信息進(jìn)行檢索。如果不是文本信息,要轉(zhuǎn)換為文本信息,比如要檢索Excel文件,就要用NPOI把Excel
成字符串,然后把字符串扔給Lucene.Net。Lucene.Net。因?yàn)槭潜4娴臅r(shí)候帖子1帖子2會(huì)把扔給它的文本切詞保存,加快檢索速度。分詞(切詞),所以搜索速度非???!文章分詞存入索引庫(kù)索引本文章的單詞:計(jì)算機(jī)、編程、分詞分詞是 的算法,搜索引擎保存的就是一個(gè)個(gè)的“詞(Word)”。英文分詞很簡(jiǎn)單,按照空格分隔就可以。中文則麻煩,把“,Hi歡迎 大家”
拆成“
Hi
歡迎 大家”?!皌he”,“,”,“和”,“啊”,“的”等對(duì)于搜索來(lái)說(shuō)無(wú)意義的詞一般都屬于不參與分詞的無(wú)意義單詞(noise
word)。Lucene.Net中不同的分詞算法就是不同的類。所有分詞算法類都從yzer類繼承,不同的分詞算法有不同的優(yōu)缺點(diǎn)。(*)內(nèi)置的Standard
yzer是將英文按照空格、標(biāo)點(diǎn)符號(hào)等進(jìn)行分詞,將中文按照單個(gè)字進(jìn)行分詞,一個(gè)漢字算一個(gè)詞。代碼見備注(*)二元分詞算法,每?jī)蓚€(gè)漢字算一個(gè)單詞,“歡迎大家”會(huì)分詞為“歡迎迎你們大大家”,網(wǎng)上找到的一個(gè)二元分詞算法
CJK
yzer。面試的時(shí)候能說(shuō)出不同的分詞算法的差異。基于詞庫(kù)的分詞算法,基于一個(gè)詞庫(kù)進(jìn)行分詞,可以提高分詞的成功率。有庖丁解牛、分詞等。效率低。分詞算法使用具體用法參考《PanguMannual.pdf》打開PanGu4Lucene\WebDemo\Bin,將Dictionaries添加到項(xiàng)目根路徑(改名為
Dict),添加對(duì)PanGu.dll(同下不要有Pangu.xml,那個(gè)默認(rèn)的配置文件的選項(xiàng)對(duì)于分詞結(jié)果有很多無(wú)用信息)、PanGu.Lucene.yzer.dll的把上節(jié)代碼的
yzer用PanGu
yzer代替運(yùn)行報(bào)錯(cuò)?通用技巧:把Dict
下的文件“到輸出 ”設(shè)定為“如果較新則”,每次生成的時(shí)候都會(huì)自動(dòng)把文件拷到bin\Debug
下,非常方便。(只有Web應(yīng)用程序有那個(gè)選項(xiàng),沒有。)不要對(duì)bing\debug下的東西做直接的修改,要改“源文件”。(*)Dictionaries下幾個(gè)txt文件簡(jiǎn)介詞庫(kù)的編輯,使用DictManage.exe,對(duì)單詞編輯的時(shí)候要先查找。工作的項(xiàng)目中要將行業(yè)單詞添加到詞庫(kù)中,比如餐飲搜索、租房搜索、搜索等。(*)項(xiàng)目功能點(diǎn):用WordDictionary類從一個(gè)幾千個(gè)行業(yè)單詞的文本文件中批量導(dǎo)入詞匯到pangu分詞中Lucene.Net
類簡(jiǎn)介先運(yùn)行寫好的索引的代碼,再向下講解各個(gè)類的作用,不用背代碼。(*)Directory表示索引文件(L用來(lái)保存用戶扔過(guò)來(lái)的數(shù)據(jù)的地方)保存的地方,是抽象類,兩個(gè)子類FSDirectory(文件中)、RAMDirectory
(內(nèi)存中)。使用的時(shí)候別和IO里的Directory弄混了。創(chuàng)建FSDirectory的方法,F(xiàn)SDirectory
directory=
FSDirectory.Open(new
DirectoryInfo(indexPath),newNativeFSLockFactory()),path索引的文件夾路徑IndexReader對(duì)索引進(jìn)行 的類,對(duì)IndexWriter進(jìn)行寫的類。IndexReader的靜態(tài)方法bool
IndexExists(Directory
directory)判斷directory是否是一個(gè)索引
。IndexWriter的boolIsLocked(Directorydirectory)
判斷 是否鎖定,在對(duì) 寫之前會(huì)先把 鎖定。兩個(gè)IndexWriter沒法同時(shí)寫一個(gè)索引文件。IndexWriter在進(jìn)行寫操作的時(shí)候會(huì)自動(dòng)加鎖,close的時(shí)候會(huì)自動(dòng)
。IndexWriter.Unlock方法手動(dòng)解鎖(比如還沒來(lái)得及close
IndexWriter
程序就
了,可能造成一直被鎖定)。創(chuàng)建索引1構(gòu)造函數(shù):IndexWriter(Directorydir, yzer
a,
bool
create,MaxFieldLength
mfl)因?yàn)镮ndexWriter把輸入寫入索引的時(shí)候,L是把寫入的文件用指定的分詞器將文章分詞(這樣檢索的時(shí)候才能查的快),然后將詞放入索引文件。doc),向索引中添加文檔(Insertvoid
Add
()。類代表要索引的文檔(文章),最重要的方法Add(Field
field),向文檔中添加字段。是一片文檔,相當(dāng)于一條記錄,F(xiàn)ield相當(dāng)于Field是字段(屬性)。字段。創(chuàng)建索引2Field類的構(gòu)造函數(shù)
Field(string
name,string
value,Field.Store
store,Field.Index
index,Field.TermVector
termVector):
name表示字段名;value表示字段值;
store表示是否
value值,可選值
Field.Store.YES
,
Field.Store.NO不存儲(chǔ), PRESS壓縮;默認(rèn)只保存分詞以后的一堆詞,而不保存分詞之前的內(nèi)容,搜索的時(shí)候無(wú)法根據(jù)分詞后的東西還原原文,因此如果要顯示原文(比如文章正文)則需要設(shè)置
。
index表示如何創(chuàng)建索引,可選值Field.Index.
NOT_
YZED,不創(chuàng)建索引,F(xiàn)ield.Index.
YZED,創(chuàng)建索引;創(chuàng)建索引的字段才可以比較好的檢索。是否碎尸萬(wàn)段!是否需要按照這個(gè)字段進(jìn)行“全文檢索”。
termVector表示如何保存索引詞之間的距離?!皻g迎大家”,索引中是如何保存“”和“大家”之間“隔多少單詞”。方便只檢索在一定距離之內(nèi)的詞。
為什么要把帖子的url做為一個(gè)Field,因?yàn)橐谒阉髡故镜臅r(shí)候先帖子地址取出來(lái)構(gòu)建超 ,所以Field.Store.YES;一般不需要對(duì)url進(jìn)行檢索,所以Field.Index.NOT_
YZED案例:對(duì)1000至1100號(hào)帖子進(jìn)行索引?!爸灰芸炊雍臀臋n,稍作修改即可實(shí)現(xiàn)自己的需求”搜索IndexSearcher是進(jìn)行搜索的類,構(gòu)造函數(shù)傳遞一個(gè)IndexReader。IndexSearcher的void
Search(Query
query,Filter
filter,Collector
results)方法用來(lái)搜索,Query是查詢條件,filter目前傳遞null,results是檢索結(jié)果,TopScoreDocCollector.create(1000,true)方法創(chuàng)建一個(gè)Collector,1000表示最多結(jié)果條數(shù),Collector就是一個(gè)結(jié)果收集器。搜索所采用的分詞算法必須和索引的一致。Query有很多子類,PhraseQuery是一個(gè)子類。
PhraseQuery用來(lái)進(jìn)行多個(gè)
的檢索,調(diào)用Add方法添加
,query.Add(new
Term("字段名",
)),PhraseQuery.
SetSlop(int
slop)用來(lái)設(shè)置 之間的最大距離,默認(rèn)是0,設(shè)置了Slop以后哪怕文檔中兩個(gè)
之間沒有緊挨著也能找到。
query.Add(new
Term("字段名",
query.Add(new
Term("字段名2",
類似于:where
字段名contains如何實(shí)現(xiàn)字段名contains))2))and
字段名2
containsor
字段名2contains22,BooleanQuery:MUST//與運(yùn)算;SHOULD//或運(yùn)算;MUST_NOT//非運(yùn)算搜索2調(diào)用TopScoreDocCollector的GetTotalHits()方法得到搜索結(jié)果條數(shù),調(diào)用Hits的TopDocs
TopDocs(int
start,
int
howMany)得到一個(gè)范圍內(nèi)的結(jié)果(分頁(yè)),TopDocs的scoreDocs字段是結(jié)果ScoreDoc數(shù)組,
ScoreDoc的doc字段為L(zhǎng)ucene.Net為文檔分配的id(為降低內(nèi)存占用,只先返回文檔id),根據(jù)這個(gè)id調(diào)用searcher的Doc方法就能拿到了(放進(jìn)去的是 ,取出來(lái)的也是 );調(diào)用doc.Get("字段名")可以得到文檔指定字段的值,注意只有Store.YES的字段才能得到,因?yàn)镾tore.NO的沒有保存全部?jī)?nèi)容,只保存了分割后的詞。編寫檢索功能,搜索“確定用 分詞,那么用”。練習(xí)分詞,用戶不用空格。如果的Segment類更方便。檢索不出來(lái)的可能的原因:路徑問(wèn)題,分詞是否正確、 分詞如果指定忽略大小寫,則需要 按照小寫進(jìn)行搜索Todo:第一個(gè)版本應(yīng)該保存body和title,搜索結(jié)果形成超 ,不顯示正文。搜索引擎第一版客戶要求://能把零件拼起來(lái)!
檢索 中帖子 在900至1000之間的帖子
打開一個(gè)頁(yè)面點(diǎn)擊一個(gè)【開始索引】按鈕啟動(dòng)索引,索引完成顯示耗時(shí)。(對(duì)于已經(jīng)被刪掉的帖子不進(jìn)行索引。)索引過(guò)程中要記錄日志(Log4Net)(正在索引***條,索引**條的時(shí)候出錯(cuò),索引完成)。一個(gè)按鈕點(diǎn)擊開始索引。
打開一個(gè)頁(yè)面進(jìn)行搜索,不僅用戶輸入“ ”可以搜索出需要的數(shù)據(jù),用戶輸入“ ”也可以搜索出。query.Add(newTerm("body',str))
搜索結(jié)果頁(yè)面顯示標(biāo)題和帖子的一部分(帖子的前100個(gè)字)。點(diǎn)擊標(biāo)題可以進(jìn)入帖子頁(yè)面。結(jié)果頁(yè)面暫時(shí)不用分頁(yè)。
不用美化界面易錯(cuò):如果帖子不存在,WebClient會(huì)報(bào)錯(cuò)嗎?英文搜索時(shí)要轉(zhuǎn)換為小寫的,因?yàn)?分詞會(huì)默認(rèn)把英文轉(zhuǎn)化為小寫保存。解決:高亮顯示s(new在創(chuàng)建索引時(shí)注意:writer.DeleteTerm("id",model.Id.ToString()));高亮顯示,只顯示包含 的部分。參考分詞的文檔。從網(wǎng)上、文檔找來(lái)的代碼不用細(xì)讀每行代碼,先把它拿過(guò)來(lái)運(yùn)行通過(guò)再說(shuō)。生產(chǎn)者消費(fèi)者模式現(xiàn)在創(chuàng)建索引是把數(shù)據(jù)庫(kù)中的所有的數(shù)據(jù)取出來(lái)創(chuàng)建索引,但是如果數(shù)據(jù)量非常大,這樣的話會(huì)非常的慢,那么呢?
可以在
編輯
添加一篇
時(shí),添加這篇怎么辦的索引。其它的不動(dòng)。但是這樣還是有問(wèn)題的,因?yàn)榫庉嫴豢赡芫?個(gè)人,有很多人,那么他們?cè)谔砑樱瑒?chuàng)建索引時(shí)候就有可能出現(xiàn)并發(fā)的問(wèn)題,也就是一個(gè)人在創(chuàng)建索引,剛加鎖,另外一個(gè)人也來(lái)創(chuàng)建索引,就 了。這樣就
了(每個(gè)用戶就是一個(gè)線程)。那么
可以將這個(gè)操作(添加索引)交個(gè)一個(gè)單獨(dú)的線程,任何人要?jiǎng)?chuàng)建索引都交給這個(gè)單獨(dú)的線程來(lái)完成.這樣的話就只有一個(gè)線程來(lái)操作索引庫(kù),創(chuàng)建索引。(這就是生產(chǎn)者消費(fèi)者模式)生產(chǎn)者、消費(fèi)者模式:生產(chǎn)者、消費(fèi)者不用互相等待,用倉(cāng)庫(kù)做緩沖。簡(jiǎn)單原理性代碼見備注隊(duì)列(先入先出):Queue、ConcurrentQueue(*線程安全,多線程中用這個(gè))細(xì)節(jié)問(wèn)題如何處理文章的刪除。異常處理:某次出錯(cuò)不應(yīng)該導(dǎo)致while(true)結(jié)束,也就是“拔網(wǎng)線系統(tǒng)不能死”。多條件查詢?cè)跇?biāo)題和正文中查找PhraseQuery
queryMsg=
new
PhraseQuery();foreach
(string
word
inCommonHelper.SplitWords(txtKW.Text)){queryMsg.Add(new
Term("msg",
word));}queryMsg.SetSlop(100);PhraseQuery
queryTitle
=
new
PhraseQuery();foreach
(string
word
inCommonHelper.SplitWords(txtKW.Text)){queryTitle.Add(new
Term("title",word));}queryTitle.SetSlop(100);BooleanQuery
query
=
new
BooleanQuery();query.Add(queryMsg,
BooleanClause.Occur.SHOULD);query.Add(queryTitle,
BooleanClause.Occur.SHOULD);解決:路徑可配置化連接配置信息放到Web.Config的ConnectionStrings段中,而普通的自定義配置則可以寫到AppSettings段中,哪些需要配置:索引的路徑,被索引的url,索引的時(shí)間間隔。string
indexPath
=ConfigurationManager.AppSettings["IndexPath"],使用ConfigurationManager添加
System.Configuration修改Web.config會(huì)造成IIS重啟,這樣會(huì)立即加載新的任務(wù)使用request.MapPath或者Server.MapPath把相對(duì)于 根路徑的路徑轉(zhuǎn)換為絕對(duì)路徑(不是轉(zhuǎn)換為ht /a.aspx,轉(zhuǎn)換為/a.aspx)。在定時(shí)任務(wù)等不在Http線程中取
HttpContext.Current得到的是null,因此在定時(shí)任務(wù)中不能用
HttpContext.Current.Server.MapPath方法來(lái)轉(zhuǎn)換,要用
HostingEnvironment.MapPath,因此可以在其他地方也用HostingEnvironment.MapPath解決:地址無(wú)法發(fā)給好友用戶沒法把搜索結(jié)果頁(yè)面發(fā)給好友,要用Get提交,這樣才能得到搜索頁(yè)面地址。如果采用Get方式的話,要?jiǎng)h掉form的runat=server,變成HTML的form、method改為get,所有控件都要用HTML控件。因?yàn)橹挥腥サ魊unat=server,才會(huì)完全去掉ViewState注意input不能只指定id,而應(yīng)該指定name,否則不會(huì)出現(xiàn)在querystring中。Id是供
Javascript用的,name是供querystring/Request用的。對(duì)于type=submit的input來(lái)說(shuō),只有被點(diǎn)擊的input的name、value才會(huì)被提交給服務(wù)器。method改為get1、要?jiǎng)h掉form的runat=server。(唯一去掉viewstate的方法)2、所有除了DataBound控件(比如GridView、Repeater等)都要用HTML控件。
Repeater、ObjectDataSource之類控件不需要runat=server的form也可以,但是VS總是提示,去源代碼視圖拖放、讓他生成再手動(dòng)刪掉。3、控件注意要給表單name屬性賦值。4、在
Page_Load代碼中進(jìn)行響應(yīng)5、IsPostBack不再有用,只能通過(guò)判斷參數(shù)是否為空來(lái)判斷是否是提交的頁(yè)面。點(diǎn)搜索按鈕以后如何顯示搜索關(guān)鍵字:在aspx.cs中定義一個(gè)GetKeyWord方法,<input
type="text"
id="kw1"
name="kw"
value='<%=Request["kw"]
%>'/>L高級(jí)(*)
IndexSearcher是Searcher類的一個(gè)子類,Searcher類還有其他子類,MultiSearcher(在多個(gè)索引上搜索),ParallelMultiSearcher(在多個(gè)索引上并行搜索,速度更快),做更大的搜索引擎會(huì)用到。(*)可以對(duì)檢索過(guò)程過(guò)濾,可以實(shí)現(xiàn)評(píng)分大于0.8的才顯示搜索結(jié)果,在搜索出的數(shù)據(jù)太多的情況下調(diào)整。搜索排序也是默認(rèn)根據(jù)評(píng)分。(*)除了PhraseQuery,還有BooleanQuery(檢索包含“網(wǎng)絡(luò)”或者“ ”;搜索標(biāo)題或者正文中包含“搞笑 ”的資源)、FuzzyQuery(糾錯(cuò)匹配,用戶輸入“Chjna”時(shí)候也能匹配“China”,需要提供額外的糾錯(cuò)數(shù)據(jù))、WildcardQuery
(通配符檢索,包含“搞笑*”)等統(tǒng)計(jì)詞匯搜索次數(shù)兩張表,一張明細(xì)、一張匯總,定時(shí)把明細(xì)表的數(shù)據(jù)
匯總表,查詢的時(shí)候到匯總表查詢。由于明細(xì)表的主鍵不需要連續(xù),而且用自動(dòng)增長(zhǎng)字段會(huì)排隊(duì)、加鎖從而降低效率,因此主鍵用Guid。(為啥文章用自動(dòng)增長(zhǎng)?url短、好看。)insert
into
T_KeyWordsRank(Id,KeyWords,SearchTimes)select
newid(),
KeyWords,Count(*)
from
T_SearchDetailswhere
DateDiff(day,SearchDateTime,GetDate())<=7group
by
KeyWordsQuartz.NetQuartz.Net是一個(gè)定時(shí)任務(wù)框架,可以實(shí)現(xiàn)異常靈活的定時(shí)任務(wù),開發(fā)
只要編寫少量的代碼就可以實(shí)現(xiàn)“每隔1小時(shí)執(zhí)行”、“每天22點(diǎn)執(zhí)行”、“每月18日的下午執(zhí)行8次”等各種定時(shí)任務(wù)。Quartz.Net中的概念:計(jì)劃者(IScheduler)、工作(IJob)、觸發(fā)器(Trigger)。給計(jì)劃者一個(gè)工作,Trigger(什么條件下做這件事)觸發(fā)的條件下執(zhí)行這個(gè)工作將要定時(shí)執(zhí)行的任務(wù)的代碼寫到實(shí)現(xiàn)IJob接口的Execute方法中即可,時(shí)間到來(lái)的時(shí)候Execute方被調(diào)用搜索記錄熱門搜索都是基于已有的用戶
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 定制化葫蘆絲生產(chǎn)行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
- 提升遠(yuǎn)程辦公效率俯臥位工作法的策略與方法
- 教育信息化中的數(shù)據(jù)治理模式創(chuàng)新
- 基于數(shù)據(jù)安全的金融服務(wù)數(shù)字平臺(tái)構(gòu)建策略
- 技術(shù)支持下的幼兒認(rèn)知能力培養(yǎng)研究
- 在線診療平臺(tái)的用戶體驗(yàn)優(yōu)化研究
- 從數(shù)字技術(shù)看未來(lái)職場(chǎng)人才的培養(yǎng)方向
- 企業(yè)數(shù)字化轉(zhuǎn)型與客戶體驗(yàn)的持續(xù)改進(jìn)策略
- 2025年單親學(xué)生社交技能培訓(xùn)計(jì)劃
- 探索數(shù)字化轉(zhuǎn)型的營(yíng)銷思維創(chuàng)新
- 服務(wù)質(zhì)量評(píng)價(jià)體系構(gòu)建
- 麻醉過(guò)程中的意外與并發(fā)癥處理規(guī)范與流程樣本
- 貓傳染性腹膜炎課件
- 幼兒足球訓(xùn)練課件
- 動(dòng)物的營(yíng)養(yǎng)需求與攝取
- 分子氣動(dòng)力學(xué)及氣體流動(dòng)的直接模擬
- 大學(xué)食堂原料物資豬肉采購(gòu) 投標(biāo)方案
- 綠色環(huán)保 低碳生活主題班會(huì)
- 學(xué)生考試成績(jī)?cè)u(píng)價(jià)分析表模板
- 人教版(2019)必修第一冊(cè)Unit 3 Sports and fitness Discovering useful structures 課件
- 長(zhǎng)螺旋引孔技術(shù)交底
評(píng)論
0/150
提交評(píng)論