應用場景
需要在大量資料中完成快速檢索
批量建立索引後使用可以滿足需求,但是也無需求對資料的實時性要求較高,會頻繁更新索引,這時候索引操作就較慢。那麼就有了下面的優化方案。
由於mongodb本身不自帶中文全文檢索功能,那麼如何來利用高效的英文全文檢索呢?
考慮:英文全文檢索實現就是按照空格劃分內容,例:hello world,英語句子中都會按照空格劃分單詞。現在有沒有一點思路,所以考慮只需要把內容分詞按照空格分開存放乙個字段,這樣是不是和英文有點像。
業務場景:(和我們平常遇到的全文檢索有點不一樣)
每一條資料有乙個熱詞統計,首先就需要實現分詞及詞頻統計,然後這些結果儲存資料庫,最後我們的檢索需要通過這些熱詞來進行檢索。
這就是不同之處,大家一般需要的是檢索整篇文章中包含搜尋關鍵字的記錄。
實現分三步: 建立索引、寫資料(寫入分詞好的資料)、查詢
上**:
using datasync;
using datasync.model;
using microsoft.visualstudio.testtools.unittesting;
using mongodb.driver;
using system.collections.generic;
using system.diagnostics;
using system.linq;
namespace datasynctests
[testmethod
]public
void
writedata()
); list tests =
newlist
<
commentpotest
>()
;while
(cursor.
movenext()
));}
mongohelper.
getcollection
<
commentpotest
>()
.insertmany
(tests);}
}[testmethod
]public
void
search()
}}
但是mongodb是為了寫入大資料而生,建立非常多的索引之後新增,更新操作依舊會影響效率。當然可以考慮新建乙個集合專門用於存放需要查詢,排序的字段。但這個資料同步更新又是乙個問題,所以我暫時放棄,又新增了新的解決方案
解決了以上的問題,直接上**
using datasync;
using datasync.model;
using microsoft.visualstudio.testtools.unittesting;
using mongodb.driver;
using nredisearch;
using stackexchange.redis;
using system.collections.generic;
using system.linq;
using
static nredisearch.client;
namespace datasynctests
[testmethod
]public
void
createindex()
catch
//測試資料源
//測試資料字段說明:
//segments:已分詞陣列,string
//membernickname:暱稱,string
//diggcount:點讚量,int
var data = mongohelper.
getcollection
<
commentpotest
>()
.find
(x =
>
true).
tolist()
.take
(10000);
//構建資料結構
//四種資料型別:文字,數字,標籤,地理資料
//第一種 文字
//用途:全文檢索(漢字將輸入內容分詞按空格連線)
//儲存:在存入的時候需要將文字分詞(結巴分詞),將分詞結果按空格連線儲存
//第二種 數字
//用途:區間查詢,精確查詢,排序(可排序欄位在定義資料結構時新增方法:addsortablenumericfield)
//儲存:直接儲存
//第三種 標籤
//用途:用於查詢分類,例如資料中有型別,狀態,分類等意義的字段且需要經常通過該欄位作為條件查詢,即可使用該資料型別
//儲存:按照逗號或者其他自定義符號分割儲存,定義資料結構時指定分割符,預設為半形逗號
//第四種 地理資料
schema schema =
newschema()
.addtextfield
("text").
addtextfield
("membernickname").
addsortablenumericfield
("diggcount").
addtagfield
("segments");
configuredindexoptions configuredindexoptions =
newconfiguredindexoptions
(indexoptions.default)
; client.
createindex
(schema, configuredindexoptions)
; dictionary<
string
, redisvalue> keyvalues;
foreach
(var item in data),,
,}; client.
adddocument
(item.id.
tostring()
, keyvalues);}
}[testmethod
]public
void
search()
").limit(0, 10);
//查詢排序
var query =
newquery
(querystring)
.setsortby
("diggcount"
,false).
limit(0
,10);
var result = client.
search
(query);}
}}
MySQL中文全文檢索解決方案
在php mysql 構架的 中,大資料量的全文檢索一般都會用到 mysql 的fulltext 全文索引,通過 select.match.against 語句來進行查詢。迄今為止,mysql 對中文全文索引無法正確支援,mysql 是不會識別中文詞語的。參照 mysql 識別英文單詞機制,要建立中...
MYSQL 百萬條記錄全文檢索中文解決方案
mysql最適合用於小型運用的開發。遇到了單錶上百萬記錄。用select from where like 去查詢,結果效率低到難以忍受。五十萬條記錄竟然用了三十秒才出結果!這對於任何運用都是沒辦法忍受的。對應大資料量查詢的時候,很多資料庫是支援全文檢索的。首先我的表預設是 innodb,這種表的型別...
關於mongodb的全文檢索
1.在fulltextserach 需要用到切詞,切詞和語言有關,所以需要設定語言,目前不支援中文,只支援如下的 2.在使用前,在mongodb需要用命令列設定text索引 設定單個字段索引 db.catalog product.ensureindex 設定多個二級字段全文索引 同時設定權重 db....