社区日报 第1038期 (2020-08-23)
https://techexpert.tips/elasti ... loud/
2.ElasticSearch-监视SNMP设备。
https://techexpert.tips/elasti ... ices/
3.228个国家/地区1GB移动数据的成本
https://www.cable.co.uk/mobile ... cing/
编辑:至尊宝
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
https://techexpert.tips/elasti ... loud/
2.ElasticSearch-监视SNMP设备。
https://techexpert.tips/elasti ... ices/
3.228个国家/地区1GB移动数据的成本
https://www.cable.co.uk/mobile ... cing/
编辑:至尊宝
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »
社区日报 第1037期 (2020-08-21)
1.不当使用scroll导致elasticsearch内存暴涨的问题
https://bbs.huaweicloud.com/forum/thread-72592-1-1.html
2.定制支持大小写搜索的正则查询
https://stackoverflow.com/questions/25969677/elasticsearch-wildcard-query-with-hyphens-and-lowercase-filter
3.利用bert提高es性能
1.不当使用scroll导致elasticsearch内存暴涨的问题
https://bbs.huaweicloud.com/forum/thread-72592-1-1.html
2.定制支持大小写搜索的正则查询
https://stackoverflow.com/questions/25969677/elasticsearch-wildcard-query-with-hyphens-and-lowercase-filter
3.利用bert提高es性能
https://github.com/charlesdong1991/HackerBERT
收起阅读 »社区日报 第1036期 (2020-08-21)
https://hackernoon.com/native- ... 93um0
2、7.9 版本新特性查看
https://www.elastic.co/guide/e ... .html
3、使用Kibana 调试产品bug
https://pmihaylov.com/kibana-debugging-tutorial/
编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
https://hackernoon.com/native- ... 93um0
2、7.9 版本新特性查看
https://www.elastic.co/guide/e ... .html
3、使用Kibana 调试产品bug
https://pmihaylov.com/kibana-debugging-tutorial/
编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »
社区日报 第1035期 (2020-08-20)
https://www.elastic.co/cn/blog ... urity
2.Elasticsearch从入门到放弃:瞎说Mapping
https://www.jianshu.com/p/b4870c90c361
3.通过pprof优化filebeat性能
https://segmentfault.com/a/1190000021307490
编辑:金桥
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
https://www.elastic.co/cn/blog ... urity
2.Elasticsearch从入门到放弃:瞎说Mapping
https://www.jianshu.com/p/b4870c90c361
3.通过pprof优化filebeat性能
https://segmentfault.com/a/1190000021307490
编辑:金桥
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »
社区日报 第1033期 (2020-08-18)
https://www.elastic.co/blog/el ... eyond
2. 基于 jupyter notebook 连接 es 进行网络安全分析
https://marcusedmondson.com/20 ... arch/
3. 如何实现一个现代化的电商搜索引擎
https://spinscale.de/posts/202 ... .html
编辑:rockybean
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
https://www.elastic.co/blog/el ... eyond
2. 基于 jupyter notebook 连接 es 进行网络安全分析
https://marcusedmondson.com/20 ... arch/
3. 如何实现一个现代化的电商搜索引擎
https://spinscale.de/posts/202 ... .html
编辑:rockybean
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »
社区日报 第1032期 (2020-08-17)
https://cloud.tencent.com/deve ... 51711
2.掌握它才说明你真正懂ELASTICSEARCH(包括LUCENE介绍)
https://www.cnblogs.com/techno ... .html
3.Elasticsearch+Hbase实现海量数据秒回查询
https://blog.csdn.net/sdksdk0/ ... 66430
编辑:cyberdak
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
https://cloud.tencent.com/deve ... 51711
2.掌握它才说明你真正懂ELASTICSEARCH(包括LUCENE介绍)
https://www.cnblogs.com/techno ... .html
3.Elasticsearch+Hbase实现海量数据秒回查询
https://blog.csdn.net/sdksdk0/ ... 66430
编辑:cyberdak
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
收起阅读 »
社区日报 第1031期 (2020-08-16)
https://techexpert.tips/elasti ... inux/
2.为ElasticSearch搜索添加身份验证。
https://blogs.sap.com/2019/10/ ... arch/
3.苹果陷入游戏行业的战争中,IOS的未来已成定局?
https://www.theverge.com/2020/ ... f33b4
编辑:至尊宝
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
https://techexpert.tips/elasti ... inux/
2.为ElasticSearch搜索添加身份验证。
https://blogs.sap.com/2019/10/ ... arch/
3.苹果陷入游戏行业的战争中,IOS的未来已成定局?
https://www.theverge.com/2020/ ... f33b4
编辑:至尊宝
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »
社区日报 第1030期 (2020-08-15)
1.使用search_as_you_type类型搜索
https://spinscale.de/posts/2020-05-29-implementing-a-linkedin-like-search-as-you-type-with-elasticsearch.html
2.Elasticsearch Count 性能大提升
https://mp.weixin.qq.com/s/Dyys-aWoMsgWwwlo4HfEFA
3.如何对 ElasticSearch 集群进行压力测试
https://mp.weixin.qq.com/s/XGnzpFTTnGfTEA1Cle8JwA?scene=25#wechat_redirect
1.使用search_as_you_type类型搜索
https://spinscale.de/posts/2020-05-29-implementing-a-linkedin-like-search-as-you-type-with-elasticsearch.html
2.Elasticsearch Count 性能大提升
https://mp.weixin.qq.com/s/Dyys-aWoMsgWwwlo4HfEFA
3.如何对 ElasticSearch 集群进行压力测试
https://mp.weixin.qq.com/s/XGnzpFTTnGfTEA1Cle8JwA?scene=25#wechat_redirect
收起阅读 »社区日报 第1029期 (2020-08-14)
https://elasticsearch.cn/m/article/14056
2,ELK 数据高德地图可视化展示
https://www.jianshu.com/p/c148bf91c3ac
3,Elasticsearch clickhouse输出插件
https://github.com/mikechris/l ... house
编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
https://elasticsearch.cn/m/article/14056
2,ELK 数据高德地图可视化展示
https://www.jianshu.com/p/c148bf91c3ac
3,Elasticsearch clickhouse输出插件
https://github.com/mikechris/l ... house
编辑:铭毅天下
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »
社区日报 第1028期 (2020-08-13)
https://mp.weixin.qq.com/s/uYWyckRRlS48GaBDSqPDTg
2.Esctl:elasticsearch 命令行工具
https://github.com/jeromepin/esctl
3.自动发现监控Kubernetes工作负载的同时安全地管理凭据
https://www.elastic.co/blog/se ... overy
编辑:金桥
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
https://mp.weixin.qq.com/s/uYWyckRRlS48GaBDSqPDTg
2.Esctl:elasticsearch 命令行工具
https://github.com/jeromepin/esctl
3.自动发现监控Kubernetes工作负载的同时安全地管理凭据
https://www.elastic.co/blog/se ... overy
编辑:金桥
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »
社区日报 第1027期 (2020-08-12)
https://www.elastic.co/blog/co ... urity
2、Jira和ELK Stack集成;
https://medium.com/%40Raghwend ... 6afae
3、elasticsearch应用场景之cross_fields;
https://mp.weixin.qq.com/s/DHphwnCkfNRoE5dqlV3Kiw
编辑:wt
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
https://www.elastic.co/blog/co ... urity
2、Jira和ELK Stack集成;
https://medium.com/%40Raghwend ... 6afae
3、elasticsearch应用场景之cross_fields;
https://mp.weixin.qq.com/s/DHphwnCkfNRoE5dqlV3Kiw
编辑:wt
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »
社区日报 第1026期 (2020-08-11)
https://apiko.com/blog/elastic ... lace/
2、 如何合理的使用Elasticsearch。
https://dzone.com/articles/how ... er-be
3、如何在HyperNode上使用Elasticsearch。
https://support.hypernode.com/ ... rnode
编辑:叮咚光军
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
https://apiko.com/blog/elastic ... lace/
2、 如何合理的使用Elasticsearch。
https://dzone.com/articles/how ... er-be
3、如何在HyperNode上使用Elasticsearch。
https://support.hypernode.com/ ... rnode
编辑:叮咚光军
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »
社区日报 第1025期 (2020-08-10)
https://kuaibao.qq.com/s/20190813A0FAC200
2.怀疑集群性能有问题?来参考一下elastic 官方做的benckmark吧
https://elasticsearch-benchmarks.elastic.co/
3.关于 ELASTICSEARCH 时区的小知识
https://www.easyice.cn/archives/343
编辑:cyberdakk
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
https://kuaibao.qq.com/s/20190813A0FAC200
2.怀疑集群性能有问题?来参考一下elastic 官方做的benckmark吧
https://elasticsearch-benchmarks.elastic.co/
3.关于 ELASTICSEARCH 时区的小知识
https://www.easyice.cn/archives/343
编辑:cyberdakk
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »
2. ES之从零开始 | 纠错(Did You Mean)
2. ES之从零开始 - 纠错(Did You Mean)
纠错的另一种说法叫拼写检查(Spell Check),降低由于输入错误导致的不好检索体验。 本文将会分享此类问题的ES解决方案,致力于提升用户的体验。
简单的约定(Simple Convention)
- ES
- Version
- 7.8.0
- Analyzer(index、query)
- Ansj
- Version
-
测试数据
- 2020年中国营收Top500公司的名称
- ES纠错测试数据构建
词纠错(Term Suggester)
Elasticsearch通过直接读取Lucene的词库(Term Dictionary)数据并通过莱文斯坦距离(Levenshtein Distance)算法来提供纠错功能。
-
模拟拼写错误,发送纠错请求
- analyzer, 默认采用指定字段的search analzyer, 为了把搜索词当成一个整体,采用了keywrok analyzer.
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "有钱公司", "term": { "field": "name", "analyzer": "keyword" } } } }
-
根据拼写错误的关键词,获取纠错词
- options 纠错词列表,获取词库中满足条件的词(默认的最大编辑距离为2,max_edits: 2)
- score, 编辑距离越短得分越高。
- freq, lucene 词库中出现的频率。
{ "my_suggestion" : [ { "text" : "有钱公司", "offset" : 0, "length" : 4, "options" : [ { "text" : "有限公司", "score" : 0.75, "freq" : 421 } ] } ] }
-
中文不像英文单词那么长,2个字以前都是有出错概率的
- 期望输入
太平
,结果输成了太苹
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太苹", "term": { "field": "name", "analyzer": "keyword" } } } }
- 期望输入
-
Demo 3的纠错请求结果
{ "my_suggestion" : [ { "text" : "太苹", "offset" : 0, "length" : 2, "options" : [ ] } ] }
-
原来是两个参数限制了结果的返回
- min_word_length, 表示只有当关键词长度大于等于该值时,才会进行纠错
- suggest_mode, 默认只有当搜索词在词库中不存在时,再会进行纠错
- missing, 搜索词不存在于词库中,执行搜索逻辑(默认)
- popular, 只返回频率大于原始词的纠错词
- always, 始终返回任何命中的纠错词
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太苹", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword" } } } }
-
两个字纠错结果
{ "my_suggestion" : [ { "text" : "太苹", "offset" : 0, "length" : 2, "options" : [ { "text" : "太原", "score" : 0.5, "freq" : 1 }, { "text" : "太平", "score" : 0.5, "freq" : 1 }, { "text" : "太极", "score" : 0.5, "freq" : 1 } ] } ] }
-
suggest_mode 之always
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太平", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword" } } } }
-
suggest_mode 之always 结果
- 返回了所有命中的纠错词
{ "my_suggestion" : [ { "text" : "太平", "offset" : 0, "length" : 2, "options" : [ { "text" : "太平洋", "score" : 0.5, "freq" : 2 }, { "text" : "太原", "score" : 0.5, "freq" : 1 }, { "text" : "太极", "score" : 0.5, "freq" : 1 } ] } ] }
-
suggest_mode 之popular
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太平", "term": { "field": "name", "suggest_mode": "popular", "min_word_length": 2, "analyzer": "keyword" } } } }
-
suggest_mode 之popular结果
- 太平在词库中 出现过1次
- popular 应该返回频率大于1的纠错词
{ "my_suggestion" : [ { "text" : "太平", "offset" : 0, "length" : 2, "options" : [ { "text" : "太平洋", "score" : 0.5, "freq" : 2 } ] } ] }
-
通过编辑距离控制纠错词列表
- max_edits, 通过编辑距离在词库中获取建议词,该值只能为1和2,设置其它值则会报错,默认距离为2.
- 编辑距离为1时,召回搜索词与词库中只错一个字符的词。
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太平", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword", "max_edits": 1 } } } }
- max_edits, 通过编辑距离在词库中获取建议词,该值只能为1和2,设置其它值则会报错,默认距离为2.
-
通过编辑距离控制纠错词列表结果
{ "my_suggestion" : [ { "text" : "太平", "offset" : 0, "length" : 2, "options" : [ { "text" : "太平洋", "score" : 0.5, "freq" : 2 }, { "text" : "太原", "score" : 0.5, "freq" : 1 }, { "text" : "太极", "score" : 0.5, "freq" : 1 } ] } ] }
-
纠错词的排序与返回个数
- size, 每个词返回的最大纠错词
- sort, 返回纠错词的顺序
- score, 三层排序,先根据编辑距离得分倒序,再根据纠错词频率倒序,最后纠错词的字典序
- frequency, 三层排序,先根据纠错词频率倒序,再根据编辑距离得分倒序,最后纠错词的字典序
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太平", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword", "size": 2, "sort": "score" } } } }
-
纠错词的排序与返回个数结果
{ "my_suggestion" : [ { "text" : "太平", "offset" : 0, "length" : 2, "options" : [ { "text" : "太平洋", "score" : 0.5, "freq" : 2 }, { "text" : "太原", "score" : 0.5, "freq" : 1 } ] } ] } }
-
编辑距离与得分
- internal, 距离越小得分越高。
- jaro_winkler JW算法 ,在internal 基本上也考虑了通用的前缀的加权逻辑。
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太平", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword", "string_distance": "jaro_winkler" } } } }
-
编辑距离与得分结果
- 太平洋和太原编辑距离都是1
- internal 都是0.5分,相同的编辑距离
- jaro_winkler 太平洋得分要远高于太原,因为太平洋在词库中有一个通用的前缀
太平
{ "my_suggestion" : [ { "text" : "太平", "offset" : 0, "length" : 2, "options" : [ { "text" : "太平洋", "score" : 0.9111111, "freq" : 2 }, { "text" : "太原", "score" : 0.6666667, "freq" : 1 }, { "text" : "太极", "score" : 0.6666667, "freq" : 1 } ] } ] }
- 太平洋和太原编辑距离都是1
-
通过纠错词最小文档阀值限制返回的个数
- min_doc_freq, 纠错词最小文档阀值,类型可为数值和百分比。
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "福地", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword", "size": 20, "min_doc_freq":3 } } } }
-
通过纠错词频率限制控制返回的个数
{ "my_suggestion" : [ { "text" : "福地", "offset" : 0, "length" : 2, "options" : [ { "text" : "福建", "score" : 0.5, "freq" : 4 } ] } ] }
-
第一个字错了,可以纠正么?
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "大平洋", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword" } } } }
-
第一个字错了,在上述语法中无法正常纠正
{ "my_suggestion" : [ { "text" : "大平洋", "offset" : 0, "length" : 3, "options" : [ ] } ] }
-
第一个字错了的正确纠正DSL
- prefix_length, 只纠正满足前缀条件的搜索词,默认值为1
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "大平洋", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword", "prefix_length": 0 } } } }
-
第一个字错了的正确纠正结果
{ "my_suggestion" : [ { "text" : "大平洋", "offset" : 0, "length" : 3, "options" : [ { "text" : "太平洋", "score" : 0.6666666, "freq" : 2 }, { "text" : "平洋", "score" : 0.5, "freq" : 2 } ] } ] }
-
suggest计算是分片级的,而最终的TOP K 可能会出现频率统计精度丢失,可以通过shard_size来修正
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "大平洋", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword", "prefix_length": 0, "shard_size": 10 } } } }
-
公司名称纠错
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "华侨集团有限公司", "term": { "field": "name", "suggest_mode": "always" } } } }
-
公司名称纠错结果
- 通常公司名称都是分词字段,使用默认 search_analyzer或者 keyword analyzer 都无法针对完整公司名纠错。
{ "my_suggestion" : [ { "text" : "华侨", "offset" : 0, "length" : 2, "options" : [ ] }, { "text" : "集团", "offset" : 2, "length" : 2, "options" : [ ] }, { "text" : "有限公司", "offset" : 4, "length" : 4, "options" : [ ] } ] }
短语纠错(Phrase Suggester)
多个词组合成一个整体进行拼写错误纠错。
-
短语纠错 查询
- direct_generator, 短语纠错词生成器,生成器主要是用于多个词组合并输出得分。
- 生成器,内部的参数与词纠错一致。
- max_errors, 只允许纠错 max_errors个词
- highlight, 纠错词高亮
- collate, 短语纠错不能保证命中文档,通过collate指定查询语句来标识是否命中文档。
- prune, 返回结果中标识是否命中
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "中国石头化工集团有限公司", "phrase": { "field": "name", "size": 3, "direct_generator": [ { "field": "name", "size": 1, "max_edits": 1, "min_word_length": 2, "suggest_mode": "always" } ], "max_errors": 1, "highlight": { "pre_tag": "<em>", "post_tag": "</em>" }, "collate": { "query": { "source": { "match": { "{{field_name}}": "{{suggestion}}" } } }, "params": { "field_name": "name" }, "prune": true } } } } }
- direct_generator, 短语纠错词生成器,生成器主要是用于多个词组合并输出得分。
-
短语纠错 结果
- collate_match, 标识是否命中文档
{ "my_suggestion" : [ { "text" : "中国石头化工集团有限公司", "offset" : 0, "length" : 12, "options" : [ { "text" : "中国 石油 化工 集团 有限公司", "highlighted" : "中国 <em>石油</em> 化工 集团 有限公司", "score" : 4.7643356E-5, "collate_match" : true } ] } ] }
小结
- 在ES中,仅返回当搜索组不在词库中,且词库中存在与搜索词小于2个编辑距离的词作为候选。
- 短语纠错词列表默认是不检查纠错后的短语能否命中文档的。
- 在短语纠错中,collate 是必要的,否则无法保障纠错后的词能命中结果。
2. ES之从零开始 - 纠错(Did You Mean)
纠错的另一种说法叫拼写检查(Spell Check),降低由于输入错误导致的不好检索体验。 本文将会分享此类问题的ES解决方案,致力于提升用户的体验。
简单的约定(Simple Convention)
- ES
- Version
- 7.8.0
- Analyzer(index、query)
- Ansj
- Version
-
测试数据
- 2020年中国营收Top500公司的名称
- ES纠错测试数据构建
词纠错(Term Suggester)
Elasticsearch通过直接读取Lucene的词库(Term Dictionary)数据并通过莱文斯坦距离(Levenshtein Distance)算法来提供纠错功能。
-
模拟拼写错误,发送纠错请求
- analyzer, 默认采用指定字段的search analzyer, 为了把搜索词当成一个整体,采用了keywrok analyzer.
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "有钱公司", "term": { "field": "name", "analyzer": "keyword" } } } }
-
根据拼写错误的关键词,获取纠错词
- options 纠错词列表,获取词库中满足条件的词(默认的最大编辑距离为2,max_edits: 2)
- score, 编辑距离越短得分越高。
- freq, lucene 词库中出现的频率。
{ "my_suggestion" : [ { "text" : "有钱公司", "offset" : 0, "length" : 4, "options" : [ { "text" : "有限公司", "score" : 0.75, "freq" : 421 } ] } ] }
-
中文不像英文单词那么长,2个字以前都是有出错概率的
- 期望输入
太平
,结果输成了太苹
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太苹", "term": { "field": "name", "analyzer": "keyword" } } } }
- 期望输入
-
Demo 3的纠错请求结果
{ "my_suggestion" : [ { "text" : "太苹", "offset" : 0, "length" : 2, "options" : [ ] } ] }
-
原来是两个参数限制了结果的返回
- min_word_length, 表示只有当关键词长度大于等于该值时,才会进行纠错
- suggest_mode, 默认只有当搜索词在词库中不存在时,再会进行纠错
- missing, 搜索词不存在于词库中,执行搜索逻辑(默认)
- popular, 只返回频率大于原始词的纠错词
- always, 始终返回任何命中的纠错词
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太苹", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword" } } } }
-
两个字纠错结果
{ "my_suggestion" : [ { "text" : "太苹", "offset" : 0, "length" : 2, "options" : [ { "text" : "太原", "score" : 0.5, "freq" : 1 }, { "text" : "太平", "score" : 0.5, "freq" : 1 }, { "text" : "太极", "score" : 0.5, "freq" : 1 } ] } ] }
-
suggest_mode 之always
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太平", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword" } } } }
-
suggest_mode 之always 结果
- 返回了所有命中的纠错词
{ "my_suggestion" : [ { "text" : "太平", "offset" : 0, "length" : 2, "options" : [ { "text" : "太平洋", "score" : 0.5, "freq" : 2 }, { "text" : "太原", "score" : 0.5, "freq" : 1 }, { "text" : "太极", "score" : 0.5, "freq" : 1 } ] } ] }
-
suggest_mode 之popular
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太平", "term": { "field": "name", "suggest_mode": "popular", "min_word_length": 2, "analyzer": "keyword" } } } }
-
suggest_mode 之popular结果
- 太平在词库中 出现过1次
- popular 应该返回频率大于1的纠错词
{ "my_suggestion" : [ { "text" : "太平", "offset" : 0, "length" : 2, "options" : [ { "text" : "太平洋", "score" : 0.5, "freq" : 2 } ] } ] }
-
通过编辑距离控制纠错词列表
- max_edits, 通过编辑距离在词库中获取建议词,该值只能为1和2,设置其它值则会报错,默认距离为2.
- 编辑距离为1时,召回搜索词与词库中只错一个字符的词。
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太平", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword", "max_edits": 1 } } } }
- max_edits, 通过编辑距离在词库中获取建议词,该值只能为1和2,设置其它值则会报错,默认距离为2.
-
通过编辑距离控制纠错词列表结果
{ "my_suggestion" : [ { "text" : "太平", "offset" : 0, "length" : 2, "options" : [ { "text" : "太平洋", "score" : 0.5, "freq" : 2 }, { "text" : "太原", "score" : 0.5, "freq" : 1 }, { "text" : "太极", "score" : 0.5, "freq" : 1 } ] } ] }
-
纠错词的排序与返回个数
- size, 每个词返回的最大纠错词
- sort, 返回纠错词的顺序
- score, 三层排序,先根据编辑距离得分倒序,再根据纠错词频率倒序,最后纠错词的字典序
- frequency, 三层排序,先根据纠错词频率倒序,再根据编辑距离得分倒序,最后纠错词的字典序
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太平", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword", "size": 2, "sort": "score" } } } }
-
纠错词的排序与返回个数结果
{ "my_suggestion" : [ { "text" : "太平", "offset" : 0, "length" : 2, "options" : [ { "text" : "太平洋", "score" : 0.5, "freq" : 2 }, { "text" : "太原", "score" : 0.5, "freq" : 1 } ] } ] } }
-
编辑距离与得分
- internal, 距离越小得分越高。
- jaro_winkler JW算法 ,在internal 基本上也考虑了通用的前缀的加权逻辑。
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "太平", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword", "string_distance": "jaro_winkler" } } } }
-
编辑距离与得分结果
- 太平洋和太原编辑距离都是1
- internal 都是0.5分,相同的编辑距离
- jaro_winkler 太平洋得分要远高于太原,因为太平洋在词库中有一个通用的前缀
太平
{ "my_suggestion" : [ { "text" : "太平", "offset" : 0, "length" : 2, "options" : [ { "text" : "太平洋", "score" : 0.9111111, "freq" : 2 }, { "text" : "太原", "score" : 0.6666667, "freq" : 1 }, { "text" : "太极", "score" : 0.6666667, "freq" : 1 } ] } ] }
- 太平洋和太原编辑距离都是1
-
通过纠错词最小文档阀值限制返回的个数
- min_doc_freq, 纠错词最小文档阀值,类型可为数值和百分比。
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "福地", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword", "size": 20, "min_doc_freq":3 } } } }
-
通过纠错词频率限制控制返回的个数
{ "my_suggestion" : [ { "text" : "福地", "offset" : 0, "length" : 2, "options" : [ { "text" : "福建", "score" : 0.5, "freq" : 4 } ] } ] }
-
第一个字错了,可以纠正么?
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "大平洋", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword" } } } }
-
第一个字错了,在上述语法中无法正常纠正
{ "my_suggestion" : [ { "text" : "大平洋", "offset" : 0, "length" : 3, "options" : [ ] } ] }
-
第一个字错了的正确纠正DSL
- prefix_length, 只纠正满足前缀条件的搜索词,默认值为1
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "大平洋", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword", "prefix_length": 0 } } } }
-
第一个字错了的正确纠正结果
{ "my_suggestion" : [ { "text" : "大平洋", "offset" : 0, "length" : 3, "options" : [ { "text" : "太平洋", "score" : 0.6666666, "freq" : 2 }, { "text" : "平洋", "score" : 0.5, "freq" : 2 } ] } ] }
-
suggest计算是分片级的,而最终的TOP K 可能会出现频率统计精度丢失,可以通过shard_size来修正
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "大平洋", "term": { "field": "name", "suggest_mode": "always", "min_word_length": 2, "analyzer": "keyword", "prefix_length": 0, "shard_size": 10 } } } }
-
公司名称纠错
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "华侨集团有限公司", "term": { "field": "name", "suggest_mode": "always" } } } }
-
公司名称纠错结果
- 通常公司名称都是分词字段,使用默认 search_analyzer或者 keyword analyzer 都无法针对完整公司名纠错。
{ "my_suggestion" : [ { "text" : "华侨", "offset" : 0, "length" : 2, "options" : [ ] }, { "text" : "集团", "offset" : 2, "length" : 2, "options" : [ ] }, { "text" : "有限公司", "offset" : 4, "length" : 4, "options" : [ ] } ] }
短语纠错(Phrase Suggester)
多个词组合成一个整体进行拼写错误纠错。
-
短语纠错 查询
- direct_generator, 短语纠错词生成器,生成器主要是用于多个词组合并输出得分。
- 生成器,内部的参数与词纠错一致。
- max_errors, 只允许纠错 max_errors个词
- highlight, 纠错词高亮
- collate, 短语纠错不能保证命中文档,通过collate指定查询语句来标识是否命中文档。
- prune, 返回结果中标识是否命中
GET top500_company_names/_search { "suggest": { "my_suggestion": { "text": "中国石头化工集团有限公司", "phrase": { "field": "name", "size": 3, "direct_generator": [ { "field": "name", "size": 1, "max_edits": 1, "min_word_length": 2, "suggest_mode": "always" } ], "max_errors": 1, "highlight": { "pre_tag": "<em>", "post_tag": "</em>" }, "collate": { "query": { "source": { "match": { "{{field_name}}": "{{suggestion}}" } } }, "params": { "field_name": "name" }, "prune": true } } } } }
- direct_generator, 短语纠错词生成器,生成器主要是用于多个词组合并输出得分。
-
短语纠错 结果
- collate_match, 标识是否命中文档
{ "my_suggestion" : [ { "text" : "中国石头化工集团有限公司", "offset" : 0, "length" : 12, "options" : [ { "text" : "中国 石油 化工 集团 有限公司", "highlighted" : "中国 <em>石油</em> 化工 集团 有限公司", "score" : 4.7643356E-5, "collate_match" : true } ] } ] }
小结
- 在ES中,仅返回当搜索组不在词库中,且词库中存在与搜索词小于2个编辑距离的词作为候选。
- 短语纠错词列表默认是不检查纠错后的短语能否命中文档的。
- 在短语纠错中,collate 是必要的,否则无法保障纠错后的词能命中结果。
社区日报 第1024期 (2020-08-09)
https://techexpert.tips/elasti ... ttps/
2.通过设置TLS和调整CORS权限在Elastic服务器上加密通信。
https://blogs.query.ai/encrypt ... erver
3.Docker容器日志存储在哪里?
https://sematext.com/blog/docker-logs-location/
编辑:至尊宝
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup
https://techexpert.tips/elasti ... ttps/
2.通过设置TLS和调整CORS权限在Elastic服务器上加密通信。
https://blogs.query.ai/encrypt ... erver
3.Docker容器日志存储在哪里?
https://sematext.com/blog/docker-logs-location/
编辑:至尊宝
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup 收起阅读 »