塞尔塔的英文翻译英语怎么说-个性情侣英文网名


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;

publicPagefindPage(doublelatitude,doublelongitude,Stringdistance,Pageablepageable){

//间接实现了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是什么意思的用法读音典