搜索引擎之Elastic Search的高级使用

es之索引别名的使用

  • 别名有什么⽤

在开发中,随着业务需求的迭代,较⽼的业务逻辑就要⾯临更新甚⾄是重构,⽽对于es来说,为了适应新的业务逻辑,可能就要对原有的索引做⼀些修改,⽐如对某些字段做调整,甚⾄是重建索引。⽽做这些操作的时候,可能会对业务造成影响,甚⾄是停机调整等问题。由此,es提供了索引别名来解决这些问题。 索引别名就像⼀个快捷⽅式或是软连接,可以指向⼀个或多个索引,也可以给任意⼀个需要索引名的API来使⽤。别名的应⽤为程序提供了极⼤地灵活性。

  • 查询别名
GET /nba/_alias
GET /_alias
  • 新增别名
POST /_aliases
{
"actions":[
{
"add":{
"index":"nba",
"alias":"nba_v1.0"
}
}
]
}
PUT /nba/_alias/nba_v1.1
  • 删除别名
POST /_aliases
{
"actions":[
{
"remove":{
"index":"nba",
"alias":"nba_v1.0"
}
}
]
}
DELETE/nba/_alias/nba_v1.1
  • 重命名
POST /_aliases
{
"actions":[
{
"remove":{
"index":"nba",
"alias":"nba_v1.0"
}
},
{
"add":{
"index":"nba",
"alias":"nba_v2.0"
}
}
]
}
  • 为多个索引指定⼀个别名
POST /_aliases
{
"actions":[
{
"add":{
"index":"nba",
"alias":"national_player"
}
},
{
"add":{
"index":"wnba",
"alias":"national_player"
}
}
]
}
  • 为同个索引指定多个别名
POST /_aliases
{
"actions":[
{
"add":{
"index":"nba",
"alias":"nba_v2.1"
}
},
{
"add":{
"index":"nba",
"alias":"nba_v2.2"
}
}
]
}
  • 通过别名读索引

当别名指定了⼀个索引,则查出⼀个索引。

GET /nba_v2.1

当别名指定了多个索引,则查出多个索引。

GET /national_player
  • 通过别名写索引

当别名指定了⼀个索引,则可以做写的操作。

POST /nba_v2.1/_doc/566
{
"countryEn":"Croatia",
"teamName":"快船",
"birthDay":858661200000,
"country":"克罗地亚",
"teamCityEn":"LA",
"code":"ivica_zubac",
"displayAffiliation":"Croatia",
"displayName":"伊维察 祖巴茨哥哥",
"schoolType":"",
"teamConference":"⻄部",
"teamConferenceEn":"Western",
"weight":"108.9 公⽄",
"teamCity":"洛杉矶",
"playYear":3,
"jerseyNo":"40",
"teamNameEn":"Clippers",
"draft":2016,
"displayNameEn":"Ivica Zubac",
"heightValue":2.16,
"birthDayStr":"1997-03-18",
"position":"中锋",
"age":22,
"playerId":"1627826"
}

当别名指定了多个索引,可以指定写某个索引。

POST /_aliases
{
"actions":[
{
"add":{
"index":"nba",
"alias":"national_player",
"is_write_index":true
}
},
{
"add":{
"index":"wnba",
"alias":"national_player"
}
}
]
}
POST /national_player/_doc/566
{
"countryEn":"Croatia",
"teamName":"快船",
"birthDay":858661200000,
"country":"克罗地亚",
"teamCityEn":"LA",
"code":"ivica_zubac",
"displayAffiliation":"Croatia",
"displayName":"伊维察 祖巴茨妹妹",
"schoolType":"",
"teamConference":"⻄部",
"teamConferenceEn":"Western",
"weight":"108.9 公⽄",
"teamCity":"洛杉矶",
"playYear":3,
"jerseyNo":"40",
"teamNameEn":"Clippers",
"draft":2016,
"displayNameEn":"Ivica Zubac",
"heightValue":2.16,
"birthDayStr":"1997-03-18",
"position":"中锋",
"age":22,
"playerId":"1627826"
}

es之如何重建索引

背景

Elasticsearch是⼀个实时的分布式搜索引擎,为⽤户提供搜索服务,当我们决定存储某种数据时,在创建索引的时候需要将数据结构完整确定下来,于此同时索引的设定和很多固定配置将⽤不能改变。当需要改变数据结构时,就需要重新建⽴索引,为此,Elastic团队提供了很多辅助⼯具帮助开发⼈员进⾏重建索引。

步骤

  • nba取⼀个别名nba_latest, nba_latest作为对外使⽤。
  • 新增⼀个索引nba_20220101,结构复制于nba索引,根据业务要求修改字段。
  • 将nba数据同步到nba_20220101。
  • 给nba_20220101添加别名nba_latest,删除nba别名nba_latest。
  • 删除nba索引。

我们对外提供访问nba索引时使⽤的是nba_latest别名

1.新增⼀个索引(⽐如修改字段类型,jerseyNo改成keyword类型)

PUT /nba_20220101
{
"mappings":{
"properties":{
"age":{
"type":"integer"
},
"birthDay":{
"type":"date"
},
"birthDayStr":{
"type":"keyword"
},
"code":{
"type":"text"
},
"country":{
"type":"keyword"
},
"countryEn":{
"type":"keyword"
},
"displayAffiliation":{
"type":"text"
},
"displayName":{
"type":"text"
},
"displayNameEn":{
"type":"text"
},
"draft":{
"type":"long"
},
"heightValue":{
"type":"float"
},
"jerseyNo":{
"type":"keyword"
},
"playYear":{
"type":"long"
},
"playerId":{
"type":"keyword"
},
"position":{
"type":"text"
},
"schoolType":{
"type":"text"
},
"teamCity":{
"type":"text"
},
"teamCityEn":{
"type":"text"
},
"teamConference":{
"type":"keyword"
},
"teamConferenceEn":{
"type":"keyword"
},
"teamName":{
"type":"keyword"
},
"teamNameEn":{
"type":"keyword"
},
"weight":{
"type":"text"
}
}
}
}

2.将旧索引数据copy到新索引

同步等待,接⼝将会在 reindex 结束后返回。

POST /_reindex
{
"source":{
"index":"nba"
},
"dest":{
"index":"nba_20220101"
}
}

异步执⾏,如果 reindex 时间过⻓,建议加上 wait_for_completion=false 的参数条件,这样 reindex 将直接返回 taskId

POST /_reindex?wait_for_completion=false
{
"source":{
"index":"nba"
},
"dest":{
"index":"nba_20220101"
}
}

3.替换别名

POST /_aliases
{
"actions":[
{
"add":{
"index":"nba_20220101",
"alias":"nba_latest"
}
},
{
"remove":{
"index":"nba",
"alias":"nba_latest"
}
}
]
}

4.删除旧索引

DELETE/nba

5.通过别名访问新索引

POST /nba_latest/_search
{
"query":{
"match":{
"displayNameEn":"james"
}
}
}

es之refresh操作

理想的搜索:

新的数据⼀添加到索引中⽴⻢就能搜索到,但是真实情况不是这样的。我们使⽤链式命令请求,先添加⼀个⽂档,再⽴刻搜索。

curl -X PUT localhost:9200/star/_doc/888-H 'Content-Type:
application/json'-d '{ "displayName": "蔡徐坤" }'
curl -X GET localhost:9200/star/_doc/_search?pretty

强制刷新

curl -X PUT localhost:9200/star/_doc/666?refresh -H 'Content-Type:
application/json'-d '{ "displayName": "杨超越" }'
curl -X GET localhost:9200/star/_doc/_search?pretty

修改默认更新时间(默认时间是1s)

PUT /star/_settings
{
"index":{
"refresh_interval":"5s"
}
}

将refresh关闭

PUT /star/_settings
{
"index":{
"refresh_interval":"-1"
}
}

es之高亮查询

前⾔

如果返回的结果集中很多符合条件的结果,那怎么能⼀眼就能看到我们想要的那个结果呢?⽐如下⾯⽹站所示的那样,我们搜索 ⼩d课堂 ,在结果集中,将所有 ⼩d课堂 ⾼亮显示?

高亮查询

POST /nba_latest/_search
{
"query":{
"match":{
"displayNameEn":"james"
}
},
"highlight":{
"fields":{
"displayNameEn":{}
}
}
}

自定义高亮查询

POST /nba_latest/_search
{
"query":{
"match":{
"displayNameEn":"james"
}
},
"highlight":{
"fields":{
"displayNameEn":{
"pre_tags":[
"<h1>"
],
"post_tags":[
"</h1>"
]
}
}
}
}

es之查询建议

查询建议是什么

  • 查询建议,是为了给⽤户提供更好的搜索体验。包括:词条检查,⾃动补全。
  • 词条检查

  • ⾃动补全

Suggester

  • Term suggester
  • Phrase suggester
  • Completion suggester

字段

Term suggester

term 词条建议器,对给输⼊的⽂本进⾏分词,为每个分词提供词项建议。

POST /nba_latest/_search
{
"suggest":{
"my-suggestion":{
"text":"jamse hardne",
"term":{
"suggest_mode":"missing",
"field":"displayNameEn"
}
}
}
}

Phrase suggester

phrase 短语建议,在term的基础上,会考量多个term之间的关系,⽐如是否同时出现在索引的原⽂⾥,相邻程度,以及词频等。

POST /nba_latest/_search
{
"suggest":{
"my-suggestion":{
"text":"jamse harden",
"phrase":{
"field":"displayNameEn"
}
}
}
}

Completion suggester

Completion 完成建议。

POST /nba_latest/_search
{
"suggest":{
"my-suggestion":{
"text":"Miam",
"completion":{
"field":"teamCityEn"
}
}
}
}

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/227955.html<

(0)
管理的头像管理
上一篇2025-04-18 02:04
下一篇 2025-04-18 02:05

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注