This is an automated email from the ASF dual-hosted git repository.
hello-stephen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-website.git
The following commit(s) were added to refs/heads/master by this push:
new cf733a936d0 [blog] add eight blogs (2026-07 ~ 2026-08) and render
external-link stubs as MDX (#4104)
cf733a936d0 is described below
commit cf733a936d024e50552d61bc0766ba4f86b56395
Author: Mingyu Chen (Rayner) <[email protected]>
AuthorDate: Tue Sep 1 16:39:32 2026 +0800
[blog] add eight blogs (2026-07 ~ 2026-08) and render external-link stubs
as MDX (#4104)
## Versions
- [ ] dev
- [ ] 4.x
- [ ] 3.x
- [ ] 2.1 or older (not covered by version/language sync gate)
## Languages
- [ ] Chinese
- [x] English
- [ ] Japanese candidate translation needed
## Docs Checklist
- [x] Checked by AI
- [ ] Test Cases Built
- [x] Updated required version and language counterparts, or explained
why not
- [x] If only one language changed, confirmed whether source/translation
counterparts need sync
---
Blog-only change. The site blog is English-only, so there is no
localized or versioned counterpart to update.
### 1. `dbt-for-apache-doris 1.1.0` blog
Adds the post and a follow-up wording pass over its summary and body.
### 2. Eight new blog entries (2026-07-10 → 2026-08-27)
Added as external-link entries, following the pattern of #3996, with
cover images under `static/images/blogs/`.
| Date | Title | Tag |
| --- | --- | --- |
| 2026-07-10 | Databricks RT and LTAP are here. How does it fit into
OLTP, OLAP, real-time OLAP, and HTAP | Tech Sharing |
| 2026-07-17 | Apache Doris Gets Rust-Native Streaming Ingestion with
Apache Iggy | Tech Sharing |
| 2026-07-24 | Search in Apache Doris 4.1: Unifying Full-Text Log Search
and Real-Time SQL Analytics | Tech Sharing |
| 2026-07-31 | How Meituan Consolidated Its Analytics Stack on Apache
Doris | Best Practice |
| 2026-08-06 | Apache Doris Python UDF: Calling the Python Ecosystem
from SQL for Agent-Era | Tech Sharing |
| 2026-08-12 | From Spark to Apache Doris: How Kwai Made A/B Testing
Metrics 145x Faster at Scale | Best Practice |
| 2026-08-21 | PostgreSQL CDC to Apache Doris: Real-Time Sync with One
SQL Statement | Tech Sharing |
| 2026-08-27 | Dynamic JSON in Agent Workloads: Apache Doris vs
ClickHouse, Elasticsearch, and OpenSearch | Tech Sharing |
The Blog header selection (`picked`/`order`) moves onto the four newest
of these, and `src/components/recent-blogs/recent-blogs.data.ts` and
`src/constant/newsletter.data.ts` are refreshed to match.
Titles and summaries are kept vendor-neutral: the Iggy post is titled
"Apache Doris Gets Rust-Native Streaming Ingestion with Apache Iggy",
and the Search 4.1 summary reads "Apache Doris 4.1 uses `search()` …".
Authors follow the original posts and the existing `Company · Name`
convention.
### 3. Render the remaining external-link stubs as MDX
28 external-link stubs were still `.md`. `markdown.format` is `detect`,
so those files were parsed as CommonMark: their two `import` lines
rendered as literal body text on the post page, and the `see more` link
never rendered at all. Renaming them to `.mdx` fixes both.
Before / after, on
`/blog/how-stepfun-built-agent-observability-platform-with-apache-doris`:
```
import { BlogLink } from '../src/components/blogs/components/blog-link';
import { SeeMore } from '../src/components/blogs/components/see-more';
StepFun built StepTrace, a PB-scale agent observability platform ...
<- no link
```
```
StepFun built StepTrace, a PB-scale agent observability platform ...see
more -> velodb.io/blog/...
```
The file extension is not part of the slug, so every URL is unchanged.
Full-content `.md` posts that merely carry an `externalLink` render
correctly as CommonMark and are left alone; converting them would risk
MDX compile failures on their raw HTML.
### Validation
Local dev server (`SKIP_DOCS=true SKIP_COMMUNITY=true SKIP_RELEASES=true
SKIP_COURSE=true SKIP_SEARCH=true yarn start`):
- compiles with no errors or warnings;
- all 76 external-link stub pages render without literal `import` text
and with a working outbound link;
- `/blog` shows `Total 200 items`, no broken images, no console errors;
- 207 blog routes generated, unchanged by the renames.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01K1oeAcA8WQ3XKYeNxLDKbW
---------
Co-authored-by: morningman <[email protected]>
Co-authored-by: Claude Fable 5 <[email protected]>
---
blog/{HTAP-pg-doris.md => HTAP-pg-doris.mdx} | 0
...eberg-v3.md => apache-doris-4-1-iceberg-v3.mdx} | 0
...-disk.md => apache-doris-4-1-spill-to-disk.mdx} | 0
...e-doris-and-polaris-per-user-identity-mode.mdx} | 0
...che-doris-min-io.md => apache-doris-min-io.mdx} | 0
...n-udf-calling-the-python-ecosystem-from-sql.mdx | 16 ++
...native-streaming-ingestion-with-apache-iggy.mdx | 14 ++
...mark-apache-doris-vs-clickhouse-and-duckdb.mdx} | 2 -
...md => autonomous-driving-multimodal-search.mdx} | 0
...case.md => bytedance-hybrid-search-usecase.mdx} | 0
...cookbook.md => chunking-embedding-cookbook.mdx} | 0
...-and-ltap-oltp-olap-real-time-olap-and-htap.mdx | 14 ++
blog/dbt-for-apache-doris-1.1.0-five-demos.md | 189 +++++++++++++++++++++
...d-search.md => doris4-native-hybrid-search.mdx} | 0
...ris-clickhouse-elasticsearch-and-opensearch.mdx | 16 ++
...ckhouse-elasticsearch-to-apache-doris-kwai.mdx} | 0
...los.md => from-data-silos-to-context-silos.mdx} | 0
...-doris-tuhu-cars-unified-olap-architecture.mdx} | 2 -
...de-a-b-testing-metrics-145x-faster-at-scale.mdx | 16 ++
...lidated-its-analytics-stack-on-apache-doris.mdx | 14 ++
...t-observability-platform-with-apache-doris.mdx} | 2 -
...t-production-vector-search-in-apache-doris.mdx} | 2 -
...dex-deepdive.md => inverted-index-deepdive.mdx} | 0
...riant-and-inverted-indexes-in-apache-doris.mdx} | 0
...mexican-mining-giant-azure-to-apache-doris.mdx} | 0
...d => netease-games-unified-doris-lakehouse.mdx} | 0
...rg-and-doris.md => olake-iceberg-and-doris.mdx} | 0
...doris-real-time-sync-with-one-sql-statement.mdx | 16 ++
...apache-doris.md => puppygraph-apache-doris.mdx} | 0
...text-log-search-and-real-time-sql-analytics.mdx | 14 ++
...-202601.md => variant-tech-deepdive-202601.mdx} | 0
blog/{web3-doris-flink.md => web3-doris-flink.mdx} | 0
...{web3-doris-paimon.md => web3-doris-paimon.mdx} | 0
...s.md => when-to-scale-postgresql-analytics.mdx} | 0
...need-real-time-analytics-and-hybrid-search.mdx} | 0
...pache-doris.md => xanhsm-with-apache-doris.mdx} | 0
...ified-usecase.md => xiaomi-unified-usecase.mdx} | 0
src/components/recent-blogs/recent-blogs.data.ts | 16 +-
src/constant/newsletter.data.ts | 38 ++---
static/images/blogs/202607_Iggy_horizontal.jpeg | Bin 0 -> 126209 bytes
static/images/blogs/202607_LTAP_horizontal.jpeg | Bin 0 -> 130040 bytes
static/images/blogs/202607_Meituan_horizontal.jpeg | Bin 0 -> 111917 bytes
.../blogs/202607_Search_Doris41_horizontal.jpeg | Bin 0 -> 120136 bytes
.../images/blogs/202608_Kwai_spark_horizontal.jpeg | Bin 0 -> 143349 bytes
static/images/blogs/202608_PG_CDC_horizontal.jpeg | Bin 0 -> 111357 bytes
.../images/blogs/202608_Python_UDF_horizontal.jpeg | Bin 0 -> 117240 bytes
.../blogs/202608_dynamic_json_horizontal.jpeg | Bin 0 -> 163495 bytes
.../cover.png | Bin 0 -> 263391 bytes
.../demo01-daily-order-summary-flow.jpg | Bin 0 -> 309919 bytes
.../demo04-late-arriving-orders-flow.jpg | Bin 0 -> 307112 bytes
50 files changed, 336 insertions(+), 35 deletions(-)
diff --git a/blog/HTAP-pg-doris.md b/blog/HTAP-pg-doris.mdx
similarity index 100%
rename from blog/HTAP-pg-doris.md
rename to blog/HTAP-pg-doris.mdx
diff --git a/blog/apache-doris-4-1-iceberg-v3.md
b/blog/apache-doris-4-1-iceberg-v3.mdx
similarity index 100%
rename from blog/apache-doris-4-1-iceberg-v3.md
rename to blog/apache-doris-4-1-iceberg-v3.mdx
diff --git a/blog/apache-doris-4-1-spill-to-disk.md
b/blog/apache-doris-4-1-spill-to-disk.mdx
similarity index 100%
rename from blog/apache-doris-4-1-spill-to-disk.md
rename to blog/apache-doris-4-1-spill-to-disk.mdx
diff --git a/blog/apache-doris-and-polaris-per-user-identity-mode.md
b/blog/apache-doris-and-polaris-per-user-identity-mode.mdx
similarity index 100%
rename from blog/apache-doris-and-polaris-per-user-identity-mode.md
rename to blog/apache-doris-and-polaris-per-user-identity-mode.mdx
diff --git a/blog/apache-doris-min-io.md b/blog/apache-doris-min-io.mdx
similarity index 100%
rename from blog/apache-doris-min-io.md
rename to blog/apache-doris-min-io.mdx
diff --git
a/blog/apache-doris-python-udf-calling-the-python-ecosystem-from-sql.mdx
b/blog/apache-doris-python-udf-calling-the-python-ecosystem-from-sql.mdx
new file mode 100644
index 00000000000..a3ac17e9ce9
--- /dev/null
+++ b/blog/apache-doris-python-udf-calling-the-python-ecosystem-from-sql.mdx
@@ -0,0 +1,16 @@
+---
+ 'title': 'Apache Doris Python UDF: Calling the Python Ecosystem from SQL
for Agent-Era'
+ 'summary': 'Apache Doris adds Python UDF in 4.1.3. This enables teams to
create and call Python functions directly in SQL, bringing Pandas, PyArrow, and
the rest of the Python ecosystem into the Doris query path.'
+ 'description': 'Apache Doris adds Python UDF in 4.1.3. This enables teams
to create and call Python functions directly in SQL, bringing Pandas, PyArrow,
and the rest of the Python ecosystem into the Doris query path.'
+ 'picked': "true"
+ 'order': "4"
+ 'date': '2026-8-6'
+ 'author': 'velodb.io · Haopeng Li & Zhenqi Lin'
+ 'externalLink':
'https://www.velodb.io/blog/apache-doris-python-udf-calling-the-python-from-sql-for-agent-era'
+ 'tags': ['Tech Sharing']
+ "image": '/images/blogs/202608_Python_UDF_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank'
href='https://www.velodb.io/blog/apache-doris-python-udf-calling-the-python-from-sql-for-agent-era'>Apache
Doris adds Python UDF in 4.1.3. This enables teams to create and call Python
functions directly in SQL, bringing Pandas, PyArrow, and the rest of the Python
ecosystem into the Doris query path. <SeeMore /></BlogLink>
diff --git
a/blog/apache-doris-rust-native-streaming-ingestion-with-apache-iggy.mdx
b/blog/apache-doris-rust-native-streaming-ingestion-with-apache-iggy.mdx
new file mode 100644
index 00000000000..e2dda797d10
--- /dev/null
+++ b/blog/apache-doris-rust-native-streaming-ingestion-with-apache-iggy.mdx
@@ -0,0 +1,14 @@
+---
+ 'title': 'Apache Doris Gets Rust-Native Streaming Ingestion with Apache
Iggy'
+ 'summary': 'Apache Doris now supports Rust-native streaming ingestion from
Apache Iggy through a new sink connector built with LaserData.'
+ 'description': 'Apache Doris now supports Rust-native streaming ingestion
from Apache Iggy through a new sink connector built with LaserData.'
+ 'date': '2026-7-17'
+ 'author': 'velodb.io · VeloDB Product Team & LaserData'
+ 'externalLink':
'https://www.velodb.io/blog/velodb-and-apache-doris-get-rust-native-streaming-ingestion-with-apache-iggy'
+ 'tags': ['Tech Sharing']
+ "image": '/images/blogs/202607_Iggy_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank'
href='https://www.velodb.io/blog/velodb-and-apache-doris-get-rust-native-streaming-ingestion-with-apache-iggy'>Apache
Doris now supports Rust-native streaming ingestion from Apache Iggy through a
new sink connector built with LaserData. <SeeMore /></BlogLink>
diff --git a/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb.md
b/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb.mdx
similarity index 96%
rename from blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb.md
rename to blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb.mdx
index 5beb0f89f2f..26f218b5d8d 100644
--- a/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb.md
+++ b/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb.mdx
@@ -2,8 +2,6 @@
'title': 'ASOF JOIN Benchmark: Apache Doris vs ClickHouse and DuckDB'
'summary': 'Apache Doris 4.1 outperforms ClickHouse and DuckDB on ASOF
JOIN across all 11 benchmark scenarios.'
'description': 'Apache Doris 4.1 outperforms ClickHouse and DuckDB on ASOF
JOIN across all 11 benchmark scenarios.'
- 'picked': "true"
- 'order': "3"
'date': '2026-6-11'
'author': 'velodb.io · Changle Zhao'
'externalLink':
'https://www.velodb.io/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb'
diff --git a/blog/autonomous-driving-multimodal-search.md
b/blog/autonomous-driving-multimodal-search.mdx
similarity index 100%
rename from blog/autonomous-driving-multimodal-search.md
rename to blog/autonomous-driving-multimodal-search.mdx
diff --git a/blog/bytedance-hybrid-search-usecase.md
b/blog/bytedance-hybrid-search-usecase.mdx
similarity index 100%
rename from blog/bytedance-hybrid-search-usecase.md
rename to blog/bytedance-hybrid-search-usecase.mdx
diff --git a/blog/chunking-embedding-cookbook.md
b/blog/chunking-embedding-cookbook.mdx
similarity index 100%
rename from blog/chunking-embedding-cookbook.md
rename to blog/chunking-embedding-cookbook.mdx
diff --git a/blog/databricks-rt-and-ltap-oltp-olap-real-time-olap-and-htap.mdx
b/blog/databricks-rt-and-ltap-oltp-olap-real-time-olap-and-htap.mdx
new file mode 100644
index 00000000000..0c91876ab4a
--- /dev/null
+++ b/blog/databricks-rt-and-ltap-oltp-olap-real-time-olap-and-htap.mdx
@@ -0,0 +1,14 @@
+---
+ 'title': 'Databricks RT and LTAP are here. How does it fit into OLTP,
OLAP, real-time OLAP, and HTAP'
+ 'summary': "Real-time database categories now span across OLTP, OLAP,
real-time OLAP, HTAP, and Databricks' new LTAP, but each makes different
trade-offs across freshness, query latency, concurrency, and updates."
+ 'description': "Real-time database categories now span across OLTP, OLAP,
real-time OLAP, HTAP, and Databricks' new LTAP, but each makes different
trade-offs across freshness, query latency, concurrency, and updates."
+ 'date': '2026-7-10'
+ 'author': 'velodb.io · Kevin Shen'
+ 'externalLink':
'https://www.velodb.io/blog/databricks-rt-and-ltap-are-here-how-does-it-fit-into-oltp-olap-real-time-olap-and-htap'
+ 'tags': ['Tech Sharing']
+ "image": '/images/blogs/202607_LTAP_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank'
href='https://www.velodb.io/blog/databricks-rt-and-ltap-are-here-how-does-it-fit-into-oltp-olap-real-time-olap-and-htap'>Real-time
database categories now span across OLTP, OLAP, real-time OLAP, HTAP, and
Databricks' new LTAP, but each makes different trade-offs across freshness,
query latency, concurrency, and updates. <SeeMore /></BlogLink>
diff --git a/blog/dbt-for-apache-doris-1.1.0-five-demos.md
b/blog/dbt-for-apache-doris-1.1.0-five-demos.md
new file mode 100644
index 00000000000..5553298a9a2
--- /dev/null
+++ b/blog/dbt-for-apache-doris-1.1.0-five-demos.md
@@ -0,0 +1,189 @@
+---
+title: 'dbt-for-apache-doris 1.1.0 Released: Five Business Demos to Get
Started with Doris Data Engineering'
+summary: 'dbt-for-apache-doris 1.1.0 targets dbt Core 1.12 and manages Apache
Doris asynchronous materialized views through the standard dbt
materialized_view. Five demos walk through the Doris + dbt workflow, from
source tables to tested result tables.'
+description: 'dbt-for-apache-doris 1.1.0 targets dbt Core 1.12, manages Apache
Doris asynchronous materialized views through the standard dbt
materialized_view, and covers Table, View, Incremental, Snapshot, Seed, and
Data Test workflows. Five business demos show how dbt and Apache Doris handle
daily order summaries, late-arriving orders, and more.'
+keywords:
+ - 'Apache Doris'
+ - 'dbt'
+ - 'dbt-for-apache-doris'
+ - 'dbt adapter'
+ - 'asynchronous materialized view'
+ - 'incremental model'
+ - 'data engineering'
+date: '2026-09-01'
+author: 'Junwei Chen'
+tags:
+ - 'Tech Sharing'
+image: '/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/cover.png'
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+[dbt-for-apache-doris](https://github.com/velodb/dbt-for-apache-doris) 1.1.0
was released on August 12, 2026. It targets dbt Core 1.12, manages Apache Doris
asynchronous materialized views through the standard dbt `materialized_view`
materialization, and covers the everyday workflows: Table, View, Incremental,
Snapshot, Seed, and Data Test.
+
+```bash
+python -m pip install "dbt-for-apache-doris==1.1.0"
+```
+
+The rest of this post covers what each of the two systems is responsible for,
what the adapter supports today, and five demos that run a full pipeline in
Doris.
+
+## 1. dbt, Doris, and what 1.1.0 adds
+
+### 1.1 What is dbt
+
+dbt (data build tool) is an open-source data transformation framework that
handles the T of ELT inside a data warehouse. Every model is a SQL `SELECT`
statement, and models reference each other with `ref()`. dbt compiles them into
the target database's table creation and write statements, runs them in
dependency order, and materializes each one as a table, view, incremental
table, or snapshot according to its configuration.
+
+It exists because the transformation layer spent years without much
engineering discipline:
+
+- SQL is scattered across schedulers, repos, and personal machines.
Dependencies are maintained by hand, and nobody can say for certain what a
change will break.
+- Nothing is tested automatically, so a wrong metric usually surfaces when
someone in the business questions a number on a report.
+- There is no version control, no code review, and no separation between
development and production, which makes changes hard to trace afterwards.
+- The same boilerplate for creating tables, writing incrementally, and keeping
history gets rewritten in every project.
+
+dbt's answer is models as code, a dependency graph derived from `ref()`,
declarative Data Tests, built-in materializations (Table, View, Incremental,
Snapshot), generated documentation and lineage, and a package ecosystem of
Jinja macros such as `dbt_utils`.
+
+### 1.2 What dbt and Doris solve together
+
+dbt does not compute anything itself. Every transformation is pushed down to
the target database, so that database sets the ceiling for the project. Apache
Doris is an MPP real-time analytical database that speaks the MySQL protocol
and runs aggregations, multi-table JOINs, and window functions in place.
`dbt-for-apache-doris` connects the two: dbt organizes, orchestrates, and
validates the transformation logic; Doris stores the data and executes the SQL.
+
+Putting them together settles a few things that data teams otherwise handle by
convention. Table conventions become part of the code, since Doris Key models,
partitions, buckets, and table properties are declared in the model's
`config()` and go through version control and code review with everything else,
rather than living in someone's memory. Late-arriving data gets a defined path
too: a write to a Doris Unique Key table is an Upsert, and dbt Incremental
`merge` sits directly on that [...]
+
+Pre-aggregation stops being a separate system. Doris asynchronous materialized
views join the dbt dependency graph through the standard `materialized_view`
materialization, with build and refresh strategy in the model configuration, so
they change and get tested alongside the models they read from. The computation
never leaves Doris. dbt only ships SQL, so no second engine is needed to move
data around. Quality checks run in the same place: Data Tests, Unit Tests, and
Model Contracts all [...]
+
+### 1.3 Adapter feature support
+
+1. **Materializations**
+
+ | Capability | Status | Current scope and boundaries |
+ |-|-|-|
+ | Table | ✅ | Duplicate Key CTAS; configurable HASH bucketing and bucket
count, RANGE / LIST partitioning, table properties, Contracts, docs, Grants,
and Hooks. Unique Key tables are created by Incremental `merge` |
+ | View | ✅ | Standard lifecycle, Contracts, docs, Grants, and Hooks;
switching relation types is not zero-downtime |
+ | Incremental | ✅ | Four strategies, `append`, `merge`, `insert_overwrite`,
and `microbatch`, plus every `on_schema_change` mode (strategy details in the
next table) |
+ | Snapshot | ✅ | `check` / `timestamp` strategies, hard-delete handling,
schema evolution, atomic replacement and recovery; jobs targeting the same
relation must be serialized by the scheduler |
+ | Materialized view | ✅ | Standard dbt `materialized_view`, implemented as
a Doris Async MV; covers the build / refresh lifecycle, task waiting,
configuration changes, atomic replacement and recovery; dbt jobs targeting the
same relation must be serialized |
+ | Seed | ✅ | CSV loading, type inference, `column_types`, and `ref()` |
+ | Ephemeral | ✅ | Compiled and inlined by dbt Core |
+2. **Incremental strategies and Doris target tables**. When no strategy is
specified explicitly, models configured with a `unique_key` use `merge` and all
others use `append`.
+
+ | Strategy | Doris target table | Behavior |
+ |-|-|-|
+ | `append` | Duplicate Key table | Appends rows with `INSERT INTO` |
+ | `merge` | Unique Key table (MoW or MoR) | Full-row `INSERT INTO` Upsert
based on Unique Key semantics; requires `unique_key`, does not generate `MERGE
INTO` |
+ | `insert_overwrite` | Any writable Doris table | `INSERT OVERWRITE` of the
whole table, specified partitions, or dynamic partitions; does not accept
`unique_key` |
+ | `microbatch` | Duplicate Key table with exact RANGE partitions | Each dbt
time window overwrites one named partition; supports hour / day / month / year
windows, and batches run serially |
+3. **dbt engineering capabilities**
+
+ | Capability | Status | Current scope and boundaries |
+ |-|-|-|
+ | Sources and freshness | ✅ | `loaded_at_field`, filter, and
`loaded_at_query`; cross-database access is implemented as database-as-schema,
not through an External Catalog |
+ | Data Test | ✅ | Singular, Generic, and Ephemeral tests, plus
`store_failures` |
+ | Unit Test | ✅ | Inline and CSV fixtures, case-insensitive column names,
invalid-input validation, reserved-word quoting, and data type fixtures adapted
to Doris |
+ | Model Contract | ✅ | Column name and type constraints for Table, View,
and Incremental; not mapped to database primary keys or NOT NULL constraints |
+ | Persisted docs | ✅ | Table / column comments for Table, View,
Incremental, Snapshot, Seed, and Async MV; updating a View comment, or a
comment that contains both kinds of quotes, may require a rebuild or full
refresh |
+ | Grants | ✅ | Reconciles Doris table-level privileges for Table, View,
Incremental, Seed, Snapshot, and Async MV, supporting `user` and `user@host`
grantees; role grantees are not handled |
+ | Hooks | ✅ | pre-hook and post-hook for every materialization; Doris does
not provide transactional rollback for hook side effects |
+ | Metadata and dbt docs catalog | ✅ | Relation discovery and documentation
catalog for Doris databases, tables, views, columns, comments, and Async MVs |
+ | Cross-database Sources | ✅ | References Sources in other Doris databases,
including definitions that only declare a database; three-part External Catalog
names are not supported |
+
+### 1.4 What's new in 1.1.0
+
+1.1.0 is the first release of `dbt-for-apache-doris` from its own repository,
and the first published to PyPI. It targets dbt Core 1.12 on Python 3.10 and
above, manages Doris Async Materialized Views through the standard dbt
`materialized_view` materialization, and ships with explicit version
constraints and a stated support boundary.
+
+A `materialized_view` model maps to a Doris Async MV, and the build mode,
refresh strategy, and task waiting are all written in the model configuration:
+
+```sql
+{{ config(
+ materialized='materialized_view',
+ refresh_trigger='manual',
+ wait_for_refresh=true
+) }}
+
+select order_date, sum(amount) as sales
+from {{ ref('orders') }}
+group by order_date
+```
+
+## 2. Five demos
+
+Each demo starts from a business question:
+
+| # | Demo | Business question | Transformation and result | Key capabilities |
+|-|-|-|-|-|
+| 01 | Daily order summary | How many valid orders and how much revenue per
day and per month? | Filter out cancelled, returned, and failed orders; produce
a daily Table and a monthly Async MV | Source, Table, Data Test, partitioning
and bucketing, Async MV |
+| 02 | Customer geography analysis | Which states are customers, orders, and
revenue concentrated in? | Read addresses and orders from two Doris databases;
output state-level business metrics | Cross-database Source, View, `ref()`,
Table |
+| 03 | Ad data integration | How to unify Google, Meta, and TikTok data? |
Load three kinds of CSV with Seeds, align fields, and deduplicate; output daily
channel details | Seed, `dbt_utils`, `QUALIFY`, Data Test |
+| 04 | Late-arriving orders | How to absorb late corrections and avoid
duplicate orders? | Identify order versions and maintain the current state with
Incremental `merge` | Incremental, Unique Key, idempotency |
+| 05 | Customer history tracking | How to keep the history of attribute
changes and hard deletes? | Two Snapshot rounds produce SCD Type 2 history and
a current customer dimension table | Snapshot, Hard Delete, `ref()`, Data Test |
+
+> The demos are selected and adapted from the Snowflake Labs
[`data-eng-bench`](https://github.com/Snowflake-Labs/data-eng-bench) scenarios
(the original project is licensed under the Apache License 2.0). We rewrote the
profiles, SQL, fixtures, verifiers, and notebooks for Apache Doris and
`dbt-for-apache-doris`.
+>
+> Demo repository:
[https://github.com/velodb/dbt-for-apache-doris/tree/main/examples](https://github.com/velodb/dbt-for-apache-doris/tree/main/examples)
+
+Two of them are walked through below. For the other three, customer geography
analysis, ad data integration, and customer history tracking, the [Doris dbt
demos
README](https://github.com/velodb/dbt-for-apache-doris/tree/main/examples/doris-demos)
has the business description, the model list, and the exact commands.
+
+### 2.1 Demo 01: Order summary and asynchronous materialized views
+
+The demo starts from 6 orders in Doris, drops the `CANCELLED`, `RETURNED`, and
`FAILED` ones, and builds `daily_order_summary`. Data Tests check that dates
are unique and key columns are not null, and `monthly_order_summary_mv` then
aggregates the daily table through `ref()`.
+
+
+
+*Figure 1: The chain from raw orders to the monthly asynchronous materialized
view. The top row is what dbt handles: model dependencies, materialization, and
tests. The bottom row is what Doris provides for the table model and the
materialized view.*
+
+Three orders survive the filter, for a monthly revenue of `220.20`. dbt owns
the model dependencies (`source()` through `ref()`), the materializations, and
the Data Tests. Doris decides how the two result tables are stored and how fast
they answer:
+
+| Doris capability | What it does here |
+|-|-|
+| Duplicate Key model | `daily_order_summary` is created with `order_date` as
its sort key. Rows are stored as written, with no aggregation or merging. Date
range queries use the prefix index, so daily report queries hit it directly.
dbt `table` rebuilds the whole table with CTAS on every run, so the result is
reproducible |
+| RANGE partitioning (by `order_date`) | The model pre-creates the `p202608`
partition and the catch-all `pmax` partition through `partition_by_init`. A
monthly query scans one partition, and old data can be archived or dropped by
month |
+| HASH bucketing (by `order_date`) | Data is distributed across BE nodes by
the bucket key and computed in parallel. The demo runs on a single node with 1
bucket; production raises the bucket count as data grows |
+| Asynchronous materialized view (Async MV) | `monthly_order_summary_mv`
pre-aggregates on top of the daily table, so the monthly dashboard reads
precomputed results and does not re-aggregate on every open.
`build_mode='immediate'` produces data as soon as the view is built,
`refresh_method='auto'` lets Doris choose between a full refresh and a
partition-level one, and `refresh_trigger='manual'` makes each dbt run trigger
a refresh and wait for it; a scheduled refresh (`schedule`) or a r [...]
+
+### 2.2 Demo 04: Incremental updates for late-arriving orders
+
+The demo writes orders 101, 102, and 103, then receives two late events: the
amount of order 101 is corrected from `100.00` to `125.00`, and a new order 104
arrives.
+
+Two steps absorb them:
+
+1. `order_version_history` uses window functions to identify the current
version of each order.
+2. `incremental_daily_sales` takes `order_id` as its business key and runs
Incremental `merge` on top of the Upsert semantics of the Doris Unique Key
model.
+
+
+
+*Figure 2: Late events reach the source table, then version identification and
Incremental `merge` update the current orders; a re-run with no new data leaves
the result alone. The top row is what dbt handles, the bottom row is what Doris
provides.*
+
+Run it again with no new data and nothing moves. `incremental_daily_sales`
holds 4 orders, order 101 now at `125.00`, and revenue for August 1 in the
downstream `daily_sales_summary` becomes `245.00`. The same project also builds
data quality, arrival latency, and revenue reconciliation models. dbt's part is
the incremental model definition, the `is_incremental()` filter, and the
uniqueness test on `order_id`. The "no duplicates, safe to re-run" property
comes from Doris:
+
+| Doris capability | What it does here |
+|-|-|
+| Unique Key model | `incremental_daily_sales` is created with `order_id` as
its Unique Key. A new version of an order overwrites the old one on write, so
the table always holds exactly one row per order and the `unique` test passes.
The adapter enables Merge-on-Write by default, so deduplication happens at
write time and queries have nothing left to merge |
+| Upsert on write (Incremental `merge`) | The adapter performs a full-row
Upsert with a plain `INSERT INTO`, with no `MERGE INTO` and no
delete-then-insert. The correction to order 101 and the new order 104 take the
same write path, and re-running with no new data leaves the result unchanged,
which is what makes backfills and retries safe |
+| HASH bucketing (by `order_id`) | The bucket key matches the primary key, so
every version of an order lands in the same tablet, and primary key
deduplication and updates complete inside it without comparing across nodes |
+| Window functions | `order_version_history` uses `row_number()` and `lead()`
inside Doris to mark the current version of each order and compute `valid_from`
/ `valid_to`. The version history is auditable, and no external program is
involved |
+| Online schema change | The model sets
`on_schema_change='append_new_columns'`. When an upstream model adds a column,
the adapter syncs the table structure with `ALTER TABLE ... ADD COLUMN` and
waits for the change to finish, so the incremental table never needs a rebuild |
+
+All five demos run as JupyterLab notebooks, one step per cell, so you can stop
at any cell and look at what Doris wrote. They live in the repository's
`examples/` directory, with
[`examples/doris-demos`](https://github.com/velodb/dbt-for-apache-doris/tree/main/examples/doris-demos)
as the entry point; its README has the full run instructions.
+
+## Links
+
+- GitHub repository:
[https://github.com/velodb/dbt-for-apache-doris](https://github.com/velodb/dbt-for-apache-doris)
+- 1.1.0 release:
[https://github.com/velodb/dbt-for-apache-doris/releases/tag/v1.1.0](https://github.com/velodb/dbt-for-apache-doris/releases/tag/v1.1.0)
+- PyPI:
[https://pypi.org/project/dbt-for-apache-doris/1.1.0/](https://pypi.org/project/dbt-for-apache-doris/1.1.0/)
+- Demo entry point:
[https://github.com/velodb/dbt-for-apache-doris/tree/main/examples/doris-demos](https://github.com/velodb/dbt-for-apache-doris/tree/main/examples/doris-demos)
+- Apache Doris all-in-one image:
[https://doris.apache.org/community/developer-guide/all-in-one-image](https://doris.apache.org/community/developer-guide/all-in-one-image)
diff --git a/blog/doris4-native-hybrid-search.md
b/blog/doris4-native-hybrid-search.mdx
similarity index 100%
rename from blog/doris4-native-hybrid-search.md
rename to blog/doris4-native-hybrid-search.mdx
diff --git
a/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch.mdx
b/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch.mdx
new file mode 100644
index 00000000000..c5405a52181
--- /dev/null
+++
b/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch.mdx
@@ -0,0 +1,16 @@
+---
+ 'title': 'Dynamic JSON in Agent Workloads: Apache Doris vs ClickHouse,
Elasticsearch, and OpenSearch'
+ 'summary': 'AI agent logs create wide, fast-changing JSON payloads that
are difficult to analyze with predictable latency. We compare how Apache Doris,
ClickHouse, Elasticsearch, and OpenSearch perform in such scenario.'
+ 'description': 'AI agent logs create wide, fast-changing JSON payloads
that are difficult to analyze with predictable latency. We compare how Apache
Doris, ClickHouse, Elasticsearch, and OpenSearch perform in such scenario.'
+ 'picked': "true"
+ 'order': "1"
+ 'date': '2026-8-27'
+ 'author': 'velodb.io · Max Li'
+ 'externalLink':
'https://www.velodb.io/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch'
+ 'tags': ['Tech Sharing']
+ "image": '/images/blogs/202608_dynamic_json_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank'
href='https://www.velodb.io/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch'>AI
agent logs create wide, fast-changing JSON payloads that are difficult to
analyze with predictable latency. We compare how Apache Doris, ClickHouse,
Elasticsearch, and OpenSearch perform in such scenario. <SeeMore /></BlogLink>
diff --git a/blog/from-clickhouse-elasticsearch-to-apache-doris-kwai.md
b/blog/from-clickhouse-elasticsearch-to-apache-doris-kwai.mdx
similarity index 100%
rename from blog/from-clickhouse-elasticsearch-to-apache-doris-kwai.md
rename to blog/from-clickhouse-elasticsearch-to-apache-doris-kwai.mdx
diff --git a/blog/from-data-silos-to-context-silos.md
b/blog/from-data-silos-to-context-silos.mdx
similarity index 100%
rename from blog/from-data-silos-to-context-silos.md
rename to blog/from-data-silos-to-context-silos.mdx
diff --git
a/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture.md
b/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture.mdx
similarity index 97%
rename from
blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture.md
rename to
blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture.mdx
index 57a79a96b71..2993b5b23ce 100644
---
a/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture.md
+++
b/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture.mdx
@@ -2,8 +2,6 @@
'title': "From Hive, HBase, MySQL, and Trino to Apache Doris: Tuhu Car's
Unified OLAP Architecture"
'summary': 'Tuhu Car rebuilt its fragmented Hive, HBase, MySQL, and Trino
OLAP stack with Apache Doris, improving audience segmentation, user profiling,
BI analysis, and real-time analytics.'
'description': 'Tuhu Car rebuilt its fragmented Hive, HBase, MySQL, and
Trino OLAP stack with Apache Doris, improving audience segmentation, user
profiling, BI analysis, and real-time analytics.'
- 'picked': "true"
- 'order': "2"
'date': '2026-7-3'
'author': 'Tuhu Car · Wenbo Wang'
'externalLink':
'https://www.velodb.io/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture'
diff --git
a/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale.mdx
b/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale.mdx
new file mode 100644
index 00000000000..11be348410f
--- /dev/null
+++
b/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale.mdx
@@ -0,0 +1,16 @@
+---
+ 'title': 'From Spark to Apache Doris: How Kwai Made A/B Testing Metrics
145x Faster at Scale'
+ 'summary': 'Kwai migrated its company-wide A/B testing metrics pipeline
from Spark to Apache Doris. The rebuild delivered 145x faster metrics
computation and cut resource consumption by 72%.'
+ 'description': 'Kwai migrated its company-wide A/B testing metrics
pipeline from Spark to Apache Doris. The rebuild delivered 145x faster metrics
computation and cut resource consumption by 72%.'
+ 'picked': "true"
+ 'order': "3"
+ 'date': '2026-8-12'
+ 'author': 'Kwai · Siwei Zeng'
+ 'externalLink':
'https://www.velodb.io/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale'
+ 'tags': ['Best Practice']
+ "image": '/images/blogs/202608_Kwai_spark_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank'
href='https://www.velodb.io/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale'>Kwai
migrated its company-wide A/B testing metrics pipeline from Spark to Apache
Doris. The rebuild delivered 145x faster metrics computation and cut resource
consumption by 72%. <SeeMore /></BlogLink>
diff --git
a/blog/how-meituan-consolidated-its-analytics-stack-on-apache-doris.mdx
b/blog/how-meituan-consolidated-its-analytics-stack-on-apache-doris.mdx
new file mode 100644
index 00000000000..1c7bae1ea1e
--- /dev/null
+++ b/blog/how-meituan-consolidated-its-analytics-stack-on-apache-doris.mdx
@@ -0,0 +1,14 @@
+---
+ 'title': 'How Meituan Consolidated Its Analytics Stack on Apache Doris'
+ 'summary': 'Meituan replaced a multi-engine analytics stack of Hadoop,
Kylin, and Druid with a single Apache Doris platform spanning 300+ clusters and
tens of PB of data.'
+ 'description': 'Meituan replaced a multi-engine analytics stack of Hadoop,
Kylin, and Druid with a single Apache Doris platform spanning 300+ clusters and
tens of PB of data.'
+ 'date': '2026-7-31'
+ 'author': 'Apache Doris'
+ 'externalLink':
'https://www.velodb.io/blog/how-meituan-consolidated-its-analytics-stack-on-apache-doris'
+ 'tags': ['Best Practice']
+ "image": '/images/blogs/202607_Meituan_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank'
href='https://www.velodb.io/blog/how-meituan-consolidated-its-analytics-stack-on-apache-doris'>Meituan
replaced a multi-engine analytics stack of Hadoop, Kylin, and Druid with a
single Apache Doris platform spanning 300+ clusters and tens of PB of data.
<SeeMore /></BlogLink>
diff --git
a/blog/how-stepfun-built-agent-observability-platform-with-apache-doris.md
b/blog/how-stepfun-built-agent-observability-platform-with-apache-doris.mdx
similarity index 97%
rename from
blog/how-stepfun-built-agent-observability-platform-with-apache-doris.md
rename to
blog/how-stepfun-built-agent-observability-platform-with-apache-doris.mdx
index 01e06ba7f82..32d124b6d7d 100644
--- a/blog/how-stepfun-built-agent-observability-platform-with-apache-doris.md
+++ b/blog/how-stepfun-built-agent-observability-platform-with-apache-doris.mdx
@@ -2,8 +2,6 @@
'title': 'How StepFun Built a PB-Scale Agent Observability Platform with
Apache Doris'
'summary': 'StepFun built StepTrace, a PB-scale agent observability
platform on Apache Doris, to analyze agent traces, costs, search, evaluation
loops, and infrastructure behavior in real time.'
'description': 'StepFun built StepTrace, a PB-scale agent observability
platform on Apache Doris, to analyze agent traces, costs, search, evaluation
loops, and infrastructure behavior in real time.'
- 'picked': "true"
- 'order': "1"
'date': '2026-7-8'
'author': 'StepFun · Ric Li'
'externalLink':
'https://www.velodb.io/blog/how-stepfun-built-agent-observability-platform-with-apache-doris'
diff --git a/blog/how-we-built-production-vector-search-in-apache-doris.md
b/blog/how-we-built-production-vector-search-in-apache-doris.mdx
similarity index 96%
rename from blog/how-we-built-production-vector-search-in-apache-doris.md
rename to blog/how-we-built-production-vector-search-in-apache-doris.mdx
index 83d4d846b25..a1d400092f1 100644
--- a/blog/how-we-built-production-vector-search-in-apache-doris.md
+++ b/blog/how-we-built-production-vector-search-in-apache-doris.mdx
@@ -2,8 +2,6 @@
'title': 'How We Built Production Vector Search in Apache Doris'
'summary': 'Apache Doris 4.1 adds more native ANN vector indexes, IVF and
IVF_ON_DISK, directly inside its OLAP engine, reaching 900 QPS at 97% recall on
VectorDBBench.'
'description': 'Apache Doris 4.1 adds more native ANN vector indexes, IVF
and IVF_ON_DISK, directly inside its OLAP engine, reaching 900 QPS at 97%
recall on VectorDBBench.'
- 'picked': "true"
- 'order': "4"
'date': '2026-5-28'
'author': 'velodb.io · Rayner Chen'
'externalLink':
'https://www.velodb.io/blog/how-we-built-production-vector-search-in-apache-doris'
diff --git a/blog/inverted-index-deepdive.md b/blog/inverted-index-deepdive.mdx
similarity index 100%
rename from blog/inverted-index-deepdive.md
rename to blog/inverted-index-deepdive.mdx
diff --git
a/blog/json-in-agent-observability-variant-and-inverted-indexes-in-apache-doris.md
b/blog/json-in-agent-observability-variant-and-inverted-indexes-in-apache-doris.mdx
similarity index 100%
rename from
blog/json-in-agent-observability-variant-and-inverted-indexes-in-apache-doris.md
rename to
blog/json-in-agent-observability-variant-and-inverted-indexes-in-apache-doris.mdx
diff --git a/blog/mexican-mining-giant-azure-to-apache-doris.md
b/blog/mexican-mining-giant-azure-to-apache-doris.mdx
similarity index 100%
rename from blog/mexican-mining-giant-azure-to-apache-doris.md
rename to blog/mexican-mining-giant-azure-to-apache-doris.mdx
diff --git a/blog/netease-games-unified-doris-lakehouse.md
b/blog/netease-games-unified-doris-lakehouse.mdx
similarity index 100%
rename from blog/netease-games-unified-doris-lakehouse.md
rename to blog/netease-games-unified-doris-lakehouse.mdx
diff --git a/blog/olake-iceberg-and-doris.md b/blog/olake-iceberg-and-doris.mdx
similarity index 100%
rename from blog/olake-iceberg-and-doris.md
rename to blog/olake-iceberg-and-doris.mdx
diff --git
a/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement.mdx
b/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement.mdx
new file mode 100644
index 00000000000..a88b5aed534
--- /dev/null
+++
b/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement.mdx
@@ -0,0 +1,16 @@
+---
+ 'title': 'PostgreSQL CDC to Apache Doris: Real-Time Sync with One SQL
Statement'
+ 'summary': 'Apache Doris offers native CDC for PostgreSQL, replacing
separate CDC, Kafka, Flink, or Spark components with one built-in streaming
job.'
+ 'description': 'Apache Doris offers native CDC for PostgreSQL, replacing
separate CDC, Kafka, Flink, or Spark components with one built-in streaming
job.'
+ 'picked': "true"
+ 'order': "2"
+ 'date': '2026-8-21'
+ 'author': 'velodb.io · Dylan Wu'
+ 'externalLink':
'https://www.velodb.io/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement'
+ 'tags': ['Tech Sharing']
+ "image": '/images/blogs/202608_PG_CDC_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank'
href='https://www.velodb.io/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement'>Apache
Doris offers native CDC for PostgreSQL, replacing separate CDC, Kafka, Flink,
or Spark components with one built-in streaming job. <SeeMore /></BlogLink>
diff --git a/blog/puppygraph-apache-doris.md b/blog/puppygraph-apache-doris.mdx
similarity index 100%
rename from blog/puppygraph-apache-doris.md
rename to blog/puppygraph-apache-doris.mdx
diff --git
a/blog/search-in-apache-doris-4-1-unifying-full-text-log-search-and-real-time-sql-analytics.mdx
b/blog/search-in-apache-doris-4-1-unifying-full-text-log-search-and-real-time-sql-analytics.mdx
new file mode 100644
index 00000000000..3643df97c63
--- /dev/null
+++
b/blog/search-in-apache-doris-4-1-unifying-full-text-log-search-and-real-time-sql-analytics.mdx
@@ -0,0 +1,14 @@
+---
+ 'title': 'Search in Apache Doris 4.1: Unifying Full-Text Log Search and
Real-Time SQL Analytics'
+ 'summary': 'Apache Doris 4.1 uses search(), inverted indexes, BM25
scoring, and standard SQL to unify full-text log search with real-time
analytics for observability, SIEM, and product search workloads.'
+ 'description': 'Apache Doris 4.1 uses search(), inverted indexes, BM25
scoring, and standard SQL to unify full-text log search with real-time
analytics for observability, SIEM, and product search workloads.'
+ 'date': '2026-7-24'
+ 'author': 'velodb.io · Tom Zhang'
+ 'externalLink':
'https://www.velodb.io/blog/search-in-apache-doris-4-1-unifying-full-text-log-search-and-real-time-sql-analytics'
+ 'tags': ['Tech Sharing']
+ "image": '/images/blogs/202607_Search_Doris41_horizontal.jpeg'
+---
+import { BlogLink } from '../src/components/blogs/components/blog-link';
+import { SeeMore } from '../src/components/blogs/components/see-more';
+
+> <BlogLink rel="noopener noreferrer" target='_blank'
href='https://www.velodb.io/blog/search-in-apache-doris-4-1-unifying-full-text-log-search-and-real-time-sql-analytics'>Apache
Doris 4.1 uses search(), inverted indexes, BM25 scoring, and standard SQL to
unify full-text log search with real-time analytics for observability, SIEM,
and product search workloads. <SeeMore /></BlogLink>
diff --git a/blog/variant-tech-deepdive-202601.md
b/blog/variant-tech-deepdive-202601.mdx
similarity index 100%
rename from blog/variant-tech-deepdive-202601.md
rename to blog/variant-tech-deepdive-202601.mdx
diff --git a/blog/web3-doris-flink.md b/blog/web3-doris-flink.mdx
similarity index 100%
rename from blog/web3-doris-flink.md
rename to blog/web3-doris-flink.mdx
diff --git a/blog/web3-doris-paimon.md b/blog/web3-doris-paimon.mdx
similarity index 100%
rename from blog/web3-doris-paimon.md
rename to blog/web3-doris-paimon.mdx
diff --git a/blog/when-to-scale-postgresql-analytics.md
b/blog/when-to-scale-postgresql-analytics.mdx
similarity index 100%
rename from blog/when-to-scale-postgresql-analytics.md
rename to blog/when-to-scale-postgresql-analytics.mdx
diff --git a/blog/why-ai-agents-need-real-time-analytics-and-hybrid-search.md
b/blog/why-ai-agents-need-real-time-analytics-and-hybrid-search.mdx
similarity index 100%
rename from blog/why-ai-agents-need-real-time-analytics-and-hybrid-search.md
rename to blog/why-ai-agents-need-real-time-analytics-and-hybrid-search.mdx
diff --git a/blog/xanhsm-with-apache-doris.md
b/blog/xanhsm-with-apache-doris.mdx
similarity index 100%
rename from blog/xanhsm-with-apache-doris.md
rename to blog/xanhsm-with-apache-doris.mdx
diff --git a/blog/xiaomi-unified-usecase.md b/blog/xiaomi-unified-usecase.mdx
similarity index 100%
rename from blog/xiaomi-unified-usecase.md
rename to blog/xiaomi-unified-usecase.mdx
diff --git a/src/components/recent-blogs/recent-blogs.data.ts
b/src/components/recent-blogs/recent-blogs.data.ts
index 1a1f369ab6a..c8d1f21ed58 100644
--- a/src/components/recent-blogs/recent-blogs.data.ts
+++ b/src/components/recent-blogs/recent-blogs.data.ts
@@ -1,19 +1,19 @@
export const RECENT_BLOGS_POSTS = [
{
- label: 'How StepFun Built a PB-Scale Agent Observability Platform with
Apache Doris',
- link:
'https://www.velodb.io/blog/how-stepfun-built-agent-observability-platform-with-apache-doris',
+ label: 'Dynamic JSON in Agent Workloads: Apache Doris vs ClickHouse,
Elasticsearch, and OpenSearch',
+ link:
'https://www.velodb.io/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch',
},
{
- label: "From Hive, HBase, MySQL, and Trino to Apache Doris: Tuhu Car's
Unified OLAP Architecture",
- link:
'https://www.velodb.io/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture',
+ label: 'PostgreSQL CDC to Apache Doris: Real-Time Sync with One SQL
Statement',
+ link:
'https://www.velodb.io/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement',
},
{
- label: 'ASOF JOIN Benchmark: Apache Doris vs ClickHouse and DuckDB',
- link:
'https://www.velodb.io/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb',
+ label: 'From Spark to Apache Doris: How Kwai Made A/B Testing Metrics
145x Faster at Scale',
+ link:
'https://www.velodb.io/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale',
},
{
- label: 'How We Built Production Vector Search in Apache Doris',
- link:
'https://www.velodb.io/blog/how-we-built-production-vector-search-in-apache-doris',
+ label: 'Apache Doris Python UDF: Calling the Python Ecosystem from SQL
for Agent-Era',
+ link:
'https://www.velodb.io/blog/apache-doris-python-udf-calling-the-python-from-sql-for-agent-era',
},
];
diff --git a/src/constant/newsletter.data.ts b/src/constant/newsletter.data.ts
index 6f763ba366f..af139941742 100644
--- a/src/constant/newsletter.data.ts
+++ b/src/constant/newsletter.data.ts
@@ -1,30 +1,30 @@
export const NEWSLETTER_DATA = [
{
- tags: ['Best Practice'],
- title: "How StepFun Built a PB-Scale Agent Observability Platform with
Apache Doris",
- content: `StepFun built StepTrace, a PB-scale agent observability
platform on Apache Doris, to analyze agent traces, costs, search, evaluation
loops, and infrastructure behavior in real time.`,
- to:
'https://www.velodb.io/blog/how-stepfun-built-agent-observability-platform-with-apache-doris',
- image: 'blogs/202607_StepFun_horizontal.jpeg',
+ tags: ['Tech Sharing'],
+ title: "Dynamic JSON in Agent Workloads: Apache Doris vs ClickHouse,
Elasticsearch, and OpenSearch",
+ content: `AI agent logs create wide, fast-changing JSON payloads that
are difficult to analyze with predictable latency. We compare how Apache Doris,
ClickHouse, Elasticsearch, and OpenSearch perform in such scenario.`,
+ to:
'https://www.velodb.io/blog/dynamic-json-in-agent-workloads-apache-doris-clickhouse-elasticsearch-and-opensearch',
+ image: 'blogs/202608_dynamic_json_horizontal.jpeg',
},
{
- tags: ['Best Practice'],
- title: "From Hive, HBase, MySQL, and Trino to Apache Doris: Tuhu Car's
Unified OLAP Architecture",
- content: `Tuhu Car rebuilt its fragmented Hive, HBase, MySQL, and
Trino OLAP stack with Apache Doris, improving audience segmentation, user
profiling, BI analysis, and real-time analytics.`,
- to:
'https://www.velodb.io/blog/from-hive-hbase-and-trino-to-apache-doris-tuhu-cars-unified-olap-architecture',
- image: 'blogs/202607_Tuhu_horizontal.jpeg',
+ tags: ['Tech Sharing'],
+ title: "PostgreSQL CDC to Apache Doris: Real-Time Sync with One SQL
Statement",
+ content: `Apache Doris offers native CDC for PostgreSQL, replacing
separate CDC, Kafka, Flink, or Spark components with one built-in streaming
job.`,
+ to:
'https://www.velodb.io/blog/postgresql-cdc-to-apache-doris-real-time-sync-with-one-sql-statement',
+ image: 'blogs/202608_PG_CDC_horizontal.jpeg',
},
{
- tags: ['Tech Sharing'],
- title: "ASOF JOIN Benchmark: Apache Doris vs ClickHouse and DuckDB",
- content: `Apache Doris 4.1 outperforms ClickHouse and DuckDB on ASOF
JOIN across all 11 benchmark scenarios.`,
- to:
'https://www.velodb.io/blog/asof-join-benchmark-apache-doris-vs-clickhouse-and-duckdb',
- image: 'blogs/202606_ASOF_JOIN_Benchmark_horizontal.png',
+ tags: ['Best Practice'],
+ title: "From Spark to Apache Doris: How Kwai Made A/B Testing Metrics
145x Faster at Scale",
+ content: `Kwai migrated its company-wide A/B testing metrics pipeline
from Spark to Apache Doris. The rebuild delivered 145x faster metrics
computation and cut resource consumption by 72%.`,
+ to:
'https://www.velodb.io/blog/from-spark-to-apache-doris-how-kwai-made-a-b-testing-metrics-145x-faster-at-scale',
+ image: 'blogs/202608_Kwai_spark_horizontal.jpeg',
},
{
tags: ['Tech Sharing'],
- title: "How We Built Production Vector Search in Apache Doris",
- content: `Apache Doris 4.1 adds more native ANN vector indexes, IVF
and IVF_ON_DISK, directly inside its OLAP engine, reaching 900 QPS at 97%
recall on VectorDBBench.`,
- to:
'https://www.velodb.io/blog/how-we-built-production-vector-search-in-apache-doris',
- image: 'blogs/202605_vector_search_header_horizontal.jpeg',
+ title: "Apache Doris Python UDF: Calling the Python Ecosystem from SQL
for Agent-Era",
+ content: `Apache Doris adds Python UDF in 4.1.3. This enables teams to
create and call Python functions directly in SQL, bringing Pandas, PyArrow, and
the rest of the Python ecosystem into the Doris query path.`,
+ to:
'https://www.velodb.io/blog/apache-doris-python-udf-calling-the-python-from-sql-for-agent-era',
+ image: 'blogs/202608_Python_UDF_horizontal.jpeg',
},
];
diff --git a/static/images/blogs/202607_Iggy_horizontal.jpeg
b/static/images/blogs/202607_Iggy_horizontal.jpeg
new file mode 100644
index 00000000000..21714066969
Binary files /dev/null and b/static/images/blogs/202607_Iggy_horizontal.jpeg
differ
diff --git a/static/images/blogs/202607_LTAP_horizontal.jpeg
b/static/images/blogs/202607_LTAP_horizontal.jpeg
new file mode 100644
index 00000000000..862f16098ea
Binary files /dev/null and b/static/images/blogs/202607_LTAP_horizontal.jpeg
differ
diff --git a/static/images/blogs/202607_Meituan_horizontal.jpeg
b/static/images/blogs/202607_Meituan_horizontal.jpeg
new file mode 100644
index 00000000000..2701095dfca
Binary files /dev/null and b/static/images/blogs/202607_Meituan_horizontal.jpeg
differ
diff --git a/static/images/blogs/202607_Search_Doris41_horizontal.jpeg
b/static/images/blogs/202607_Search_Doris41_horizontal.jpeg
new file mode 100644
index 00000000000..111e6731acb
Binary files /dev/null and
b/static/images/blogs/202607_Search_Doris41_horizontal.jpeg differ
diff --git a/static/images/blogs/202608_Kwai_spark_horizontal.jpeg
b/static/images/blogs/202608_Kwai_spark_horizontal.jpeg
new file mode 100644
index 00000000000..252f4826785
Binary files /dev/null and
b/static/images/blogs/202608_Kwai_spark_horizontal.jpeg differ
diff --git a/static/images/blogs/202608_PG_CDC_horizontal.jpeg
b/static/images/blogs/202608_PG_CDC_horizontal.jpeg
new file mode 100644
index 00000000000..0f56ed8baf1
Binary files /dev/null and b/static/images/blogs/202608_PG_CDC_horizontal.jpeg
differ
diff --git a/static/images/blogs/202608_Python_UDF_horizontal.jpeg
b/static/images/blogs/202608_Python_UDF_horizontal.jpeg
new file mode 100644
index 00000000000..3b38f7c31a3
Binary files /dev/null and
b/static/images/blogs/202608_Python_UDF_horizontal.jpeg differ
diff --git a/static/images/blogs/202608_dynamic_json_horizontal.jpeg
b/static/images/blogs/202608_dynamic_json_horizontal.jpeg
new file mode 100644
index 00000000000..7dafbbbcd36
Binary files /dev/null and
b/static/images/blogs/202608_dynamic_json_horizontal.jpeg differ
diff --git
a/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/cover.png
b/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/cover.png
new file mode 100644
index 00000000000..d4fd8491ad8
Binary files /dev/null and
b/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/cover.png differ
diff --git
a/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo01-daily-order-summary-flow.jpg
b/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo01-daily-order-summary-flow.jpg
new file mode 100644
index 00000000000..38715eeab0a
Binary files /dev/null and
b/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo01-daily-order-summary-flow.jpg
differ
diff --git
a/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo04-late-arriving-orders-flow.jpg
b/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo04-late-arriving-orders-flow.jpg
new file mode 100644
index 00000000000..33a57c66fb4
Binary files /dev/null and
b/static/images/blogs/dbt-for-apache-doris-1.1.0-five-demos/demo04-late-arriving-orders-flow.jpg
differ
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]