時(shí)間輕松學(xué)會.NET Core操作ElasticSearch7的方法
在互聯(lián)網(wǎng)上,隨處可見的搜索框。背后所用的技術(shù)大多數(shù)就是全文檢索。
在全文檢索領(lǐng)域,常見的庫/組件有:Lucene、Solr、Sphinx、ElasticSearch等。
簡單對比幾種全文引擎的區(qū)別
- Lucene是一個基于Java開發(fā)的全文檢索基礎(chǔ)包,使用起來繁雜,且默認(rèn)不支持分布式檢索
- Solr是基于Lucene開發(fā)的一個搜索工具。抽象度更高,使用更簡單,且提供一個控制面板。
- ElasticSearch也是基于Lucene開發(fā)的。同樣是高度抽象,并提供了一個非常強(qiáng)大的DSL檢索功能,可以很方便的檢索出數(shù)據(jù)。
- Solr和ES的區(qū)別主要在于:ES有強(qiáng)大的實(shí)時(shí)檢索能力而不怎么掉速,Solr創(chuàng)建索引的同時(shí),檢索速度會下降。如果不考慮實(shí)時(shí)檢索,Solr的速度更快。Solr社區(qū)更成熟。ES使用更方便更現(xiàn)代化。
- Sphinx是俄羅斯人開發(fā)的一個全文檢索引擎,使用C++開發(fā)。性能比Java開發(fā)的es和solr高,但是在社區(qū)繁榮度上,比ES和solr差很多。比如中文分詞器,sphinx的coreseek插件已經(jīng)停更了。sphinx有個非常好的地方就是可以作為MySQL插件使用。
環(huán)境搭建
隨著容器化的發(fā)展,我們大部分環(huán)境都切換到Docker上了。本篇博文的環(huán)境通過Docker搭建。
ES在Docker中搭建
我使用的是ES7.4.2
docker run --name es -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms128m -Xmx128m" -v d:/elasticsearch/es7.4.2/data:/usr/share/elasticsearch/data -v d:/elasticsearch/es7.4.2/plugins:/usr/share/elasticsearch/plugins elasticsearch:7.4.2
我這里把Docker中的es數(shù)據(jù)目錄和插件目錄映射到本機(jī),方便操作。實(shí)際線上部署也應(yīng)該映射數(shù)據(jù)目錄到宿主機(jī),防止數(shù)據(jù)丟失。
搭建Kibana可視化環(huán)境
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.31.115:9200 -p 5601:5601 -e "I18N_LOCALE=zh-CN" -d kibana:7.4.2
運(yùn)行成功后,在Docker控制面板上,就可以看到兩個正在運(yùn)行的容器了。

在本機(jī)瀏覽器訪問 http://localhost:5601/ 即可打開Kibana儀表盤。

ElasticSearch基本概念
用數(shù)據(jù)庫的概念來對比ES的概念
| 數(shù)據(jù)庫 | ElasticSearch |
|---|---|
| database 庫 | index 索引 |
| table 表 | type 類型 7.x已經(jīng)廢除 |
| row 行 | document 文檔 |
| column 列 | field 字段 |
| chema 表結(jié)構(gòu) | mapping 映射 |
| SQL | DSL |
| select | GET |
| update | PUT |
| delete | delete |
上手ElasticSearch的DSL
ES有兩種方式操作:1.url方式,2.http請求中的body提交json dsl
創(chuàng)建一個索引
PUT /qingcheng
刪除一個索引
DELETE /qingcheng
創(chuàng)建mapping
PUT /qingcheng
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"createtime": {
"type": "date"
}
}
}
}
響應(yīng)
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "qingcheng"
}
在ES7中已經(jīng)不支持映射mapping的時(shí)候,指定_doc名稱了。ES會給一個默認(rèn)的_doc名稱
新增字段
PUT /qingcheng/_mapping
{
"properties":{
"sex":{
"type":"integer"
}
}
}
在ES中只能新增字段,無法修改已有字段。如果需要需改已有字段,只能重新創(chuàng)建索引,然后使用reindex遷移數(shù)據(jù)到新的索引。
查看索引
GET /qingcheng/_mapping
結(jié)果
{
"qingcheng" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "integer"
},
"createtime" : {
"type" : "date"
},
"name" : {
"type" : "text"
},
"sex" : {
"type" : "integer"
}
}
}
}
}
插入以及數(shù)據(jù)
多次put同一個id到es,那就是更新了
POST /qingcheng/_doc/1
{
"name":"青城",
"age":30,
"createtime":"2021-03-21",
"sex":1
}
使用Post請求,在_doc的type中插入id為1的一條數(shù)據(jù)。id可以自定義格式,可以為數(shù)字以及自定義字符串
查看數(shù)據(jù)
GET /qingcheng/_doc/1
數(shù)據(jù)檢索的格式為 GET /索引名稱/_search + json格式的body
基本搜索
GET /qingcheng/_search
{
"query": {
"query_string": {
"default_field": "name",
"query": "青城"
}
}
}
范圍搜索
GET /qingcheng/_search
{
"query": {
"range": {
"age": {
"gte": 10,
"lte": 50
}
}
}
}
分頁搜索
GET /qingcheng/_search
{
"query": {
"match": {
"name": "青"
}
},
"from": 0, //從多少條開始
"size": 20 //取多少條
}
排序
GET /qingcheng/_search
{
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
復(fù)雜搜索
在ES搜索中,一般會存在多個條件,類似于sql的and or等操作。在ES中使用bool操作來連接多個條件,must 必須滿足,should:滿足最好,不滿足也沒關(guān)系(如果滿足,es的搜索評分會更高,結(jié)果更靠前)
GET /qingcheng/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "青"
}
},
{
"range": {
"age": {
"gte": 10,
"lte": 50
}
}
}
],
"should": [
{
"range": {
"age": {
"gte": 10,
"lte": 50
}
}
}
]
}
}
}
聚合
在ES中,聚合使用eggs來操作??煽焖偾蟪鲎畲蟆⑵骄?、等值。
GET /qingcheng/_search
{
"aggs": {
"平均值": {
"avg": {
"field": "age"
}
}
}
}
配置中文分詞器
ES默認(rèn)的分詞器是中文分詞是按單個漢字分割。所以使用起來搜索結(jié)果不太準(zhǔn)確。在ES的分詞插件中,中文分詞用的比較多的是IK分詞器
github地址:https://github.com/medcl/elasticsearch-analysis-ik
下載好ES對應(yīng)版本的插件,解壓出來,放到ES的插件目錄。重啟ES,即可啟用插件。

我們對比一下使用ES默認(rèn)分詞器和IK分詞器的結(jié)果
默認(rèn)分詞器

使用IK分詞器
IK分詞器支持兩種分詞模式 1. ik_smart 2.ik_max_word
ik_smart模式

ik_max_word

兩種分詞模式的區(qū)別在于分詞粒度的粗細(xì)問題。而standard分詞直接按單個字符分割。
使用.NET Core的NEST客戶端
ES的.NET客戶端分為兩個,一個是ElasticSearch.NET一個是NEST,NEST是高級的客戶端庫,提供更符合.NET程序員的操作api。ElasticSearch.NET更適合喜歡寫DSL的程序員。一般我們都使用NEST。
創(chuàng)建索引
[ElasticsearchType(RelationName = "estest")]
class ESTest
{
[Number(NumberType.Integer, Name = "id")]
public int Id { get; set; }
[Text(Name = "name")]
public string Name { get; set; }
[Number(NumberType.Integer, Name = "age")]
public int Age { get; set; }
[Text(Name = "info", Analyzer = "ik_smart")]
public string Info { get; set; }
[Date(Name = "createtime", Format = "yyyy-MM-dd||yyyy-MM-dd HH:mm:ss")]
public DateTime CreateTime { get; set; }
}
var node = new Uri("http://localhost:9200");
var settings = new ConnectionSettings(node);
var client = new ElasticClient(settings);
//創(chuàng)建索引
var resp = client.Indices.Create("test", opt =>
{
return opt.Map<ESTest>(m => m.AutoMap());
});
Console.WriteLine("創(chuàng)建索引結(jié)果:" + resp.Acknowledged);
Console.WriteLine(resp.DebugInformation);
插入數(shù)據(jù)
var model = new ESTest()
{
Name = "青城1",
Age = 20,
Info = "順其自然,不代表我們可以不努力,而是努力之后有勇氣接受成敗。",
Id = 2,
CreateTime = DateTime.Now
};
var indexResp = client.Index(model, i => i.Index("test"));
if (indexResp.IsValid)
{
}
檢索數(shù)據(jù)
var res = client.Search<ESTest>(a => a.Index("test")
.Query(a =>
a.Match(m =>
m.Field(f => f.Info).Query("順其自然"))));
foreach (var item in res.Documents)
{
Console.WriteLine(item.Name + " " + item.Info);
}
檢索數(shù)據(jù)的寫法基本上和DSL語法結(jié)構(gòu)一致。學(xué)會DSL,用C#也可以寫出正確的查詢語句。
學(xué)會以上的基本操作,就可以算是對ES有一個基本的了解了。更多深入的知識點(diǎn)可以去ES官方文檔學(xué)習(xí)。
NEST庫地址:https://github.com/elastic/elasticsearch-net
官方文檔:https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html
到此這篇關(guān)于時(shí)間輕松學(xué)會.NET Core操作ElasticSearch7的方法的文章就介紹到這了,更多相關(guān).NET Core操作ElasticSearch 7內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何對ASP.NET網(wǎng)站實(shí)現(xiàn)靜態(tài)化
對于訪問量比較大的網(wǎng)站,網(wǎng)頁靜態(tài)化是一個比較可靠的解決方案。靜態(tài)化將顯著降低服務(wù)器的壓力,提升服務(wù)器處理能力。下面將介紹兩種不同的實(shí)現(xiàn)方法,并進(jìn)行對比。2015-09-09
手把手教你在.NET中創(chuàng)建Web服務(wù)實(shí)現(xiàn)方法
這篇文章主要介紹了.NET中創(chuàng)建Web服務(wù)實(shí)現(xiàn)方法,有需要的朋友可以參考一下2013-12-12
輕量級ORM框架Dapper應(yīng)用之實(shí)現(xiàn)Join操作
本文詳細(xì)講解了使用Dapper實(shí)現(xiàn)Join操作,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
Windows Server 2012 R2 或 2016無法安裝.Net 3.5.1
這篇文章主要為大家詳細(xì)介紹了Windows Server 2012 R2 或 2016 無法安裝 .Net 3.5.1,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
asp.net中實(shí)體類對象賦值到表單的實(shí)現(xiàn)代碼
昨天在網(wǎng)上看到了一個利用反射表單賦值到實(shí)體類對象的一個方法,自己就在加了個方法,從實(shí)體對象到表單,覺的很不錯非常省事,所以把他寫成了一個類,供以后使用2010-11-11

