1. ES其实也就像一个数据库,它有自己的一套存储结构。像建立数据库表一样,我们需要为每个字段添加一些属性,比如字段类型,该字段是否要分词,该字段需要哪种分词器去解析它等。以下是完整的字段属性:

1. "status": {  
2.          "type":  "string", //字符串类型  
3.          "index": "analyzed"//分词,不分词是:not_analyzed ,设置成no,字段将不会被索引  
4.          "analyzer":"ik"//指定分词器  
5.          "boost":1.23//字段级别的分数加权  
6.           "doc_values":false//对not_analyzed字段,默认都是开启,分词字段不能使用,对排序和聚合能提升较大性能,节约内存  
7.            "fielddata":{"format":"disabled"}//针对分词字段,参与排序或聚合时能提高性能,不分词字段统一建议使用doc_value  
8.            "fields":{"raw":{"type":"string","index":"not_analyzed"}} //可以对一个字段提供多种索引模式,同一个字段的值,一个分词,一个不分词  
9.            "ignore_above":100 //超过100个字符的文本,将会被忽略,不被索引  
10.            "include_in_all":ture//设置是否此字段包含在_all字段中,默认是true,除非index设置成no选项  
11.            "index_options":"docs"//4个可选参数docs(索引文档号) ,freqs(文档号+词频),positions(文档号+词频+位置,通常用来距离查询),offsets(文档号+词频+位置+偏移量,通常被使用在高亮字段)分词字段默认是position,其他的默认是docs  
12.            "norms":{"enable":true,"loading":"lazy"}//分词字段默认配置,不分词字段:默认{"enable":false},存储长度因子和索引时boost,建议对需要参与评分字段使用 ,会额外增加内存消耗量  
13.             "null_value":"NULL"//设置一些缺失字段的初始化值,只有string可以使用,分词字段的null值也会被分词  
14.             "position_increament_gap":0//影响距离查询或近似查询,可以设置在多值字段的数据上火分词字段上,查询时可指定slop间隔,默认值是100  
15.              "store":false//是否单独设置此字段的是否存储而从_source字段中分离,默认是false,只能搜索,不能获取值  
16.               "search_analyzer":"ik"//设置搜索时的分词器,默认跟ananlyzer是一致的,比如index时用standard+ngram,搜索时用standard用来完成自动提示功能  
17.                "similarity":"BM25"//默认是TF/IDF算法,指定一个字段评分策略,仅仅对字符串型和分词类型有效  
18.                "term_vector":"no"//默认不存储向量信息,支持参数yes(term存储),with_positions(term+位置),with_offsets(term+偏移量),with_positions_offsets(term+位置+偏移量) 对快速高亮fast vector highlighter能提升性能,但开启又会加大索引体积,不适合大数据量用  
19.        }

2. ES的数据类型

(1)string: 默认会被分词

(2)数字类型主要如下几种: 

long:64位存储 

integer:32位存储 

short:16位存储 

byte:8位存储 

double:64位双精度存储 

float:32位单精度存储 

(3)复合类型 

数组类型:没有明显的字段类型设置,任何一个字段的值,都可以被添加0个到多个,要求,他们的类型必须一致: 

对象类型:存储类似json具有层级的数据 

嵌套类型:支持数组类型的对象Aarray[Object],可层层嵌套 

(4)地理类型 

geo-point类型: 支持经纬度存储和距离范围检索 

geo-shape类型:支持任意图形范围的检索,例如矩形和平面多边形 

(5)专用类型 

ipv4类型:用来存储IP地址,es内部会转换成long存储 

completion类型:使用fst有限状态机来提供suggest前缀查询功能 

token_count类型:提供token级别的计数功能 

mapper-murmur3类型:安装sudo bin/plugin install mapper-size插件,可支持_size统计_source数据的大小 

附件类型:需要 https://github.com/elastic/elasticsearch-mapper-attachments 开源es插件支持,可存储office,html等类型 

(6)多值字段: (一般是一个分词,一个不分词)

一个字段的值,可以通过多种分词器存储,使用fields参数,支持大多数es数据类型 

es不分词检索 es 不分词_es

3. 建立连接

es不分词检索 es 不分词_es_02

4. 建立index和type,index相当于一个数据库, type相当于表。一般一个index,ES默认会分成5片,每个分片2个副本。这两个参数需要根据实际情况进行调节

es不分词检索 es 不分词_es开发_03

5. 一般会给index设置一个别名alias,这样方便以后对mapping的修改。原则上mapping一旦建立好之后是不能修改的。但是通过别名的方式可以新建一个index和mapping,让它映射到那个别名,再干掉老的index,这样就可以做到平行的迁移。

6. 了解数据结构和类型之后就可以开始建立mapping了,就是数据的存储结构。指定数据类型,指定分词等

7. 添加数据,加入ES的数据必须格式化为json格式

8. 更新某条数据的某个字段的值

9. 更某条数据的某几个字段

10.更新整条数据

11.删除某条数据

12.获取某条数据

13. 查询(ES的查询有很多种,非常的丰富)

a. 精确查询

QueryBuilders.termQuery("status", 1)

b. 多字段执行相同的查询

fieldNames:字段集合

QueryBuilders.multiMatchQuery(value, fieldNames).slop(10)

c. 范围查询:gt:大于, gte:大于等于, lt:小于, lte:小于等于

QueryBuilders.rangeQuery("startTime").lte(date.getTime()/1000)

QueryBuilders.rangeQuery("endTime").gte(date.getTime()/1000)

QueryBuilders.rangeQuery("duration").from(0).to(600)

d.and 和 or 查询

query.must(QueryBuilders.rangeQuery("startTime").lte(date.getTime()/1000));

query.should(query1);

query.should(query2);

query.mustNot(QueryBuilders.termQuery("movieType", 1));

14. 排序,分页。ES分页有两种方式,一种是通过size,from 浅分页,一种是srcoll深度分页。

浅分页有局限性,一旦数据量太大,翻页越到后面执行越慢,页数小的话是没有影响的, 这个与ES的分页方式有关。srcoll深度分页,可以做到快速翻页,脱离数据量的限制,但是这种方式不适应传统的翻页需求。因为它总是以上次分页的位置为锚点,而且这个锚点有过期时间,局限性也很大。