沙师弟,师父的充电器掉了

Elasticsearch 实现模糊查询效果方式对比

Elasticsearchguoyanbiao520 发表了文章 • 3 个评论 • 9881 次浏览 • 2021-04-01 18:06 • 来自相关话题


下面是ES做传统意义上的模糊查询的两种方式,我们分析下优劣势
1:将字段设置为keyword类型,使用wildcard实现模糊查询,如果数据量较大,这种方式模糊查询效率是非常低的,所以实际案例中其实是不太实用的,除非你的数据量只有几十万,完全不用考虑效率问题,而且ES限制单个词条不能超过32766个字节,那么超过10000多字符的文章是不能被全部索引到的,那么模糊查询时就查不到没有索引到的关键词。

2:实用match_phrase查询,设置slop为0,配合单字分词实现模糊查询效果。
第二种方式最关键的是我们要实现单字符的分词,通常很多人认为标准分词器就是单字分词,事实上stander分词器只能对中文实现单字分词,对英文与数字是不能单字符分词的,而且本身就是忽略标点符号的,这样的话用match_phrase实现模糊查询其实就有误差了,例如 “中国最美,丽江盛景”,这个时候我们搜索“美丽”也一样能搜到,因为他本身忽略了标点符号,或者搜索数字或者字母时也一样没有办法跟传统的模糊查询保持一致。

所以经过测试,推荐使用ngram自定义配置实现单字分词效果,分析器配置入下
"analysis": {
"analyzer": {
"charSplit": {
"type": "custom",
"tokenizer": "my_ngram_tokenizer",
"filter": [
"lowercase"
],
"char_filter": [
"html_strip"
]
}
},
"tokenizer": {
"my_ngram_tokenizer": {
"type": "nGram",
"min_gram": "1",
"max_gram": "1",
"token_chars": [
"letter",
"digit",
"punctuation"
]
}
}
}
这样我们可以把所有的字符都单字分词,然后配合match_phrase就能实现一个真正意义上的模糊查询,这种搜索效率是比wildcard要高出很多。

上面两种方式都可以实现模糊查询的效果,第一种方式缺点就是效率太低,而且字段长度太大没有办法全部索引到。再看下第二种方式的问题

1.使用ngram单字分词会导致索引量增加(测试发现基本会翻倍甚至更多),相应的分片数与硬件配置要求需要增加。

2.使用单字符分词会使同义词查询失效,甚至影响相似性查询等操作,当然,一般来说要模糊查询也就不会考虑同义词查询了。

3.继承了传统模糊查询的问题,如搜索“8年抗战”相关内容,直接搜索关键词“8年”,会搜索到包含“2018年”的内容,这样显然不是你要的结果,但是模糊查询就是这样的效果。

4.field_data也是基于倒排索引实现功能,如有聚合或者排序等操作,也会使用单字符效果,如:某字段存储汉字“中国”,“美国”,但类型为text,这个时候如果要按照国家来聚合查询数据,单字段分词结果就会不准确,就是说聚合与排序也会用单字分词后的索引去做聚合与排序,结果自然也就有偏差了.

以上就是两种模糊查询的方式对比,实际环境里还是需要按照实际的需求与环境决定怎样选择,各位大神如果有更好的方式欢迎交流分享!

社区日报 第1229期 (2021-04-01)

社区日报白衬衣 发表了文章 • 0 个评论 • 1212 次浏览 • 2021-04-01 17:14 • 来自相关话题

1.Lucene高性能索引之道
https://mp.weixin.qq.com/s/_k-toltGmSBIl8zPq93jPQ
2.Flink 实时写入数据到 ElasticSearch 性能调优
https://mp.weixin.qq.com/s/bJ85tTSIHSpUIk-jPo0wxw
3.使用Beats创建ES template及Dashboard
https://elasticstack.blog.csdn ... 41977

编辑:金桥
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup

es频繁数据更新,如何优化

ElasticsearchGod_lockin 回复了问题 • 8 人关注 • 4 个回复 • 5604 次浏览 • 2021-03-31 21:17 • 来自相关话题

elasticsearch的临近检索

ElasticsearchLG_ES 回复了问题 • 3 人关注 • 2 个回复 • 1153 次浏览 • 2021-03-31 18:28 • 来自相关话题

elastic远程同义词文件频繁访问导致访问日志过大,怎么解决?

回复

Elasticsearchchengzhigang 发起了问题 • 1 人关注 • 0 个回复 • 1362 次浏览 • 2021-03-31 11:04 • 来自相关话题

elasticsearch启动报错

Elasticsearchtacsklet 回复了问题 • 2 人关注 • 1 个回复 • 1824 次浏览 • 2021-03-31 10:56 • 来自相关话题

ES索引的生命周期策略怎么删除过期索引

Elasticsearchxgxshtc 回复了问题 • 3 人关注 • 4 个回复 • 3706 次浏览 • 2021-03-30 13:49 • 来自相关话题

logstash-shipper 启动 cpu 飙高

Logstashshuanghan 回复了问题 • 3 人关注 • 2 个回复 • 5495 次浏览 • 2021-03-30 13:09 • 来自相关话题

社区日报 第1228期 (2021-03-29)

社区日报cyberdak 发表了文章 • 2 个评论 • 1217 次浏览 • 2021-03-29 22:30 • 来自相关话题

1.elk 性能优化实践。
http://t.cn/A6cz6pfL


2.elasticsearch 索引 对比 mysql 索引
http://t.cn/A6cz6jTn


3.Elasticsearch线程池概览
https://opster.com/elasticsear ... pool/


编辑:cyberdak
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup

 

ES 7.9 Java High Level REST Client 如何实现类似于MySQL replace()的效果

回复

ElasticsearchWZQ 发起了问题 • 1 人关注 • 0 个回复 • 1305 次浏览 • 2021-03-29 21:25 • 来自相关话题

filebeat的processor配置

回复

Beatswoshixjian 发起了问题 • 1 人关注 • 0 个回复 • 3298 次浏览 • 2021-03-29 16:43 • 来自相关话题

elasticsearch 模糊匹配忽略某些字段的特殊符号

ElasticsearchFFFrp 回复了问题 • 2 人关注 • 1 个回复 • 1678 次浏览 • 2021-03-28 22:18 • 来自相关话题

社区日报 第1226期 (2021-3-28)

社区日报至尊宝 发表了文章 • 0 个评论 • 1171 次浏览 • 2021-03-28 20:37 • 来自相关话题

1.我们如何阻止内存密集型查询使ElasticSearch崩溃 
https://plaid.com/blog/how-we- ... arch/ 
2.每秒在Elasticsearch中存储5000万个事件。 
https://datadome.co/bot-detect ... arch/ 
3.为什么英语实际上相对容易学习(但很难完全掌握)。 
http://christopherwink.com/201 ... ngue/

编辑:至尊宝
归档:https://ela.st/cn-daily-all
订阅:https://ela.st/cn-daily-sub
沙龙:https://ela.st/cn-meetup

es7.10 新增数据指定id,怎么保持所有索引不会出现重复数据

回复

Elasticsearchyiyu 发起了问题 • 1 人关注 • 0 个回复 • 2825 次浏览 • 2021-03-27 20:35 • 来自相关话题

No handler for type [histogram] declared on field [my_histogram]

ElasticsearchCharele 回复了问题 • 2 人关注 • 1 个回复 • 1574 次浏览 • 2021-03-27 16:18 • 来自相关话题