elasticsearch开发

来源:互联网 发布:手游运营数据分析 编辑:程序博客网 时间:2024/06/05 05:57
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数据类型 


3. 建立连接


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


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深度分页,可以做到快速翻页,脱离数据量的限制,但是这种方式不适应传统的翻页需求。因为它总是以上次分页的位置为锚点,而且这个锚点有过期时间,局限性也很大。










0 0