1.类型问题
直接创建索引时,会默认将类型设置为_doc。
也可以使用下方put来进行类型的指定,然后再将这条文档删除,嘿嘿。不就实现了一个空的且制定类型的索引
PUT /索引名/类型名(之后可以没有 直接用_doc代替)/文档id { 请求体 }
2.文档中字段类型
es默认会根据插入的数据来自动指定类型大多数为:
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
实际上是创建了两种类型的。text和keyword。需要使用keyword时,就需要使用name.keyword。
当然也可以在创建索引的时候直接定义类型。
PUT /lala
{
"mappings":{
"properties":{
"name":{
"type":"text"
},
"age":{
"type":"long"
},
"birthday":{
"type":"date"
}
}
}
}
text类型
1:支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;
2:test类型的最大支持的字符长度无限制,适合大字段存储;
使用场景:
存储全文搜索数据, 例如: 邮箱内容、地址、代码块、博客文章内容等。
默认结合standard analyzer(标准解析器)对文本进行分词、倒排索引。
默认结合标准分析器进行词命中、词频相关度打分。
keyword
1:不进行分词,直接索引,支持模糊、支持精确匹配,支持聚合、排序操作。
2:keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
使用场景:
存储邮箱号码、url、name、title,手机号码、主机名、状态码、邮政编码、标签、年龄、性别等数据。
用于筛选数据(例如: select * from x where status='open')、排序、聚合(统计)。
直接将完整的文本保存到倒排索引中。
也就是并不会将"我是中国人"这个字段分割为"我","是","我是","中国"....
而是直接将"我是中国人"这个字段进行保存到倒排索引中。
常见问题
当使用API进行查询时,使用text和keyword两种类型分别进行同一种查询时,得到的结果也不相同。
//name中的数据为 "我是中国人时"
//这里的wildcardQuery支持通配符
BoolQueryBuilder builder = QueryBuilders.boolQuery();
builder.must(QueryBuilders.wildcardQuery("name.keyword","*我是*"));
builder.must(QueryBuilders.wildcardQuery("name","*我是*"));
例如上方的模糊查找。具体方法见目录中的API使用。
builder.must(QueryBuilders.wildcardQuery("name","*我是*"));
当只是用name时,进行模糊查询时,当进行以上查询,并不会查询到数据。
当修改为:
builder.must(QueryBuilders.wildcardQuery("name","*是*"));
便能查询到数据。因为直接使用name便会默认使用text类型。
将数据ik_max_word进行最大分词。因此只能获得一个字儿的多个数据。所以只有一个字儿时进行查询能获得数据。
而使用.keyword时:
builder.must(QueryBuilders.wildcardQuery("name.keyword","*我是*"));
不论通配符中放置多少个数据时,都会查询到对应的数据。
因为keword并不会将数据进行分词。
始终都是使用完整的数据和我们查询的部分字段进行匹配。
别的方法中也同时存在text和keyword的问题,记得注意哦!
3.端口问题
我们会发现在ElasticSearch启动时,会占用两个端口9200和9300。 他们具体的作用如下:
9200 是ES节点与外部通讯使用的端口。它是http协议的RESTful接口
通过9200端口,elasticsearch本身是可以通过http协议来访问的,自带restful风格的访问方式,其它语言以及直接测试访问都是通过9200端口
9300是ES节点之间通讯使用的端口。它是tcp通讯端口,集群间和TCPclient都走的它。
通过9300端口,9300端口开放给java api来访问调用,只开放给java通过特定的client来访问
总结,目前在java项目中集成elasticsearch使用9300,其它情况都用9200
4.分页问题
解决from size只能返回10000条数据。
PUT _all/_settings
{"max_result_window":"1000000000"}
当然如果是大数据量的话,使用以上的方法会使得es索引库检索速度变慢。
设置的最大值只能是1000000000。否则会报错。