【内推】【华为云】Elasticsearch内核开发工程师
求职招聘 • stone_xy 发表了文章 • 1 个评论 • 4414 次浏览 • 2023-02-06 16:45
1. 参与云端搜索引擎、万亿级记录的搜索系统实现
2. 算法、索引、系统架构方面参与挑战业界极限的技术攻关
3. 向量检索算法开发
4. 推荐与搜索的结合开发
优选条件:
1. 熟悉搜索引擎或者向量检索,对索引结构,引擎架构,分布式引擎有经验者优先
2. 熟悉Elasticsearch、Lucene系统优先
3. 熟悉向量检索算法
4. 熟悉推荐系统工程与算法
工作地点: 深圳/西安
联系: niklaus.xiao@huawei.com
phone/vchar: 17688760968
团队介绍:
云搜索服务团队,从事搜索引擎的自研以及开源Elasticsearch/Lucene等组件的内核优化能力。
在追求市场拓展的前提下,聚焦于市场需要的技术突破,当前已经在向量检索、超低成本、索引Build性能、千人千面等领域取得领先于业界的优势技术。
期望能够找到志同道合的朋友一起,为提升搜索技术的应用范围以及不断突破技术极限而努力。团队会对你的技术成长和职业成长负责。
在 bulk批量新增数据后,立刻_update操作部分字段,会把新增的字段覆盖(全为null)
Elasticsearch • God_lockin 回复了问题 • 2 人关注 • 1 个回复 • 3519 次浏览 • 2023-02-07 16:30
如何在Kibana中删除已经生成的csv报告?
Kibana • poka 回复了问题 • 2 人关注 • 2 个回复 • 4283 次浏览 • 2023-02-06 14:56
配置track_total_hits为true没有生效
Elasticsearch • warriors 回复了问题 • 3 人关注 • 1 个回复 • 4869 次浏览 • 2023-02-10 16:11
Elasticsearch大版本升级之后geo_shape的polygon查询没有结果
回复Elasticsearch • zerolh 回复了问题 • 1 人关注 • 1 个回复 • 4297 次浏览 • 2023-02-08 09:06
招聘搜索引擎内核研发工程师(Rust方向)
求职招聘 • medcl 发表了文章 • 0 个评论 • 6108 次浏览 • 2023-01-28 17:33
岗位职责
- 设计并开发下一代实时搜索引擎 ;
- 持续优化实现方案,改进组件性能 ;
- 保证工程质量和开发效率 。
岗位要求
- 3 年以上搜索引擎开发经验,计算机相关专业,本科及以上学历 ;
- 熟练掌握 Rust/C/C++/Golang 中的一种或多种语言,有 Rust 实际开发经验者优先 ;
- 熟悉 Linux 操作系统,了解Linux系统常用操作命令, 能基于shell编写脚本 ;
- 熟悉 Linux 下内存管理机制,低延迟、高并发无锁化编程 ;
- 熟悉 TCP/IP、Socket、HTTP 等网络协议 ;
- 具有良好的沟通、团队协作能力;
- 熟悉常见分布式算法,有大规模分布式系统开发经验优先;
- 较好的英文阅读和写作能力,具备比较强的逻辑思维能力;
- 良好的编码习惯和技术文档能力,具备持续输出的能力;
- 工作地点不限 。
加分项
- 有自己的博客、Github、开源项目优先 ;
- 具有相关搜索引擎开发工作经验者优先 ;
- 熟悉各类索引结构;
- 熟悉 LSM-Tree、B+Tree、RocksDB、LevelDB 优先 ;
- 有较强的学习能力,愿意致力于新技术的研究 。
更多信息请访问极限实验室官网: https://www.infinilabs.com/career/
为什么ES的副本分片进行恢复的时候,仅仅向主分片提供_seq_no就可以了,拿到主分片_seq_no后的操作就算恢复完成,而不是提供_seq_no+_primary_term
Elasticsearch • emmning 回复了问题 • 2 人关注 • 1 个回复 • 4687 次浏览 • 2023-02-08 16:38
【重启通知】Elastic 中国开发者大会定于2023年4月8日,深圳好日子皇冠假日酒店,欢迎前来参会!
活动 • liaosy 发表了文章 • 0 个评论 • 5985 次浏览 • 2023-01-19 15:18
会议信息同步
- 关于讲师议题:少部分讲师和议题有变化,组委会近期会与讲师沟通确认是否需要更换新的演讲议题。
- 已经报名参会者无需再次报名。
其他说明
- 目前大会报名购票通道已重新开启,欢迎推荐有兴趣的朋友报名参会,可享受八折购票优惠,折扣报名链接:[https://www.bagevent.com/event ... 80OFF](https://www.bagevent.com/event ... D80OFF)
- 由于部分议题陈旧,我们重新开放了演讲议题申请,欢迎大家提交和推荐。议题提交链接:[http://elasticsearch.mikecrm.com/2gQNDKh](http://elasticsearch.mikecrm.com/2gQNDKh)
- 赞助合作申请:[http://elasticsearch.mikecrm.com/6gxTHs4](http://elasticsearch.mikecrm.com/6gxTHs4)
- 如需要加入大会微信交流群,请加微信(
lsy965145175
)拉群。 - 更多大会信息请关注官网:[https://conf.elasticsearch.cn](https://conf.elasticsearch.cn)
感谢
这次的 Elastic 中国开发者大会虽然遇到了很多的困难与波折,但因为您们的理解和支持,一直鼓励着我们,给了我们信心与动力,我们会本着办好中国开发者大会的初心继续前行,再次感谢大家的大力支持!
在2023年新春到来之际,Elastic 中国开发者大会组委会祝大家新春快乐、身体健康、工作顺利、阖家幸福!
求助:nestde嵌套实现类似not exist的效果
Elasticsearch • FFFrp 回复了问题 • 2 人关注 • 1 个回复 • 5348 次浏览 • 2023-02-02 10:42
关于es7中的节点失效探测(fault_detection)参数
回复Elasticsearch • shwtz 发起了问题 • 1 人关注 • 0 个回复 • 7244 次浏览 • 2023-01-17 14:56
Elasticsearch:如何在 Elasticsearch 中正确使用同义词功能
Elasticsearch • liuxg 发表了文章 • 0 个评论 • 8674 次浏览 • 2023-01-13 09:20
原文地址 [elasticstack.blog.csdn.net](https://elasticstack.blog.csdn ... 655866)

同义词用于提高搜索质量并扩大匹配范围。 例如,搜索 England 的用户可能希望找到包含 British 或 UK 的文档,尽管这三个词完全不同。
[Elasticsearch](https://so.csdn.net/so/search% ... 1.7020) 中的同义词功能非常强大,如果实施得当,可以使你的搜索引擎更加健壮和强大。 在本文中,我们将通过简单的代码片段介绍在实践中实现同义词功能的要点。 特别是,我们将介绍如何更新现有索引的同义词,这是一个相对高级的话题。
在今天的展示中,我将使用最新的 Elastic Stack 8.6.0,尽管版本不对我们的展示有任何的影响。
准备
==
我们将使用 Docker 在本地启动一个 Elasticsearch 服务器,并使用 [Kibana](https://so.csdn.net/so/search% ... 1.7020) 来管理索引和运行命令。 如果你以前从未使用过 Elasticsearch 或想快速复习一下,[这篇文章](https://elasticstack.blog.csdn ... 36411 "这篇文章")可能会对你有所帮助。 如果你在 Docker 中运行 Elasticsearch 时遇到问题,[这篇文章](https://elasticstack.blog.csdn ... 58356 "这篇文章")很可能会帮助你解决问题。在今天的文章中,我们尝试使用 docker 来部署一个没有安全功能的 Elasticsearch 集群。
准备就绪后,让我们开始探索 Elasticsearch 中的同义词功能的旅程。
我们将在本文中使用的 docker-compose.yaml 文件包含以下内容,稍后我们将向其添加更多功能:
docker-compose.yml
``<br />
- version: "3.9"
- services:
- elasticsearch:
- image: elasticsearch:8.6.0
- environment:
-
- discovery.type=single-node
- discovery.type=single-node
-
- ES_JAVA_OPTS=-Xms1g -Xmx1g
- ES_JAVA_OPTS=-Xms1g -Xmx1g
-
- xpack.security.enabled=false
- xpack.security.enabled=false
- volumes:
-
- type: volume
- type: volume
- source: es_data
- target: /usr/share/elasticsearch/data
- ports:
-
- target: 9200
- target: 9200
- published: 9200
- networks:
-
- elastic
- elastic
- kibana:
- image: kibana:8.6.0
- ports:
-
- target: 5601
- target: 5601
- published: 5601
- depends_on:
-
- elasticsearch
- elasticsearch
- networks:
-
- elastic
- elastic
- volumes:
- es_data:
- driver: local
- networks:
- elastic:
- name: elastic
- driver: bridge
<br /> ```<br /> <br /> 你可以使用以下命令之一启动 Elasticsearch 和 Kibana:<br /> <br /> ```<br /> docker-compose up<br /> ```<br /> <br /> 或者<br /> <br /> ```<br /> docker-compose up -d<br /> ```<br /> <br /> 如果加上 -d 选项的话,Elasticsearch 会以 daemon 的形式来运行。上面是一种最为简单的方式来启动 Elasticsearch 集群及 Kibana。由于它没有设置安全,我们无需输入任何凭证就可以直接进入到 Kibana 了。<br /> <br /> <br /> <br /> 使用带有同义词列表的标准同义词 token 过滤器<br /> =========================<br /> <br /> 让我们首先使用带有同义词列表的标准同义词标记过滤器创建一个索引。 在 Kibana 中运行以下命令,我们将在稍后解释详细信息: <br /> <br /> ```<br />
- PUT synonyms
- {
- "settings": {
- "index": {
- "analysis": {
- "analyzer": {
- "index_analyzer": {
- "tokenizer": "standard",
- "filter": [
- "lowercase",
- "synonym_filter"
- ]
- }
- },
- "filter": {
- "synonym_filter": {
- "type": "synonym",
- "synonyms": [
- "elk => Elastic Stack",
- "elkb => Elastic Stack"
- ]
- }
- }
- }
- }
- },
- "mappings": {
- "properties": {
- "name": {
- "type": "text",
- "analyzer": "index_analyzer"
- }
- }
- }
- }
`
```
这里的要点:
- 请注意设置键的嵌套级别。 settings => index => analysis => analyzer/filter 都是内置关键字。 但是,index_analyzer 和 synonym_filter 分别是自定义分析器和过滤器的自定义名称。
- 我们需要创建一个 type 为 synonym 的自定义过滤器。 synonym 选项明确提供了同义词列表。 这通常应该只用于测试,因为更新同义词列表不方便,我们稍后会看到。
- 本文中使用了 [Solr 同义词](https://www.elastic.co/guide/e ... onyms "Solr 同义词")。 对于此示例,使用了显式映射,这意味着 => 左侧的标记将替换为右侧的标记。 稍后我们将使用等同的同义词,这意味着提供的 token 被等同对待。
- synonym_filter 添加到名为 index_analyzer 的新自定义分析器的过滤器列表中。 通常过滤器的顺序很重要。 然而,对于同义词过滤器来说,它有点特殊,可能会让我们中的许多人感到惊讶。 在此示例中,即使 synonym_filter 过滤器放在小写过滤器之后,此过滤器返回的标记也会传递给小写过滤器,因此也会变成小写。 因此,你不需要在同义词列表或同义词文件中提供小写 token。
- 最后,在文档的映射中,为名称字段指定了自定义分析器。
我们知道在早期的 Elastic 产品中 elk 就是 Elastic Stack 的代名词。之后随着 Beats 的加入,很多开发者也把 elkb 当做 Elastic Stack 的代名词。要测试在索引中创建的分析器,我们可以调用 _analyze 端点:
```
- GET /synonyms/_analyze
- {
- "analyzer": "index_analyzer",
- "text": "elk is powerful"
- }
<br /> <br /> 上面命令的输出为:<br /> <br />
`
- {
- "tokens": [
- {
- "token": "elastic",
- "start_offset": 0,
- "end_offset": 3,
- "type": "SYNONYM",
- "position": 0
- },
- {
- "token": "is",
- "start_offset": 4,
- "end_offset": 6,
- "type": "
", - "position": 1
- },
- {
- "token": "stack",
- "start_offset": 4,
- "end_offset": 6,
- "type": "SYNONYM",
- "position": 1
- },
- {
- "token": "powerful",
- "start_offset": 7,
- "end_offset": 15,
- "type": "
", - "position": 2
- }
- ]
- }
`
<br /> <br /> 从上面的输出中,我们可以看到 type 为 SNONYM 的 token 为 elastic 及 stack。让我们向索引中添加一些文档并测试它在搜索中是否正常工作:<br /> <br />
- PUT /synonyms/_doc/1
- {
- "name": "elk is very powerful"
- }
- PUT /synonyms/_doc/2
- {
- "name": "elkb is useful"
- }
- PUT /synonyms/_doc/3
- {
- "name": "Elastic Stack is so widely used"
- }
<br /> <br /> 我们可以使用 match 关键字进行简单的搜索:<br /> <br />
- GET /synonyms/_search?filter_path=**.hits
- {
- "query": {
- "match": {
- "name": "elk"
- }
- }
- }
<br /> <br /> 如果没有问题,所有三个文件都应该被搜索到:<br /> <br />
`
- {
- "hits": {
- "hits": [
- {
- "_index": "synonyms",
- "_id": "2",
- "_score": 0.31931418,
- "_source": {
- "name": "elkb is useful"
- }
- },
- {
- "_index": "synonyms",
- "_id": "1",
- "_score": 0.29086044,
- "_source": {
- "name": "elk is very powerful"
- }
- },
- {
- "_index": "synonyms",
- "_id": "3",
- "_score": 0.24686477,
- "_source": {
- "name": "Elastic Stack is so widely used"
- }
- }
- ]
- }
- }
`
```
索引时间 vs 搜索时间进行同义词操作
===================
如你所见,在上面的示例中,只创建了一个分析器,它用于索引和搜索。
不鼓励在索引(indexing)步骤中对所有文档应用同义词,因为它有一些主要缺点:
- 如果不重新索引所有内容,就无法更新同义词列表,这在实践中是非常低效的。
- 搜索分数会受到影响,因为同义词 token 也会被计算在内。
- 索引过程变得更加耗时并且索引将变得更大。 对于小数据集来说可以忽略不计,但对于大数据集来说非常重要。
因此,最好在搜索步骤中只应用同义词,这样可以克服所有三个缺点。 为此,我们需要创建一个用于搜索的新分析器。
使用 search_analyzer 并应用搜索时间同义词
=============================
在 Kibana 中运行以下命令以创建具有搜索时同义词的新索引:
``<br />
- 如果不重新索引所有内容,就无法更新同义词列表,这在实践中是非常低效的。
- PUT synonym_graph
- {
- "settings": {
- "index": {
- "analysis": {
- "analyzer": {
- "index_analyzer": {
- "tokenizer": "standard",
- "filter": [
- "lowercase"
- ]
- },
- "search_analyzer": {
- "tokenizer": "standard",
- "filter": [
- "lowercase",
- "synonym_filter"
- ]
- }
- },
- "filter": {
- "synonym_filter": {
- "type": "synonym_graph",
- "synonyms": [
- "elk => Elastic Stack",
- "elkb => Elastic Stack"
- ]
- }
- }
- }
- }
- },
- "mappings": {
- "properties": {
- "name": {
- "type": "text",
- "analyzer": "index_analyzer",
- "search_analyzer": "search_analyzer"
- }
- }
- }
- }
`
```
关键点:
- 该类型现在更改为 [synonym_graph](https://www.elastic.co/guide/e ... .html "synonym_graph"),这是一个更复杂的同义词过滤器,旨在仅用作搜索分析器的一部分。 它可以更恰当地处理多词同义词,推荐用于搜索时分析。 但是,你可以继续使用原来的 synonym 类型,它在这篇文章中的表现是一样的。
- 同义词过滤器从索引时间分析器中删除并添加到搜索时间分析器中。
- search_analyzer 是为 name 字段明确指定的。 如果未指定,则相同的分析器 (index_analyzer) 将用于索引和搜索。
分析器应该返回与以前相同的 token。 然而,当你用这些命令为三个文档建立索引并再次执行相同的搜索后,结果会有所不同:
```
- 该类型现在更改为 [synonym_graph](https://www.elastic.co/guide/e ... .html "synonym_graph"),这是一个更复杂的同义词过滤器,旨在仅用作搜索分析器的一部分。 它可以更恰当地处理多词同义词,推荐用于搜索时分析。 但是,你可以继续使用原来的 synonym 类型,它在这篇文章中的表现是一样的。
- PUT /synonym_graph/_doc/1
- {
- "name": "elk is very powerful"
- }
- PUT /synonym_graph/_doc/2
- {
- "name": "elkb is useful"
- }
- PUT /synonym_graph/_doc/3
- {
- "name": "Elastic Stack is so widely used"
- }
<br /> <br /> 我们使用如下的命令来进行搜索:<br /> <br />
- GET /synonym_graph/_search?filter_path=**.hits
- {
- "query": {
- "match": {
- "name": "elk"
- }
- }
- }
<br /> <br /> 这一次,只有如下的结果返回。甚至 “elk is very powerful” 这个文档也没有被返回:<br /> <br />
- {
- "hits": {
- "hits": [
- {
- "_index": "synonym_graph",
- "_id": "3",
- "_score": 2.3589978,
- "_source": {
- "name": "Elastic Stack is so widely used"
- }
- }
- ]
- }
- }
<br /> <br /> 原因是同义词过滤器仅在搜索时应用。 搜索查询 elk 被替换为同义词标记 “Elastic Stack”。 然而,索引中的文档没有被同义词过滤器(synonym_filter)过滤,因此 “elk” 只是被标记为 elk 而没有被 Elastic Stack 替换。 类似于 elkb。 结果,只能匹配 “Elastic Stack is so widely used”。<br /> <br /> 为了使其像前面的示例一样正常工作,我们需要将同义词规则从显式映射更改为等效同义词。 让我们按如下方式更新同义词过滤器:<br /> <br />
- ......
- "filter": {
- "synonym_filter": {
- "type": "synonym_graph",
- "synonyms": [
- "elk, elkb, Elastic Stack"
- ]
- }
- }
- ......
<br /> <br /> 要更改现有索引的同义词,我们可以重新创建索引并重新索引所有文档,这是愚蠢且低效的。<br /> <br /> 更好的方法是更新索引的设置。 但是,我们需要在更新设置之前关闭索引,然后重新打开它才能访问它:<br /> <br />
- POST /synonym_graph/_close
- PUT /synonym_graph/_settings
- {
- "settings": {
- "index.analysis.filter.synonym_filter.synonyms": [
- "elk, elkb, Elastic Stack"
- ]
- }
- }
- POST /synonym_graph/_open
<br /> <br /> 请注意更新索引设置的特殊语法。<br /> <br /> 运行上述命令后,我们可以通过如下命令的返回值来进行验证:<br /> <br />
GET synonym_graph
<br /> <br /> 上面的命令返回:<br /> <br />
`
- {
- "synonym_graph": {
- "aliases": {},
- "mappings": {
- "properties": {
- "name": {
- "type": "text",
- "analyzer": "index_analyzer",
- "search_analyzer": "search_analyzer"
- }
- }
- },
- "settings": {
- "index": {
- "routing": {
- "allocation": {
- "include": {
- "_tier_preference": "data_content"
- }
- }
- },
- "number_of_shards": "1",
- "provided_name": "synonym_graph",
- "creation_date": "1673501061514",
- "analysis": {
- "filter": {
- "synonym_filter": {
- "type": "synonym_graph",
- "synonyms": [
- "elk, elkb, Elastic Stack"
- ]
- }
- },
- "analyzer": {
- "index_analyzer": {
- "filter": [
- "lowercase"
- ],
- "tokenizer": "standard"
- },
- "search_analyzer": {
- "filter": [
- "lowercase",
- "synonym_filter"
- ],
- "tokenizer": "standard"
- }
- }
- },
- "number_of_replicas": "1",
- "uuid": "UCIWtpQMTsCc1TwnvsywHA",
- "version": {
- "created": "8060099"
- }
- }
- }
- }
- }
`
<br /> <br /> 让我们使用 _analyzer 端点测试 search_analyzer 并查看生成的 token:<br /> <br />
- GET /synonym_graph/_analyze
- {
- "analyzer": "search_analyzer",
- "text": "elk"
- }
<br /> <br /> 上述命令返回:<br /> <br /> 它表明 elk 搜索查询被三个同义词的 token 替换和扩展(由 [expand](<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-graph-tokenfilter.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/e ... .html</a> "expand") 选项控制)。 它还证明,如果在索引时应用等效同义词,则结果索引的大小可以显着增加。<br /> <br /> 然后当我们再次执行相同的搜索时:<br /> <br />
- GET /synonym_graph/_search?filter_path=**.hits
- {
- "query": {
- "match": {
- "name": "elk"
- }
- }
- }
<br /> <br /> 这次搜索的结果是:<br /> <br />
`
- {
- "hits": {
- "hits": [
- {
- "_index": "synonym_graph",
- "_id": "3",
- "_score": 1.6949677,
- "_source": {
- "name": "Elastic Stack is so widely used"
- }
- },
- {
- "_index": "synonym_graph",
- "_id": "2",
- "_score": 1.1220688,
- "_source": {
- "name": "elkb is useful"
- }
- },
- {
- "_index": "synonym_graph",
- "_id": "1",
- "_score": 1.0126972,
- "_source": {
- "name": "elk is very powerful"
- }
- }
- ]
- }
- }
`
```
我们可以看到三个文档都被搜索出来了。
使用同义词文件
=======
上面我们一直在创建索引时直接指定同义词列表。 但是,当你有大量同义词时,将它们全部添加到索引中会很麻烦。 更好的方法是将它们存储在一个文件中,然后动态地将它们加载到索引中。 使用同义词文件有很多好处,其中包括:
- 方便维护大量的同义词。
- 可以被不同的索引使用。
- 可以在不关闭索引的情况下动态重新加载。
首先,我们需要先将同义词放入一个文件中。 每行都是一个同义词规则,与上面演示的相同。 更多[细节](https://www.elastic.co/guide/e ... yms_2 "细节")可以在官方文档中找到。
我们将创建的同义词文件称为 synonyms.txt,但可以任意命名。 它具有以下内容:
```
- 方便维护大量的同义词。
- $ pwd
- /Users/liuxg/data/docker8
- $ ls
- docker-compose.yml synonyms.txt
- $ cat synonyms.txt
-
This is a comment! The file is named synonyms.txt.
- elk,elkb,Elastic Stack
<br /> <br /> 然后我们需要将同义词文件绑定到 Docker 容器中。 更新 docker-compose.yaml 如下:<br /> <br /> **docker-compose.yml**<br /> <br />
`
- version: "3.9"
- services:
- elasticsearch:
- image: elasticsearch:8.6.0
- environment:
-
- discovery.type=single-node
- discovery.type=single-node
-
- ES_JAVA_OPTS=-Xms1g -Xmx1g
- ES_JAVA_OPTS=-Xms1g -Xmx1g
-
- xpack.security.enabled=false
- xpack.security.enabled=false
- volumes:
-
- type: volume
- type: volume
- source: es_data
- target: /usr/share/elasticsearch/data
-
- type: bind
- type: bind
- source: ./synonyms.txt
- target: /usr/share/elasticsearch/config/synonyms.txt
- ports:
-
- target: 9200
- target: 9200
- published: 9200
- networks:
-
- elastic
- elastic
- kibana:
- image: kibana:8.6.0
- ports:
-
- target: 5601
- target: 5601
- published: 5601
- depends_on:
-
- elasticsearch
- elasticsearch
- networks:
-
- elastic
- elastic
- volumes:
- es_data:
- driver: local
- networks:
- elastic:
- name: elastic
- driver: bridge
`
<br /> <br /> 我们可以使用 CTRL+C 来终止之前运行的 docker,然后再次使用如下命令来启动:<br /> <br />
docker-compose up
<br /> <br /> 请注意,同义词文件已加载到容器中的 config 文件夹中。你可以进入容器并使用以下两个命令之一检查它:<br /> <br />
-
User docker
- docker exec -it elasticsearch-1 bash
-
User docker-compose
- docker-compose exec elasticsearch bash
<br /> <br /> 现在我们需要停止并重新启动服务以使更改生效。 请注意,仅重新启动服务将不起作用。<br /> <br />
- docker-compose stop elasticsearch
- docker-compose up -d elasticsearch
<br /> <br />
- $ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 3ae4b728dd44 kibana:8.6.0 "/bin/tini -- /usr/l…" 23 seconds ago Up 21 seconds 0.0.0.0:5601->5601/tcp docker8-kibana-1
- 878c82384761 elasticsearch:8.6.0 "/bin/tini -- /usr/l…" 23 seconds ago Up 22 seconds 0.0.0.0:9200->9200/tcp, 9300/tcp docker8-elasticsearch-1
- $ docker exec -it docker8-elasticsearch-1 bash
- elasticsearch@878c82384761:~$ pwd
- /usr/share/elasticsearch
- elasticsearch@878c82384761:~$ ls
- LICENSE.txt NOTICE.txt README.asciidoc bin config data jdk lib logs modules plugins
- elasticsearch@878c82384761:~$ cd config/
- elasticsearch@878c82384761:~/config$ ls
- elasticsearch-plugins.example.yml jvm.options log4j2.properties synonyms.txt
- elasticsearch.keystore jvm.options.d role_mapping.yml users
- elasticsearch.yml log4j2.file.properties roles.yml users_roles
<br /> <br /> 从上面的输出中,我们可以看到 synonyms.txt 已经被成功地加载到容器里了。<br /> <br /> 然后我们可以使用同义词文件创建一个新索引:<br /> <br />
`
- PUT /synonym_graph_file
- {
- "settings": {
- "index": {
- "analysis": {
- "analyzer": {
- "index_analyzer": {
- "tokenizer": "standard",
- "filter": [
- "lowercase"
- ]
- },
- "search_analyzer": {
- "tokenizer": "standard",
- "filter": [
- "lowercase",
- "synonym_filter"
- ]
- }
- },
- "filter": {
- "synonym_filter": {
- "type": "synonym_graph",
- "synonyms_path": "synonyms.txt",
- "updateable": true
- }
- }
- }
- }
- },
- "mappings": {
- "properties": {
- "name": {
- "type": "text",
- "analyzer": "index_analyzer",
- "search_analyzer": "search_analyzer"
- }
- }
- }
- }
`
```
关键点:
- 对于 synonyms_path,它是同义词文件相对于 Elasticsearch 服务器中 config 文件夹的路径。
- 添加了一个新的 updateable 字段,它指定相应的过滤器是否可更新。 我们很快就会看到如何在不关闭和打开索引的情况下重新加载搜索分析器。
这个新索引 synonym_graph_file 的行为应该与前一个 synonym_graph 的行为相同。
现在让我们在同义词文件中添加更多的同义词,其内容如下:
```
- 对于 synonyms_path,它是同义词文件相对于 Elasticsearch 服务器中 config 文件夹的路径。
- $ pwd
- /Users/liuxg/data/docker8
- $ ls
- docker-compose.yml synonyms.txt
- $ cat synonyms.txt
-
This is a comment! The file is named synonyms.txt.
- elk,elkb,Elastic Stack
- JS => JavaScript
- TS => TypeScript
- Py => Python
<br /> <br /> 添加同义词后,我们可以关闭并打开索引使其生效。 然而,由于我们将同义词过滤器标记为可更新,我们可以重新加载搜索分析器以使更改立即生效,而无需关闭索引,因此无需停机。<br /> <br /> 要重新加载索引的搜索分析器,我们需要调用 _reload_search_analyzers 端点:<br /> <br />
POST /synonym_graph_file/_reload_search_analyzers
<br /> <br /> 上面的命令输出为:<br /> <br />
`
- {
- "_shards": {
- "total": 2,
- "successful": 1,
- "failed": 0
- },
- "reload_details": [
- {
- "index": "synonym_graph_file",
- "reloaded_analyzers": [
- "search_analyzer"
- ],
- "reloaded_node_ids": [
- "tZLy82KRTaiCdpsbkEYnuA"
- ]
- }
- ]
- }
`
<br /> <br /> 现在,当我们分析 JS 字符串时,我们将看到返回的 javascript token。<br /> <br />
- GET /synonym_graph_file/_analyze
- {
- "analyzer": "search_analyzer",
- "text": "JS"
- }
<br /> <br /> 上面的命令返回:<br /> <br />
- {
- "tokens": [
- {
- "token": "javascript",
- "start_offset": 0,
- "end_offset": 2,
- "type": "SYNONYM",
- "position": 0
- }
- ]
- }
```
这里应该注意两件重要的事情:
- 如果同义词过滤器的 updateable 设置为true,那么对应的分析器只能作为 search_analyzer 使用,不能用于索引,即使类型是同义词。
- updateable 选项只能在同义词文件与 synonyms_path 选项一起使用时使用,而不是在同义词直接通过 synonyms 选项提供时使用。
恭喜你到达这里! 我们已经涵盖了在 Elasticsearch 中使用同义词功能的所有要点。
我们已经分别介绍了如何在索引时间和搜索时间分析步骤中使用同义词。 此外,还介绍了如何直接提供同义词列表,以及如何通过文件提供。 最后但同样重要的是,介绍了关于如何更新现有索引的同义词列表的不同方法。 建议重新加载索引的搜索分析器,因为它不会给服务带来停机时间。
- 如果同义词过滤器的 updateable 设置为true,那么对应的分析器只能作为 search_analyzer 使用,不能用于索引,即使类型是同义词。
社区日报 第1565期 (2023-01-12)
社区日报 • Se7en 发表了文章 • 0 个评论 • 5723 次浏览 • 2023-01-13 07:37
https://itnext.io/how-to-run-d ... bc774
2.使用 Springboot 基于 Elasticsearch 构建搜索服务(需要梯子)
https://deni-setiawan.medium.c ... a2ec9
3.定制你的 Kibana UI(需要梯子)
https://medium.com/%40lizka.k/ ... b9253
编辑:Se7en
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站: https://ela.st/bilibili
白金版还能购买吗?怎么购买呢?
Elasticsearch • liuxg 回复了问题 • 2 人关注 • 1 个回复 • 5912 次浏览 • 2023-01-13 09:19
社区日报 第1564期 (2023-01-11)
社区日报 • kin122 发表了文章 • 0 个评论 • 5764 次浏览 • 2023-01-11 11:24
https://blog.csdn.net/UbuntuTo ... 15554
2.Elasticsearch:Go 客户端简介 - 8.x
https://blog.csdn.net/UbuntuTo ... 24246
3.ES 与 mysql数据同步实践(需要梯子)
https://medium.com/%40batuhann ... 70ff8
编辑:kin122
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站:https://ela.st/bilibili
社区日报 第1563期 (2023-01-10)
社区日报 • God_lockin 发表了文章 • 0 个评论 • 5743 次浏览 • 2023-01-10 09:00
1. ES 数据建模之道(需要梯子)
https://medium.com/%40zhaoyi01 ... 3d4fc
2. ES 嵌入spring的一些sample(需要梯子)
https://levelup.gitconnected.c ... 3e6b1
3. Benchling 的搜索架构演进之路
https://benchling.engineering/ ... 7452c
编辑:斯蒂文
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
B站: https://ela.st/bilibili