塞尔塔的英文翻译英语怎么说-个性情侣英文网名
2023年4月7日发(作者:六级查分)
Elasticsearch搜索引擎⼀些参数含义和⽤法
⽬录
Elasticsearch
Elasticsearch是⼀个开源的分布式、RESTful风格的搜索和数据分析引擎,它的底层是开源库ApacheLucene。它使⽤Java编
写,内部采⽤Lucene做索引与搜索
经过⼀段时间对ES的研究与实践应⽤,使⽤虽然没什么问题了,但对⼀些参数还是不求甚解,再了解学习下。
实体类
@Document(indexName=\"elastic_search_user\",type=\"user\",shards=5,replicas=1)
publicclassUserimplementsSerializable{
@Id
privateStringid;
}
序列化
⽤elasticsearch存储Document类型的实体类时,实体类需要实现Serializable接⼝,并为实体类⽣成序列号,否则查询结果很
可能会得到unKNowninstance
其实⽆论我们是把数据存⼊到关系型数据库还是⾮关系型数据库,我们都需要对存⼊数据进⾏序列化,因为在异地传输,鸡鸣桑树颠的上一句 存储时
序列化可以保证我们的传输以及之后我们能原样的读取数据,那么由于在关系型数据库,⽐如MySQL中,我们其实存储的数实体
类的字段属性,多为String,int等类型,这些类型数据库都有对应的数据结构⽀持,⽽且这些类型在声明是以及实现了
Serializable接⼝的,所以我们才不⽤⼿动实现该接⼝,但是像ES这种⾮关系型数据库(NoSQL),其实存⼊的是整个实体类对
象,NoSQL并没有⽀持他们的数据结构,所以为了保证我们能够正确读取数据,我们就需要实体类实现Serializable接⼝,并为
实体类⽣成序列号。
其实java中的Serializable接⼝并没有定义任何东西,是⼀个空的接⼝,具体的序列化操作还是需要交给JVM来做。
再⼀个类序列化之后的序列化id的作⽤,是在反序列化的时候,如果系统检测到反序列化⽂件的id与当前类的序列化id不同,那么
反序列化就会失败,他能保证我们反序列化得到完全⼀样的结果
SpringData通过注解来声明字段的映射属性,有下⾯的三个注解:
@Document
作⽤在类,标记实体类为⽂档对象
indexName:
对应索引库名称,是⼀个逻辑命名空间,相当于数据库名必须为⼩写
type:
对应在索引库中的类型
shards:
分⽚数量,默认5默认情况下,Elasticsearch为每个索引创建⼀个主分⽚和⼀个副本。这意味着每个索引将包含⼀个主分⽚,每个分
⽚将具有⼀个副本。Elasticsearch⾃动管理这些分⽚的排列,⽤户⽆需担⼼细节。
允许你⽔平分割/扩展你的内容容量
允许你在分⽚(潜在地,位于多个节点上)之上进⾏分布式的、并⾏的操作,进⽽提⾼性能/吞吐量
有两种类型的分⽚:primaryshard和replicashard
Primaryshard:每个⽂档都存储在⼀个Primaryshard。
Replicashard:每个主分⽚可以具有零个或多个副本。
-增加故障转移:如果主要故障,可以将副本分⽚提升为主分⽚
-提⾼性能:get和search请求可以由主shard或副本shard处理。
replicas:
副本数量,默认1,分配多个分⽚和副本是分布式搜索功能设计的本质,提供⾼可⽤性和快速访问索引中的⽂档。主副本和副本分⽚之
间的主要区别在于只有主分⽚可以接受索引请求。副本和主分⽚都可以提供查询请求。number_of_shards值与索引有关,⽽不是与
整个群集有关。此值指定每个索引的分⽚数(不是群集中的主分⽚总数)。
indexStoreType
⽂件存储类型,可以在节点的⾥设置,也可以在索引的setting⾥设置,但只有索引创建时才可
以。
可选的存储类型有:
fs:默认实现,取决于操作系统
simplefs:对应LuceneSimpleFsDirectory
niofs:对应LuceneNIOFSDirectory
mmapfs:对应LuceneMMapDirectory
改变这种设置,通过在config/中添加如下配置,例如:
:niofs
也可以在索引创建的时候针对某⼀个特定的索引进⾏设置
refreshInterval
h_interval:多久执⾏⼀次刷新操作,使得最近的索引更改对搜索可见。默认是1秒。设置为-1表⽰禁⽌刷新。
@Id
作⽤在成员变量,标记⼀个字段作为id主键
@Field
作⽤在成员变量,标记为⽂档的字段,并指定字段映射属性:
type:字段类型,是枚举:FieldType,可以是text、long、short、date、integer、object等
text:存储数据时候,会⾃动分词,并⽣成索引
keyword:存储数据时候,不会分词建⽴索引
Numerical:数值类型,分两类
基本数据类型:long、interger、short、byte、double、float
基本数据类型:long、interger、short、byte、double、float
half_float浮点数的⾼精度类型:scaled_float需要指定⼀个精度因⼦,⽐如10或100。elasticsearch会把真实值乘以这
个因⼦后存储,取出时再还原。
Date:⽇期类型elasticsearch可以对⽇期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。
index:是否索引,布尔类型,默认是t元宵节的象征意义是什么 rue
store:是否存储,布尔类型,默认是false
analyzer:分词器名称,这⾥的ik_max_word即使⽤ik分词器
Auto:⾃动加载
@GeoPointFieldElasticsearch地理坐标类型(Geo-point)
geo_point
GeoPoint应该使⽤包
/**
*地理位置经纬度
*lat纬度,lon经度\"40.715,-74.011\"
*如果⽤数组则相反[-73.983,40.719]
*/
@GeoPointField
privateStringaddress;
/**
*坐标位置
*/
@GeoPointField
privateGeoPointlocation;
数据:
结构:
@GeoPointField地理坐标类型⽤法
以某坐标点为中⼼搜索指定范围的其它点
通过继承ElasticsearchRepository
publicinterfaceTestRepositoryextendsElasticsearchRepository
}
@Resource
privateTestRepositorytestRepository;
publicPage
//间接实现了QueryBuilder接⼝
BoolQueryBuilderboolQueryBuilder=newBoolQueryBuilder();
//以某点为中⼼,搜索指定范围
GeoDistanceQueryBuilderdistanceQueryBuilder=newGeoDistanceQueryBuilder(\"location\");
(latitude,longitude赞美中秋节的好词佳句 );
//定义查询单位:公⾥
ce(distance,TERS);
(distanceQueryBuilder);
(boolQueryBuilder,pageable);
}
GeoDistance计算两个给定坐标点之间的距离
//计算两点距离
doubledistance=ate(srcLat,srcLon,dstLat,dstLon,TERS);
GeoDistance地理距离过滤器
该geo_distance过滤器周围绘制指定的位置了⼀圈,发现有⼀个圆圈内的地理点的所有⽂件:
{
\"query\":{
\"filtered\":{
\"filter\"销声匿迹是什么意思 :{
\"geo_distance\":{
\"distance\":\"1km\",
\"location\":{
\"lat\":40.715,
\"lon\":-73.988
}
}
}
}
}
}
查找指定点location内1km的所有字段。有关可接受单位的列表:
英⾥Mile:mi要么miles
码Yard:yd要么yards
脚Feet:ft要么feet
英⼨Inch:in要么inch
公⾥Kilometer:km要么kilometers
仪表Meter:m要么meters
厘⽶Centimeter:cm要么centimeters
毫⽶Millimeter:mm要么millimeters
海⾥Nauticalmile:NM,nmi或nauticalmiles
中⼼点可以指定为字符串,数组或对象(如本例所⽰)。纬度/经度格式:
字符串表⽰形式,带有\"lat,lon\"。“location”:“40.715,-74.011”
具有lat并lon明确命名的对象表⽰。“lat”:40.722,“lon”:-73.989
数组表⽰形式[lon,lat]。“位置”:[-73.983,40.719]
按距点的距离进⾏排序:
GET/景点/餐厅/_search
{
\"query\":{
\"filtered\":{
\"filter\":{
\"geo_bounding_box\":{
\"type\":\"indexed\",
\"location\":{
\"top_left\":{
\"lat\":40.8,
\"lon\":-74.0
},
\"bottom_right\":{
\"lat\":40.4,
\"lon\":-73.0
}
}
}
}
}
},
\"sort\":[
{
\"_geo_distance\":{
\"location\":{
\"lat\":40.715,
\"lon\":-73.998
},
\"order\":\"asc\",
\"unit\":\"km\",
\"distance_type\":\"plane\"
}
}
]
}
location:计算每个⽂档字段中指定lat/lon点与地理位置之间的距离location。
unit:返回的距离km在sort每个结果键
distance_type:使⽤更快但不太准确的plane计算
FasterGeo-DistanceCalculations更快的地理距离计算
和,前者⽐后者计算起来要慢,但精确度要⽐后者⾼
arc:最慢但最准确的是arc计算,它将世界视为⼀个球体。精度仍然受到限制,因为世界并不是真正的球体。
plane:plane将世界视为平坦世界的计算速度更快,但准确性较低。它在⾚道处最精确,⽽在极点处变得不那么精确。
sloppy_arc:之所以这么称呼,是因为它使⽤SloppyMathLucene类来交换速度的准确性,因此sloppy_arc计算使⽤来计算距
离。它的速度是的四到五倍arc,距离的准确度为99.9%。这是默认计算。
使⽤更快但不太准确的plane计算:
GET/景点/餐馆/_search
{
\"query\":{
\"filtered\":{
\"filter\":{
\"geo_distance\":{
\"distance\":\"1km\",
\"distance_type\":\"plane\",
\"loc知来者之可追 ation\":{
\"lat\":40.715,
\"lon\":-73.988
}
}
}
}
}
}
geo_distance_range过滤器:1km内-王维最简单的十首诗 2km外
geo_distance和geo_distance_range过滤器之间的唯⼀区别是,过滤器具有甜甜圈形状,并且排除了中⼼孔内的⽂档。
distance您可以指定最⼩距离(使⽤gt或gte)和最⼤距离(使⽤lt或lte),⽽不是从中⼼指定⼀个,就像range过滤器⼀样:
GET/景点/餐厅/_search
{
\"query\":{
\"filtered\":{
\"filter\":{
\"geo_distance_range\":{
\"gte\":\"1km\",
\"lt\":\"2km\",
\"location\":{
\"lat\":40.715,
\"lon\":-73.988
}
}
}
}
}
}
匹配⾄少1km从中⼼到⼩于2km中⼼的位置
除了主键其他成员变量上的注解例如:
@Field(type=d)
可省略,默认创建为text类型
特殊处理的字段还是建议加上,如@GeoPointField
keyword和text的区别
20-07-0714.03增加
按照官⽅⽂档的阐述,text类型的数据被⽤来索引长⽂本,例如电⼦邮件主体部分或者⼀款产品的介绍,这些⽂本会被分析,在建⽴
索引⽂档之前会被分词器进⾏分词,转化为词组。经过分词机制之后e登幽州台歌中心思想 s允许检索到该⽂本切分⽽成的词语,但是text类型的数据不能
⽤来过滤、排序和聚合等操作。
keyword类型的数据可以满⾜电⼦邮箱地址、主机名、状态码、邮政编码和标签等数据的要求,不进⾏分词,常常被⽤来过滤、排
序和聚合。
综上,可以发现text类型在存储数据的时候会默认进⾏分词,并⽣成索引。⽽keyword存储数据的时候,不会分词建⽴索引,显
然,这样划分数据更加节省内存。
PUT/zk_test/info/_mapping
{
\"info\":{
\"properties\":{
\"address\":{\"type\":\"text\",\"analyzer\":\"standard\"}
}
}
}
analyzer还有中⽂分词chinese,英⽂分词english等参数
已创建索引实体类字段增加问题
20-07-0714.29增加
如ES⾥字段未增加,实体类增加字段后,执⾏插⼊操作会⾃动创建,不需要重新创建索引
如增加字段时不使⽤@Field指定类型int->long,String->text,所以提前执⾏好
如ES⾥字段已增加,再进⾏变更修改类型@Field(type=d)需要删除再创建索引,不然会报错
ElasticsearchRepository和ElasticsearchTemplate的选择
20-07-0714.29增加
混合使⽤更⽅便,⼀个进⾏简单的增删改查,⼀个进⾏复杂查询
更多推荐
lat是什么意思的用法读音典
发布评论