是否有与 ElasticSearch 的 Postgres ts_vector 字段类似的方法?

Is there a similar approach as Postgres's ts_vector field for ElasticSearch?

使用 Postgres 时,您可以使用 ts_vector 将数据库字段中的字符串索引为向量。 (https://www.postgresql.org/docs/10/datatype-textsearch.html#DATATYPE-TSVECTOR)

ElasticSearch 有类似的概念吗?

当您将字符串索引到 text 字段时,ES 在幕后做了很多事情。

让我们以您提供的 link 中的第一个示例为例:a fat cat sat on a mat and ate a fat rat

使用 PG tsvector 类型,将对以下标记进行分析和索引

a and ate cat fat mat on rat sat

如果你想保留位置,你需要指定它们,像这样:

a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12

而在 ES 中,位置会自动保留,无需指定。也可以告诉 ES 不记录它们(为了省事space)

使用 ES text 类型和 standard analyzer,将对以下标记进行分析和索引

a fat cat sat on a mat and ate a fat rat

有了 english analyzer,我们得到了这个(删除了停用词,词干等)

fat cat sat mat at fat rat

ES 不按字母顺序存储标记,它对 free-text 搜索也无济于事。它也不会删除重复项(尽管它是 possible to do it),因为这会干扰文档和索引中的标记频率,从而影响评分。

基本上,两者都对几乎相同的标记进行索引,尽管 ES 本质上是一个搜索引擎,并且以更优化的方式进行搜索。在查看tsquery类型时,ES中的自由文本搜索也多了一点user-friendly。