23

golang之ElasticSearch

 3 years ago
source link: https://studygolang.com/articles/31186
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

ES是面向文档型数据库

1. 9200和9300端口的区别

9200端口:ES节点之间通讯使用,是TCP协议端口号,ES集群之间通讯端口号。

9300端口:ES节点和外部通讯使用,暴露ES RESTful 接口端口号

2.ElasticSearch倒排索引原理

有倒排索引就一定有倒排索引。先解释一下正排索引。

举个例子,比如有5个文档,每个文档里面记录了一句话,如果我想查某句话里面的某个关键词,我就需要在每个文档里都要对这个关键词进行查询。显然,效率比较低。

那么倒排索引与之的区别又是什么呢:它会把每个关键词直接作为索引,然后把文档id的列表列出。

- 倒排索引: 

以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档。一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置。由于该字或词对应的文档在动态变化,所以倒排表的建立和维护都比较复杂。但是由于一次查询能够得到关键字所对应的所有文档,所以效率高于正排表。在全文检索中,检索的快速响应是一个最为关键的性能,而索引建立由于在后台进行,尽管效率相对低一些,但不会影响整个引擎的效率。

3.  查询

- 简易版的查询

1. 根据多个id 进行查询

GET  /index/type/_mget
{
“ids”:["1",2]
}

2. 查询年龄为21 的

GET  /index/type/search?q=age:21

3. 查询年龄在30到60岁之间并且年龄降序,从0条数据到第1条数据

GET  /intex/type/search?q=age[30 TO 60]&sort=age:desc&from=0&size=1

4. 查询年龄在30到60岁之间并且年龄降序,从0条数据到第1条数据,展示name 和age 字段

GET  /intex/type/search?q=age[30 TO 60]&sort=age:desc&from=0&size=1 &_source=name,age

- DSL查询(结构化查询)

DSL查询 更为直观也更为简便,使用较多。

DSL查询是POST过去一个json,由于POST请求是json 格式的,所以有更多的灵活性,也有很多形式。

- term 与 match 的区别

term查询会采用精确匹配,不会对字段进行分词查询。match 会根据该字段的分词器进行分词查询。模糊匹配

GET  /index/type/_search
{
"query":{
    "match":{
          "car":"奥迪A"
}
}
}
GET  /index/type/_search
{
“from” :0,
“size”:2,
“_source”:["name","age"]
"query":{   
"term":{ 
        "car":"奥迪A"
}
 
}
}

4.分词器

ElasticSearch 中默认的标准分词器对中文不是很友好,会将中文的词拆分成一个一个的汉子,,因此引入中文分词器-es-ik插件

es-ik分词插件

es-ik的版本一定要和es安装的版本对应

1.安装

第一步:下载es的IK插件命名为ik插件

第二步:上传到/usr/local/elasticsearch-6.4.3/plugins

第三步:重启es

注意: 查询时把analyzer从stardard改成ik smart

2.自定义扩展字典(分词器文件)

在/usr/local/elasticsearch-6.4.3/plugins/ik/config 目录下

vi custom/new_word.dic

王者荣耀

马云

保存的时候要把es停掉,不然保存报错

vi IKAnalyzer.cfg.xml

在key="ext_dict" 里吧/custom/newword.dic加进去

5. 文档映射

文档映射就是给文档中的字段指定字段类型、分词器

es中索引index相当于数据库,类型Type相当于数据表,映射Mapping相当于数据表的表结构。es中的映射用来定义一个文档,可以定义所包含的字段以及字段的类型、分词器以及属性等等。

GET /index/type/_mapping

1.动态映射

在es中不需要事先定义映射,文档写入es时,会根据文档字段自动识别类型,这种机制称之为动态映射。

2.静态映射

在es中也可以事先定义好映射,包含文档的各个字段及其类型,这种方式称之为静态映射

6.es类型支持

一.基本类型

符串:string 包括text 和keyword

keyword类型不能分词,keyword类型可以分词查询

数值型: long 、integer、short、byte 、float

日期型: date

布尔类型:boolean

二进制型:binary

数组类型: Array datatype 

二 、复杂类型

地理位置类型(Geo datatypes)

1.地理坐标类型(Geo-point datatypes):用于经纬度坐标

2.地理形状类型(Geo-Shape datatypes):用于类似于多边形的复杂形状

特定类型

1.Pv4类型:ip用于ipv4地址

2.Completion类型:提供自动补全建议

等等,,,

有疑问加站长微信联系

iiUfA3j.png!mobile

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK