MongoDB 實現全文檢索的最佳解決方案是什麼?
據我所知目前已經有一些與其他搜索引擎結合的方案,但都不是很成熟。
之前在做中文檢索,因為數據在mongo里,本來解決方案是把數據同步到es里,然後做檢索,偶然發現mongo3.4 版本支持中文檢索,所以直接使用mongo的檢索,效率很高。可以通過db.create_index([("metaDataList.title",pymongo.TEXT)]) 建text索引,metaDataList.title是欄位名稱,也可以同時對好幾個欄位做索引,用db.create_indexes(),索引建好後
db.find({ "$text": { "$search": "張三的" }},{ "score": { "$meta": "textScore" } })是通過你輸入的關鍵詞,返回的文檔的得分textScore,
你也可以用db.aggregate([{ "$match": { "$text": { "$search": "張三" } } }, { "$sort": { "score": { "$meta": "textScore" } } },
{ "$project":
{ "metaDataList.skuid": 1, "metaDataList.product_info": 1,
"metaDataList.title": 1, "metaDataList.url": 1,
"_id": 1 } },
{"$limit": 50}
])
查詢
表示的查詢"張三"返回的結果按照文檔得分排序,選擇要顯示的欄位,以及限制的行數
keyword就是你的關鍵詞
$project 後面欄位為1,表示查詢返回的結果要顯示的欄位
$limit 表示限制的行數
ps 突然發現mongo企業版才支持中文分詞
具體語法可以參照官方中文文檔:http://docs.mongoing.com/manual-zh/
用 river 同步到 elasticsearch,沒有比這個更好的了。
實時檢索效果不好.
我試過有1400萬條的字元串數據, 存放 {"name":"somevalue"}之類的數據, 在name上建了索引, 使用正則查詢 db.mycoll.find({"name":/baidu/})這樣的查詢要20秒以上.
這個延時應該是不可忍受吧?建議還是考慮用lucene或者sphinx,mongodb不太適合做全文檢索
然而6、7年過去了,平民版任然未支持中文全文檢索...
實時解析oplog,同步到lucene
mongoDB更適合做數據倉庫,從倉庫里檢索大量數據是不合時宜的,建議配合sphinx。
可喜的是,MongoDB 2.6引入$text全文搜索了,在&"MongoDB 2.6發布——Kelly Stirman訪談"中說道:
「在過去一年裡,我們與社區緊密合作,測試文本搜索,並將其能力集成到其它特性中。告別測試版,MongoDB 2.6的文本搜索現在可用於生產環境,而且還提供了新特性,包括:
與MongoDB的查詢引擎集成,所以文本搜索可以與一般查詢操作符結合使用,通過限制、跳過、排序和過濾結果的能力提供更豐富的查詢。例如,用戶可以在一個博文集合中搜索特定的短語,但使用一個額外的條件將搜索限制在過去七天的博文中;支持多語言文檔;文本搜索語句可以用在「聚合框架(Aggregation Framework)」中,通過對匹配的文本進行計數和分組提供更深入地分析。」
4月初在北京的mongodb大會上,Kevin Matulef 講了在正在開發的mongodb後續版本中會提供對全文檢索的支持,但不會做得Lucene那麼專業,僅僅是對於簡單的文字查詢需求。
Mongodb 2.6已經支持 全文索引!不過仍然有個問題是自帶全文檢索不支持中文!!!!!!!!!!!!!!!!!!
如果是 Ruby 的話,可以用 sunspot 這個 Gem 配合 solr 實現。http://github.com/sunspot/sunspot
MongoDB單獨做全文檢索不合適。有個創業公司使用MongoDB+Sphinx做全文檢索
Mongodb 2.6已經支持 全文索引!
還是使用lucene比較靠譜。國內mongodb的應用還是停留在作為數據倉庫,存儲log之類的。
在MongoDb 2.4中引用了全新的全文索引新特性。但目前仍處理beta階段,風險自負。具體請參考這裡:Text Indexes
mongodb現在新版已經支持全文索引了。
我們實用的是coreseek(基於sphinx)的python配置數據源Mongo 2.4會增加全文索引的功能。
所以說Mongo真的屬於什麼都支持,但是什麼都不是支持最好的一種解決方式:-)mongo就沒有好的全文檢索方式,比較好的方式用lucene+solr
試了下,3.4.6 支持中文index
推薦閱讀: