个人博客

记录工作中的点点滴滴


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 搜索

lasticsearch:IK中文分词器

发表于 2020-01-02 | 更新于: 2020-01-02 | 分类于 elk
| 字数统计: 1.6k 字 | 阅读时长 ≈ 7 分钟

Elasticsearch内置的分词器对中文不友好,只会一个字一个字的分,无法形成词语,比如:

1
2
3
4
5
POST /_analyze
{
"text": "我爱北京天安门",
"analyzer": "standard"
}

如果我们使用的是standard的分词器,那么结果就是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 0
},
{
"token" : "爱",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 1
},
...
{
"token" : "门",
"start_offset" : 6,
"end_offset" : 7,
"type" : "<IDEOGRAPHIC>",
"position" : 6
}
]
}

显然这对中文来说并不友好,它显示的每一个汉字。好在Elastic的大拿medcl已经为我们做好IK中文分词器。下面我们来详细介绍如何安装并使用中文分词器。具体的安装步骤可以在地址https://github.com/medcl/elasticsearch-analysis-ik找到。

阅读全文 »

lasticsearch:ICU分词器介绍

发表于 2020-01-02 | 更新于: 2020-01-02 | 分类于 elk
| 字数统计: 1.2k 字 | 阅读时长 ≈ 5 分钟

ICU Analysis插件是一组将Lucene ICU模块集成到Elasticsearch中的库。 本质上,ICU的目的是增加对Unicode和全球化的支持,以提供对亚洲语言更好的文本分割分析。 从Elasticsearch的角度来看,此插件提供了文本分析中的新组件,如下表所示:

安装

我们可以首先到Elasticsearch的安装目录打入如下的命令:

1
2
3
4
5
6
$ pwd
/Users/liuxg/elastic/elasticsearch-7.3.0
(base) localhost:elasticsearch-7.3.0 liuxg$ ./bin/elasticsearch-plugin list
analysis-icu
analysis-ik
pinyin

上面显示我已经安装好了三个插件。上面的analysis-ik及pinyin都是为中文而准备的。

注意:如果你们在使用上面的elasticsearch-plug list命名出现如下的错误的话:

那么请使用如下的命令来删除在当前目录下的.DS_Store目录:

1
sudo find /Path/to/your/elasticsearch-folder -name ".DS_Store" -depth -exec rm {} \;

然后重新运行上面的命令就不会有问题了。

阅读全文 »

lasticsearch:fuzzy 搜索(模糊搜索)

发表于 2020-01-02 | 更新于: 2020-01-02 | 分类于 elk
| 字数统计: 876 字 | 阅读时长 ≈ 4 分钟

在实际的搜索中,我们有时候会打错字,从而导致搜索不到。在Elasticsearch中,我们可以使用fuzziness属性来进行模糊查询,从而达到搜索有错别字的情形。

match查询具有“fuziness”属性。它可以被设置为“0”, “1”, “2”或“auto”。“auto”是推荐的选项,它会根据查询词的长度定义距离。

Fuzzy query

返回包含与搜索词相似的词的文档,以Levenshtein编辑距离测量。

编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。 这些更改可以包括:

  • 更改字符(box→fox)
  • 删除字符(black→lack)
  • 插入字符(sic→sick)
  • 转置两个相邻字符(act→cat)

为了找到相似的词,模糊查询会在指定的编辑距离内创建搜索词的所有可能变化或扩展的集合。 查询然后返回每个扩展的完全匹配。

阅读全文 »

Elasticsearch:运用shard filtering来控制索引分配给哪个节点

发表于 2020-01-02 | 更新于: 2020-01-02 | 分类于 elk
| 字数统计: 1.7k 字 | 阅读时长 ≈ 6 分钟

在我们的实际部署中,我们的各个node(节点)的能力是不一样的。比如有的节点的计算能力比较强,而且配有高性能的存储,速度也比较快,同时我们可能有一些node的能力稍微差一点,比如计算能力及存储器的速度都比较差一点。针对这两种情况,我们其实可以把这两种节点用来做不同的用途:运算能力较强的节点可以用来做indexing(建立索引表格)的工作,而那些能力较差一点的节点,我们可以用来做搜索用途。我们可以把这两种节点分别叫做:

  • hot node:用于支持索引并写入新文档
  • warm node:用于处理不太频繁查询的只读索引

这种架构在Elasticsearch中,我们称之为hot/warm架构。

Hot node

我们可以使用hot node来做indexing:

  • indexing是CPU和IO的密集操作,因此热节点应该是功能强大的服务器
  • 比warm node更快的存储

阅读全文 »

Elasticsearch:运用search_after来进行深度分页

发表于 2020-01-02 | 更新于: 2020-01-02 | 分类于 elk
| 字数统计: 2k 字 | 阅读时长 ≈ 10 分钟

在上一篇文章 “Elasticsearch:运用scroll接口对大量数据实现更好的分页”,我们讲述了如何运用scroll接口来对大量数据来进行有效地分页。在那篇文章中,我们讲述了两种方法:

  • from加上size的方法来进行分页
  • 运用scroll接口来进行分页

对于大量的数据而言,我们尽量避免使用from+size这种方法。这里的原因是index.max_result_window的默认值是10K,也就是说from+size的最大值是1万。搜索请求占用堆内存和时间与from+size成比例,这限制了内存。假如你想hit从990到1000,那么每个shard至少需要1000个文档:

为了避免过度使得我们的cluster繁忙,通常Scroll接口被推荐作为深层次的scrolling,但是因为维护scroll上下文也是非常昂贵的,所以这种方法不推荐作为实时用户请求。search_after参数通过提供实时cursor来解决此问题。 我们的想法是使用上一页的结果来帮助检索下一页。

我们先输入如下的文档到twitter索引中:

1
2
3
4
5
6
7
8
9
10
11
12
13
POST _bulk
{ "index" : { "_index" : "twitter", "_id": 1} }
{"user":"双榆树-张三", "DOB":"1980-01-01", "message":"今儿天气不错啊,出去转转去","uid":2,"age":20,"city":"北京","province":"北京","country":"中国","address":"中国北京市海淀区","location":{"lat":"39.970718","lon":"116.325747"}}
{ "index" : { "_index" : "twitter", "_id": 2 }}
{"user":"东城区-老刘", "DOB":"1981-01-01", "message":"出发,下一站云南!","uid":3,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区台基厂三条3号","location":{"lat":"39.904313","lon":"116.412754"}}
{ "index" : { "_index" : "twitter", "_id": 3} }
{"user":"东城区-李四", "DOB":"1982-01-01", "message":"happy birthday!","uid":4,"age":30,"city":"北京","province":"北京","country":"中国","address":"中国北京市东城区","location":{"lat":"39.893801","lon":"116.408986"}}
{ "index" : { "_index" : "twitter", "_id": 4} }
{"user":"朝阳区-老贾","DOB":"1983-01-01", "message":"123,gogogo","uid":5,"age":35,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区建国门","location":{"lat":"39.718256","lon":"116.367910"}}
{ "index" : { "_index" : "twitter", "_id": 5} }
{"user":"朝阳区-老王","DOB":"1984-01-01", "message":"Happy BirthDay My Friend!","uid":6,"age":50,"city":"北京","province":"北京","country":"中国","address":"中国北京市朝阳区国贸","location":{"lat":"39.918256","lon":"116.467910"}}
{ "index" : { "_index" : "twitter", "_id": 6} }
{"user":"虹桥-老吴", "DOB":"1985-01-01", "message":"好友来了都今天我生日,好友来了,什么 birthday happy 就成!","uid":7,"age":90,"city":"上海","province":"上海","country":"中国","address":"中国上海市闵行区","location":{"lat":"31.175927","lon":"121.383328"}}

阅读全文 »
1…91011…29
永夜初晗凝碧天

永夜初晗凝碧天

Linux,Python,MySQL,ELK Stack,K8S,Docker

141 日志
55 分类
60 标签
RSS
QQ E-Mail
友情链接
  • 博客园
  • 百度
近期文章
  • Elasticsearch IK 分词器
  • 为Elasticsearch启动https访问
  • FastAPI框架入门 基本使用, 模版渲染, form表单数据交互, 上传文件, 静态文件配置
  • Elasticsearch:使用_update_by_query更新文档
  • Solutions:安全的APM服务器访问
© 2019 — 2020 永夜初晗凝碧天
博客全站字数统计 : 412.1k 字 ||载入天数...载入时分秒...
本文总阅读量次 || 本站访客数人次 || 本站总访问量次