干货 | Elasticsearch 词频统计的四种方案

r660926
发布于 2022-4-20 14:54
浏览
0收藏

干货 | Elasticsearch 词频统计的四种方案-鸿蒙开发者社区

 

干货 | Elasticsearch 词频统计的四种方案-鸿蒙开发者社区
之前的文章《Elasticsearch词频统计实现与原理解读》,解决的是:Q3 提及的某索引中特定关键词统计的问题。

 

解决方案是:text 字段开启 fielddata,咱们在《长津湖影评可视化》中词云的可视化本质也是这种方案。

 

那么,对于给定文档的词频统计呢?

 

原来开启 fielddata 的方案就可以实现,举例如下:

干货 | Elasticsearch 词频统计的四种方案-鸿蒙开发者社区

无非在聚合的时候,加上query 语句指定了特定 id 进行检索。

 

这种方法的缺点在于:正如 Q3 所说,聚合效率低。

 

看过上次直播的同学,可能会闪现一种想法,写入前打 tag 的方式能解决吗?

 

可以解决,但有个前提。先画个图解释一下:

 干货 | Elasticsearch 词频统计的四种方案-鸿蒙开发者社区
这个打 tag 的字段非全量,而是特定的指定脚本处理的部分。下一小节详细实现一把。

 

其实,除了开启 fielddata 和 打 tag 之外,在 Elasticsearch 中有 termvectors 接口也能实现文档词频统计。下一小节一并实现。

干货 | Elasticsearch 词频统计的四种方案-鸿蒙开发者社区
3.1 text 开启 fielddata 后聚合方案


第 2 部分已有实现说明,不再赘述。

 

3.2 写入前打 tag,写入后聚合统计方案


还是用第 2 部分的数据,说明如下:

干货 | Elasticsearch 词频统计的四种方案-鸿蒙开发者社区干货 | Elasticsearch 词频统计的四种方案-鸿蒙开发者社区

实现后,结果如下:

 干货 | Elasticsearch 词频统计的四种方案-鸿蒙开发者社区
这种统计的依然是:关键词(key)和文档(doc_count)的统计关系。

 

什么意思呢?

 

"key":“沉溺”,“doc_count”:3 本质含义是:“沉溺”在三个不同的文档中出现了。

 

细心的读者会发现,文档 1 中“沉溺”出现了2次,这种打 tag 统计是不准确的。

 

3.3 term vectors 统计

干货 | Elasticsearch 词频统计的四种方案-鸿蒙开发者社区

解释一下:

 

 •  term_vector: 检索特定文档字段中分词单元的信息和统计信息。
 •  store: 默认未开启存储,需要手动设置为true。


with_positions_offsets_payloads 是Lucene 的参数之一,释义如下:

 干货 | Elasticsearch 词频统计的四种方案-鸿蒙开发者社区
可以理解为:存储分词单元(term vector)、位置(Token position)、偏移值(offset)、有效负载(payload,猜测是ES 新增的)。

 

默认会统计词频信息,默认term information 为true。此外,还有 term statistics 和 field statistics 类型供设置和实现不同的统计,详细内容参考官方文档即可。

 

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html

 

执行:

干货 | Elasticsearch 词频统计的四种方案-鸿蒙开发者社区

这种基于特定文档的词频统计是传统意义上我们理解的词频统计。


默认情况下,term vectors是实时的,而不是接近实时的。可以通过将 realtime 参数设置为 false 来更改。实时就意味着可能会有性能问题。

 

3.4 先分词,后 term vectors 统计


在我担心仅 termvectors 可能带来的性能问题的时候,我想到了如下的解决方案。

 

前提:写入之前除了存储 message 字段,加了一个分词结果组合字段,该字段每个词用空格做分隔。

 

message 字段的前置分词需要自己调用 analyzer API 实现。

 

有了切词后的字段,再做统计会更快。

 

具体实现如下:

干货 | Elasticsearch 词频统计的四种方案-鸿蒙开发者社区

强调一下:message_ext 使用的 whitespace 分词器。

干货 | Elasticsearch 词频统计的四种方案-鸿蒙开发者社区
关于词频统计,本文给出四种方案。只有第3、4种方案结合termvectors 实现是严格意义上的词频统计,其他两种是词频-文档关系的统计。

 

考虑到方式3的实时分词可能的性能问题,扩展想到方案4前置分词的方式,能有效提高统计效率。本质也是空间换时间。

 

你的实战中如何实现的词频统计呢?欢迎留言说一下你的实现方式和思考。

分类
收藏
回复
举报
回复
    相关推荐