關於全文檢索的解決方案實現

2021-10-23 08:41:18 字數 3453 閱讀 3211

應用場景

需要在大量資料中完成快速檢索

批量建立索引後使用可以滿足需求,但是也無需求對資料的實時性要求較高,會頻繁更新索引,這時候索引操作就較慢。那麼就有了下面的優化方案。

由於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....