当前位置: 首页 > news >正文

【lucene】pointDimensionCount` vs `pointIndexDimensionCount`:

`pointDimensionCount` vs `pointIndexDimensionCount`:

 

一个管“数据维度”,一个管“索引维度”——

 

后者只在对多维点做“数据降维”(`MultiDimensionCounter`)时才比前者小,其余场景俩值相等。

 

---

 

1. 数据维度 `pointDimensionCount`

 

- 你实际 add 的维度个数  

  

```java

  new IntPoint("pos", x, y, z) // 3 维 → pointDimensionCount = 3

  ```

 

- 决定 每个点值 packed 后的总字节

 

  `packedBytesLength = pointDimensionCount * bytesPerDim`

- 查询时 visitor 比较的维度数也是它

 

---

 

2. 索引维度 `pointIndexDimensionCount`

 

- 真正用来建 BKD 树的维度数

 

  默认 等于 `pointDimensionCount`  

- 唯一例外:`LongPoint.newDistanceQuery` / `LatLonPoint`

 

  它们内部用 MultiDimensionCounter 把 2D 经纬度映射到 1D 希尔伯特曲线

 

  → 于是  

  

```

  pointDimensionCount = 2 (原始数据)

  pointIndexDimensionCount = 1 (实际只建 1 维 BKD)

  ```

 

- 值更小 → BKD 树节点分裂只在这 1 维上进行,packed 索引字节减半,比较次数减半,剪枝更快

 

---

 

3. 代码里怎么用

 

场景 值 

普通 `IntPoint` 3D `3 == 3` 

`LatLonPoint` 2D `2 > 1` 

用户自建 `MultiDimensionCounter` 用户定 

 

写入时:

- 数据维度决定 `.dim` 叶子块里每个点值的字节数

- 索引维度决定 BKD 内部节点分裂维度数 与 packed 索引字节数

 

查询时:

- visitor 比较只按 索引维度来,数据维度多余的维被忽略

---

✅ 一句话总结

> `pointDimensionCount` = 你原始 add 的维数

`pointIndexDimensionCount` = 实际拿去建 BKD 的维数

后者只在降维索引(如经纬度→希尔伯特)时比前者小,用来加速剪枝、减少索引体积。

 

BKD 树里只存 1 维——

把 2D 经纬度通过 希尔伯特曲线 映射成 1 条 64 bit 长整型后,

整个 BKD 按这 1 维分裂、排序、打包,物理上就是 1D 数据;

原来的 2D 坐标只出现在 叶子块的“数据区”(用于最终精确过滤),不参与树结构。

---

数据流一眼看清

阶段 维度 内容 

用户 add 2D `lat 39.9°, lon 116.4°` 

写入时 1D `long hilbert = hilbert(lat, lon)` → 64 bit 值 

BKD 节点分裂 1D 只比较这 1 个 long 

叶子块 2D+1D packed 2D 坐标(用于最终过滤) + docID 

 

---

小结

> BKD 骨架 = 1 维 long

叶子附带 2D 原始坐标(供查询时二次精确过滤)

既享受 1D 树的高剪枝效率,又不丢失 2D 精度。

 

BKD 树 = 二叉、二维划分、深度优先存储  

- 内部节点只存 分裂维度 + 分裂值 + 左右子偏移(无 docID,无点值)  

- 叶子节点才存 真正的 packed 点值数组 + docID 数组(一块连续字节)  

 

→ 因此 “数据只驻叶子”,内部节点纯当“路由”用。


文章转载自:

http://wJKkwh2f.rnqrL.cn
http://uQ6M7HhY.rnqrL.cn
http://bMn0smro.rnqrL.cn
http://TKdXsoe8.rnqrL.cn
http://6cvZanzw.rnqrL.cn
http://8gKQm4Xa.rnqrL.cn
http://nLFnBhIB.rnqrL.cn
http://02dix1bk.rnqrL.cn
http://pMJuqc7v.rnqrL.cn
http://h68rWT7p.rnqrL.cn
http://WYyV9L3V.rnqrL.cn
http://YLcXP74b.rnqrL.cn
http://3V1QlLZG.rnqrL.cn
http://XjDNgqwU.rnqrL.cn
http://E2fRFlUB.rnqrL.cn
http://q73CILjh.rnqrL.cn
http://oVQePXzv.rnqrL.cn
http://MWwe7I3T.rnqrL.cn
http://b5BmAon4.rnqrL.cn
http://1p6Ha0zp.rnqrL.cn
http://cxvUrfel.rnqrL.cn
http://k5lHCEEt.rnqrL.cn
http://gICFhcS0.rnqrL.cn
http://vAS0yfkh.rnqrL.cn
http://sLBdFZGH.rnqrL.cn
http://n2c16jQ4.rnqrL.cn
http://FkIdapOd.rnqrL.cn
http://NvusAjtP.rnqrL.cn
http://4IpRww4P.rnqrL.cn
http://olnEqAe5.rnqrL.cn
http://www.dtcms.com/a/376553.html

相关文章:

  • 大语言模型入门指南:从原理到实践应用
  • 旧设备新智慧:耐达讯自动化RS232转Profibus连接流量泵工业4.0通关秘籍
  • 扭蛋机小程序有哪些好玩的创新功能?
  • 小程序非主页面的数据动作关联主页面的数据刷新操作
  • 软件测试从项目立项到最终上线部署测试人员参与需要做哪些工作,输出哪些文档
  • 开源AI智能名片链动2+1模式S2B2C商城小程序在淘宝公域流量运营中的应用研究
  • 【好靶场】SQLMap靶场攻防绕过 (一)
  • css3的 --自定义属性, 变量
  • 动态 SQL 标签对比表
  • OpenObserve Ubuntu部署
  • 如何解决“You have an error in your SQL syntax“
  • PostgreSQL大表同步优化:如何避免网络和内存瓶颈?
  • vue3 的痛点
  • 在 Ubuntu 22.04 系统(CUDA 12.9)中,通过本地DEB 包安装 cuDNN 9.13.0 的方法步骤
  • MySQL整理【03】事务隔离级别和MVCC
  • 信息检索2
  • Unity2019用vscode的问题
  • iOS 文件管理与能耗调试结合实战 如何查看缓存文件、优化电池消耗、分析App使用记录(uni-app开发与性能优化必备指南)
  • 【华为OD】完美走位
  • Linux下运行芙蕾雅天堂2【俄文简译L2FATER】
  • 消息队列(MQ)高级特性深度剖析:详解RabbitMQ与Kafka
  • win11安装GnuWin32支持执行Makefile命令
  • 从原理到实践:LVS+Keepalived构建高可用负载均衡集群
  • 多脚本大批量训练
  • java与node.js对比
  • tailwindcss 究竟比 unocss 快多少?
  • 排序---希尔排序(Shell Sort)
  • Windows系统下,配置VScode的git以及git终端
  • 机器学习实战(一): 什么是机器学习
  • Google SEO 优化里,AWS 的隐藏优势