ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
**一、是否采用logstash单表导入,然后使用Elasticsearch多表关联** *** 参考博主文章# [干货 | Elasticsearch多表关联设计指南](https://www.cnblogs.com/xiohao/p/12774882.html) 如果采用全部单表导入方案。 >1、一个是维护成本大,涉及十几表。每张表的增删改查都需要同步到es数据库中,单这块开发成本就很高。 2、ES 擅长的是检索,而 MySQL 才擅长关系管理。通过logstash 同步关联数据到ES时,通常会建议:先通过视图对Mysql数据做好多表关联,然后同步视图数据到ES。 3、如果在es做关联查询,那么建立索引数据的时候要用嵌套文档(Nested)存储,很多场景下,使用嵌套文档的复杂度在于索引阶段对关联关系的组织拼装。而且复杂的多表关联查询用es实现起来很复杂,相关资料很少,学习成本高。 4、logstash同步数据是有分页设置,配置后自动的分页导入。另外如果到达千万级别,亿级别的数据导入就不在推荐单独使用ogstash做同步了,应该考虑配合使用消息中间件kafka之类。 5、Nested&Join父子文选型必须考虑`性能问题`。 nested 类型检索使得检索效率慢几倍,父子Join 类型检索会使得检索效率慢几百倍。 **二、使用Elasticsearch实现同段和同句搜索** *** 参考博主文章# [使用Elasticsearch实现同段和同句搜索](https://elasticsearch.cn/article/13677) >1、同句搜索要求搜索多个关键词时,返回的文章不只要包含关键词,而且这些关键词必须在同一句中。 同段搜素类似,只是范围为同一段落。 2、同段、同句搜索,使用常用的term、match查询,没有找到办法可以实现。SpanQuery常常应用在法律或专利的特定搜索。这些领域,常常提供同段 /同句搜索 。 3、bool查询结合SpanQuery跨度查询,实现复杂的组合查询。 ![](http://cloud.ryloo.icu/b8cb59f10f295fe57c44bd1ce9116990) **三、涉及1对多关联查询时的优化方案** *** 场景:一条法律案例中涉及多个法律法规 >ES 擅长的是检索,而 MySQL 才擅长关系管理。所以可以考虑二者结合,根据第一次查询的结果,第二次查询返回,使用 ES 多索引建立相同的别名,针对别名检索到对应 ID 后再回 MySQL 查询,业务层面通过关联 ID join 出需要的数据。 **四、更改elasticsearch中索引的mapping** *** 参考博主文章# [更改elasticsearch中索引的mapping](https://www.cnblogs.com/sanduzxcvbnm/p/13140141.html) >首先,elasticsearch 并不支持修改mapping映射字段,无法直接修改,所以需要曲线救国。 **五、es-ik中文分词不精确和不满足法律法规的检索需求** *** 需要完善自定义分词库,然后尝试以下分词: [# lawa](https://github.com/ShenDezhou/lawa) [# hlseg Analysis for Elasticsearch](https://github.com/HylandaOpen/elasticsearch-analysis-hlseg) [# tanford Core NLP Analyzer for Elasticsearch](https://github.com/godlockin/esStanfordNLPAnalyzer) **六、iptables开放端口号一段时间就失效了** >iptables -I INPUT 1 -p tcp --dport 5601 -j ACCEPT 一段时间后自动失效了 **七、logstash全量导入数据时出现服务器连接丢失,正在尝试重新连接!** >清空索引数据,kill -9 port,重新导入,而不是删除索引。 >保证mapping映射类型不用重新建一遍。 ``` POST law_advices_v1/_delete_by_query { "query":{ "match_all":{ } } } GET law_advices_v1/_mapping ``` **八、# [ES 搜索16 (自定义 _all 字段 copy_to关键字)](https://blog.csdn.net/qq_42383787/article/details/99948150)** > copy_to 是吧全部字段的值拼接到一个字段里面了,你在单个字段上设置的 boost 肯定没办法起作用的; 如果你希望每个字段权重不同,你可以使用 boolQuery 的多个 should 语句; 每个语句里面使用 matchQuery 或者 multiMatchQuery 来进行匹配,这样你每一个字段的权重都可以进行自定义。 **九、# ElasticSearch中keyword的属性ignore_above详解** >在[ElasticSearch](https://so.csdn.net/so/search?from=pc_blog_highlight&q=ElasticSearch)中keyword类型字段可以设置ignore_above属性(默认是10) ,表示最大的字段值长度,超出这个长度的字段将不会被索引,但是会存储。 **十、mysql数据库tinyint类型mapping映射不匹配,导致数据导入是错误** >将mysql数据库tinyint类型修改成smallint类型 **十一、mysql数据库datetime类型数据导入,时间相差5小时** 参考博主文章# [ES时区问题](https://blog.csdn.net/zlfing/article/details/78529849) >目前全量导入未作处理,查询时加上5小时。而后台实时导入时会报错,做特殊处理转化成UTC格式。 >mysql数据库datetime类型数据如果存在0000-00-00 00:00:00 这种数据,导入会报错。 >除了datetime外,MySQL int类型要对应es long类型,mapping映射时要注意,都需要一一对应。 **十二、批量文档更新** 参考博主文章# [Elasticsearch使用update_by_query](https://blog.csdn.net/feinifi/article/details/100542549) 更新多个文档,index数组传入。修改多个字段,source 用分号分隔字符串传入。 ~~~ POST _updateByQuery { "index":["law_advices_v1", "law_indictments_v1"], "body": { "query": { "term": { "user_id": "421" } }, "script": { "source": "ctx._source.user_name=params.user_name;ctx._source.requirements_tags=params.requirements_tags", "params": { "user_name":"林小侠", "requirements_tags": "测试" } } } } ~~~ **十三、同句同段检索遇到问题** >获取中文分词结果,用于同句同段的检索。因自定义词汇库不完善和IK分词器还不够强大,按目前的实现方案,同句同段的查询要先做分词后再查询(用户点击同句同段时查询分词结果,赋值到表单中) 跨度查询里span_term,必须命中存入es映射的分词词汇,所以要做分词处理后查询,才能查出来,这方案除了精度问题外,可能还会有其他问题 - -|| 时间短促,ES研究不深,或有其他方案。后续优化该部分 **十四、kibana账号密码访问出现forbidden** >更换elastic用户即可登录 **十五、logstash全量导入数据时,配置config、数据SQL、映射mapping请加上版本号** >可能存在从其他库突然同步大量的数据过来,这时候为了不影响线上查询,新建不同版本号的索引数据导入es,导入 成功后切换成新的版本数据即可不影响线上查询。 >同时es检索服务api也可以设置版本号 ![](http://cloud.ryloo.icu/3eea5325b4d88fa38879f3a1ffbd1cc3) ![](http://cloud.ryloo.icu/c84f18679e914616cdeeb924d7afc901) **十六、**[elasticsearch log4j 漏洞修复](https://cloud.tencent.com/developer/article/1919553) 参考博主文章 # [elasticsearch log4j 漏洞修复] (https://blog.csdn.net/weixin_43725548/article/details/121922264) 极牛网 # [核弹级漏洞 Apache Log4j2 席卷全球!漏洞详情和修复建议看这里](https://baijiahao.baidu.com/s?id=1718750361348735829&wfr=spider&for=pc) >北京时间12月9号深夜,Apache Log4j2被曝出一个高危漏洞,攻击者通过jndi注入攻击的形式可以轻松远程执行任何代码。随后官方紧急推出了2.15.0和2.15.0-rc1新版本修复,依然未能完全解决问题,现在已经更新到2.15.0-rc2。该漏洞被命名为Log4Shell,编号CVE-2021-44228,该漏洞CVSS评分达到了满分10分,影响全球一大半的互联网企业,包括百度、苹果等企业都被爆出存在该漏洞,众多媒体将这个漏洞形容成“史诗级”“核弹级”漏洞,可以说相当贴切。 ~~~ rpm -aq | grep elasticsearch sudo find /usr/local -name "*log4j-*.jar" ~~~ ![](http://cloud.ryloo.icu/173e7ab24e483fd0451f27b1e9b5d05d) ![](http://cloud.ryloo.icu/82bdc4daaae671075a971c6051eb0f76) ![](http://cloud.ryloo.icu/95134a3f139033ab92e7a5ed36b8a216) 找到对应的文件替换 ~~~ vim /usr/local/es/elasticsearch-7.6.2/config/jvm.options // 加入如下行 -Dlog4j2.formatMsgNoLookups=true ~~~ ![](http://cloud.ryloo.icu/72feadd1bfc9dd57cd98848b2c8491b8) 然后重启elasticsearch服务生效 ![](http://cloud.ryloo.icu/0b748514bdb6f8a7f8674fc9d7058695) **十七、分句分段查询时高亮无法显示** >多字段高亮 使用`require_field_match`开启多个字段高亮 ![](http://cloud.ryloo.icu/b7fd62867c82731aa0fbc69f70133d72)