欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

時(shí)間輕松學(xué)會(huì).NET Core操作ElasticSearch7的方法

 更新時(shí)間:2021年04月17日 10:46:36   作者:青城同學(xué)  
這篇文章主要介紹了時(shí)間輕松學(xué)會(huì).NET Core操作ElasticSearch7,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在互聯(lián)網(wǎng)上,隨處可見(jiàn)的搜索框。背后所用的技術(shù)大多數(shù)就是全文檢索。
在全文檢索領(lǐng)域,常見(jiàn)的庫(kù)/組件有:Lucene、Solr、Sphinx、ElasticSearch等。

簡(jiǎn)單對(duì)比幾種全文引擎的區(qū)別

  • Lucene是一個(gè)基于Java開(kāi)發(fā)的全文檢索基礎(chǔ)包,使用起來(lái)繁雜,且默認(rèn)不支持分布式檢索
  • Solr是基于Lucene開(kāi)發(fā)的一個(gè)搜索工具。抽象度更高,使用更簡(jiǎn)單,且提供一個(gè)控制面板。
  • ElasticSearch也是基于Lucene開(kāi)發(fā)的。同樣是高度抽象,并提供了一個(gè)非常強(qiáng)大的DSL檢索功能,可以很方便的檢索出數(shù)據(jù)。
  • Solr和ES的區(qū)別主要在于:ES有強(qiáng)大的實(shí)時(shí)檢索能力而不怎么掉速,Solr創(chuàng)建索引的同時(shí),檢索速度會(huì)下降。如果不考慮實(shí)時(shí)檢索,Solr的速度更快。Solr社區(qū)更成熟。ES使用更方便更現(xiàn)代化。
  • Sphinx是俄羅斯人開(kāi)發(fā)的一個(gè)全文檢索引擎,使用C++開(kāi)發(fā)。性能比Java開(kāi)發(fā)的es和solr高,但是在社區(qū)繁榮度上,比ES和solr差很多。比如中文分詞器,sphinx的coreseek插件已經(jīng)停更了。sphinx有個(gè)非常好的地方就是可以作為MySQL插件使用。

環(huán)境搭建

隨著容器化的發(fā)展,我們大部分環(huán)境都切換到Docker上了。本篇博文的環(huán)境通過(guò)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控制面板上,就可以看到兩個(gè)正在運(yùn)行的容器了。

在本機(jī)瀏覽器訪問(wèn) http://localhost:5601/ 即可打開(kāi)Kibana儀表盤(pán)。

ElasticSearch基本概念

用數(shù)據(jù)庫(kù)的概念來(lái)對(duì)比ES的概念

數(shù)據(jù)庫(kù) ElasticSearch
database 庫(kù) index 索引
table 表 type 類(lèi)型 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請(qǐng)求中的body提交json dsl

創(chuàng)建一個(gè)索引

PUT /qingcheng

刪除一個(gè)索引

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名稱(chēng)了。ES會(huì)給一個(gè)默認(rèn)的_doc名稱(chēng)

新增字段

PUT /qingcheng/_mapping
{
  "properties":{
    "sex":{
      "type":"integer"
    }
  }
}
 

在ES中只能新增字段,無(wú)法修改已有字段。如果需要需改已有字段,只能重新創(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同一個(gè)id到es,那就是更新了

POST /qingcheng/_doc/1
{
  "name":"青城",
  "age":30,
  "createtime":"2021-03-21",
  "sex":1
}
 

使用Post請(qǐng)求,在_doc的type中插入id為1的一條數(shù)據(jù)。id可以自定義格式,可以為數(shù)字以及自定義字符串

查看數(shù)據(jù)

GET /qingcheng/_doc/1

數(shù)據(jù)檢索的格式為 GET /索引名稱(chēng)/_search + json格式的body

基本搜索

GET /qingcheng/_search
{
  "query": {
    "query_string": {
      "default_field": "name",
      "query": "青城"
    }
  }
}

范圍搜索

GET /qingcheng/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 50
      }
    }
  }
}

分頁(yè)搜索

GET /qingcheng/_search
{
  "query": {
    "match": {
      "name": "青"
    }
  }, 
  "from": 0,  //從多少條開(kāi)始
  "size": 20  //取多少條
}

排序

GET /qingcheng/_search
{
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

復(fù)雜搜索

在ES搜索中,一般會(huì)存在多個(gè)條件,類(lèi)似于sql的and or等操作。在ES中使用bool操作來(lái)連接多個(gè)條件,must 必須滿(mǎn)足,should:滿(mǎn)足最好,不滿(mǎn)足也沒(méi)關(guān)系(如果滿(mǎn)足,es的搜索評(píng)分會(huì)更高,結(jié)果更靠前)

GET /qingcheng/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "青"
          }
        },
        {
          "range": {
            "age": {
              "gte": 10,
              "lte": 50
            }
          }
        }
      ],
      "should": [
        {
          "range": {
            "age": {
              "gte": 10,
              "lte": 50
            }
          }
        }
      ]
    }
  }
}

聚合

在ES中,聚合使用eggs來(lái)操作??煽焖偾蟪鲎畲蟆⑵骄?、等值。

GET /qingcheng/_search
{
  "aggs": {
    "平均值": {
      "avg": {
        "field": "age"
      }
    }
  }
}

配置中文分詞器

ES默認(rèn)的分詞器是中文分詞是按單個(gè)漢字分割。所以使用起來(lái)搜索結(jié)果不太準(zhǔn)確。在ES的分詞插件中,中文分詞用的比較多的是IK分詞器

github地址:https://github.com/medcl/elasticsearch-analysis-ik

下載好ES對(duì)應(yīng)版本的插件,解壓出來(lái),放到ES的插件目錄。重啟ES,即可啟用插件。

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

默認(rèn)分詞器

使用IK分詞器

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

ik_smart模式

ik_max_word

兩種分詞模式的區(qū)別在于分詞粒度的粗細(xì)問(wèn)題。而standard分詞直接按單個(gè)字符分割。

使用.NET Core的NEST客戶(hù)端

ES的.NET客戶(hù)端分為兩個(gè),一個(gè)是ElasticSearch.NET一個(gè)是NEST,NEST是高級(jí)的客戶(hù)端庫(kù),提供更符合.NET程序員的操作api。ElasticSearch.NET更適合喜歡寫(xiě)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ù)的寫(xiě)法基本上和DSL語(yǔ)法結(jié)構(gòu)一致。學(xué)會(huì)DSL,用C#也可以寫(xiě)出正確的查詢(xún)語(yǔ)句。

學(xué)會(huì)以上的基本操作,就可以算是對(duì)ES有一個(gè)基本的了解了。更多深入的知識(shí)點(diǎn)可以去ES官方文檔學(xué)習(xí)。

NEST庫(kù)地址:https://github.com/elastic/elasticsearch-net

官方文檔:https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html

到此這篇關(guān)于時(shí)間輕松學(xué)會(huì).NET Core操作ElasticSearch7的方法的文章就介紹到這了,更多相關(guān).NET Core操作ElasticSearch 7內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論