#全文檢索原理
##數據查詢
1. 結構化數據,有固定格式或有限長度
賬號、密碼、分數等
一般通過關系型數據庫存儲和查詢,建立索引
2. 非結構化數據,不定長或無固定格式數據
郵件內容、word文檔 可以通過順序查找,例如windows搜索和linux grep
##全文檢索原理
###把非結構化數據轉變成結構化數據,分2大部分:
* 索引:把非結構化數據分解,創建詞的索引 反向索引?倒排表?
* 搜索:只需在創建的索引里直接獲取而不需掃描原文 關鍵在于排序


###詞法分析和語法分析
**分詞(Tokenizer):**
a)單詞
b)去標點
c)停詞(詞元Token)
d)小寫、詞根(詞Term)
語法分析:
'+ - or ””site link
**關于中文分詞:**
a)二分法
b)詞典法
c)最短匹配、最長匹配
d)復合分詞


##爬蟲協議 rebots.txt
User-agent: * Disallow: /reg/ Allow: /*.html* Disallow: /*php?*
#解決方案之SQL全文索引
##全文檢索解決方案
1. 關系型DB全文索引:MySQL FULLTEXT
不需要額外開發,功能受限
2. 腳本語言SQL結合全文檢索:Sphinx Xunsearch
與SQL和腳本語言結合緊密,性能好
3. 完全定制全文檢索lucene
功能強大,開發量大
4. 網絡爬蟲與搜索:Nutch與Solr
直接使用,適合簡單快速獲取信息
##MySQL全文索引示例
語法:
索引:fulltext key(field)
查詢:where MATCH(field) AGAINST(‘word’)
配置:
MyISAM:
ft_min_word_len、ft_max_word_len
ft_stopword_file
ft_query_expansion_limit:使用with query expansion進行全文索引的最大匹配數
InnoDB:innodb_ft_min_token_size
##三種查詢模式:
1. NATURAL LANGUAGE MODE 默認自然語言模式,多于50%忽略、相關性排序
2. BOOLEAN MODE 不排序、無限制,可以有語法
3. WITH QUERY EXPANSION 自然語言模式的二次查詢
##MySQL全文索引限制
1. 只有MyISAM表支持(5.6以后innodb也支持),只支持char、varchar、text列
2. 對大多數的多字節字符集適用,索引列必須使用相同的字符集和校驗碼(collation)。
3. 表意性語言,如漢語、日語沒有詞分界符,全文檢索不支持。
4. 自然語言檢索必須對檢索列單獨建全文索引,布爾檢索可以在非索引的列上進行,但 會慢一些。
5. against后的參數必須是常量字符串。
6. 索引沒有記錄關鍵詞在字符串中的位置,排序算法太單一。
7. 索引不在內存中檢索速度會很慢。索引有碎片時也會很慢,所以需要更頻繁的 optimize table操作。
8. 全文索引對于insert、update、delete都很慢。
##MySQL全文索引中文分詞解決辦法
1. mysql插件
編譯模塊或動態加載插件 mysqlcft
2. 簡單解決
a)增加一個字段建立全文索引 b)程序里分詞后存入這個冗余字段(有php庫和模塊) c)要全文檢索時就查詢這個冗余字段
#Sphinx與MySQL全文檢索
##大數據量全文檢索
1. 大數據量采用獨立搜索引擎
2. 對關系型DB建立索引,只存儲id
3. 查詢時先從搜索引擎查詢出id
4. 再根據id到關系型DB查詢其他數據
##Sphinx & Coreseek
1. 和sql、腳本語言php等結合緊密
2. 索引搜索性能高
3. Coreseek基于Sphinx加入中文分詞
##Coreseek安裝與使用
安裝:http://www.coreseek.cn 特別說明:
1. xml運行需要expat expat-devel
2. src/Makefile少了參數 -liconv
其他按官網簡單說明,安裝mmseg中文分詞,安裝coreseek程序
testpack下有索引、搜索示例:
mmseg分詞 index索引 search查詢 searchd守護進程 有php和py的api封裝
php調用示例:
/usr/local/coreseek/bin/searchd -c etc/quanzhan.conf php api/test.php 全棧工程師
##訊搜
安裝:http://www.xunsearch.com 索引設計基于Xapian
中文分詞scws
php SDK

#Lucene Api調用
##Lucene資料
1. http://lucene.apache.org/ 只是工具Api
2. 開源早、資源占用少、性能高、java跨平臺、Api簡單易用、翻譯成多種 語言版本
3. 基于Lucene的眾多應用封裝 Solr:和lucene同步,搜索完全實現,提供多種格式接口,web管理界面 Nutch:高效爬蟲,和Solr完全兼容
Compass:數據庫映射、事務管理
Elastic Search:分布式RESTful風格接口
##Lucene開發
API開發,索引的原理
問題:
1. 多次索引會重復嗎?
2. 如何更新和刪除?
3. 多字段如何搜索?
4. 排序、與、或等條件搜索? 5. 如何自動觸發索引?
6. 跨語言如何調用?
#Solr與Nutch集成
##什么是Solr與Nutch
1. 不需要開發代碼,不需要了解Lucene及接口 2. Solr完成專業搜索封裝及http接口
3. Nutch爬蟲定制抓取數據只需要簡單配置
版本:
a)Solr 4.10,與Lucene同步 b)nutch分1.X系列(更穩定高效,更新頻繁)和2.X系列(抽象數據層實現多種方式)
集成問題:都是apache項目,采用Lucene版本不同但問題不大,修改字段配置即可 集成方法:Nutch爬蟲入庫直接指定Solr地址
##Nutch使用
1. 創建種子庫 urls/seed.txt 和數據目錄 data
2. 配置規則
a)設置爬蟲名 conf/nutch-site.xml 加入http.agent.name屬性
b)設置匹配規則 conf/regex-urlfilter.txt 修改+^http://www.ucai.cn/
3. 開始抓取數據,運行參數
bin/crawl urls data null 2
4. 查詢數據情況、分析、導出
bin/nutch readdb data/crawldb/ -stats

##Solr使用
1. 配置 scheme.xml
a)fieldType 定義了如何處理field b)field 索引文件中能提交處理的字段
2. 配置 solrconfig.xml lib配置、依賴jar包和插件、組件配置、索引配置、查詢配置使用:
啟動jetty容器:java -jar start.jar 多core配置
##集成方法
Nutch爬蟲直接入庫Solr(已經抓取的可以用命令工具bin/nutch index入庫)
bin/crawl urls data http://localhost:8983/solr/ucai 1
配置:
1、復制Nutch字段配置到Solr:{nutch_dir}/conf/scheme-solr4.xml到 {solr_dir}/solr/ucai/conf/scheme.xml 2、加入版本字段到最后:<field name="_version_" type="long" indexed="true" stored="true" multiValued="false"/>
- SWOOLE及php網絡編程
- LNMP架構與Socket,http協議
- 如何高效學習
- 開發工具箱
- 編寫高效的js
- js閉包編寫全功能的購物車
- JSON和JSONP
- 多級分類的開發與應用
- 設計安全的登錄注冊流程
- 前端性能優化
- 前端架構優化
- 使用第三方云服務加速產品開發
- 移動互聯網之API開發
- php分層
- 全文檢索的實踐與部署
- webIM的原理及前后端實現
- 如何配置高效的數據庫以及MySQL的代碼及插件開發
- NoSql.隊列,任務隊列
- 構建本機緩存,構建分布式緩存池
- 數據庫分庫分表的設計
- Nginx原理及模塊開發初步
- 無限擴充的數據庫架構
- php構建分庫分表分布式數據庫連接池
- 靜態文件上傳、分布式存儲與分發
- MySQL Cluster,Proxy分析與實踐
- 架構解密