├── .github ├── dependabot.yml └── workflows │ ├── ci.yml │ └── release.yml ├── .gitignore ├── 810air.torrent ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── Screenshot.png ├── config.toml ├── examples ├── clickhouse.rs ├── parquet.rs └── stopwords.rs ├── src ├── bin │ ├── convert.rs │ ├── index.rs │ └── main.rs ├── config.rs ├── controller.rs ├── lib.rs └── tantivy.rs ├── static ├── help.txt ├── logo.png └── style.css ├── stopwords.txt └── templates ├── case.html └── search.html /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "cargo" 9 | directory: "/" 10 | schedule: 11 | interval: "weekly" 12 | 13 | # https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot#example-dependabotyml-file-for-github-actions= 14 | - package-ecosystem: "github-actions" 15 | directory: "/" 16 | schedule: 17 | interval: "weekly" -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CHECK 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | branches: 9 | - "**" 10 | 11 | jobs: 12 | cargo: 13 | name: Cargo 14 | runs-on: ubuntu-latest 15 | permissions: 16 | contents: write 17 | security-events: write 18 | 19 | steps: 20 | - name: Checkout code 21 | uses: actions/checkout@v4 22 | 23 | - name: Install Rust toolchain 24 | uses: dtolnay/rust-toolchain@master 25 | with: 26 | toolchain: stable 27 | components: clippy, rustfmt 28 | 29 | - name: Setup cache 30 | uses: Swatinem/rust-cache@v2 31 | 32 | - name: Cargo test 33 | run: cargo test 34 | 35 | - name: Cargo fmt 36 | run: cargo fmt -- --check 37 | 38 | - name: Cargo clippy 39 | run: cargo clippy --all-targets --all-features --message-format=json > clippy_result.json 40 | continue-on-error: true 41 | 42 | - name: Install clippy-sarif sarif-fmt (require cargo) 43 | run: | 44 | cargo install clippy-sarif sarif-fmt 45 | cat clippy_result.json | clippy-sarif | tee rust-clippy-results.sarif | sarif-fmt 46 | 47 | - name: Upload analysis results to GitHub 48 | uses: github/codeql-action/upload-sarif@v3 49 | with: 50 | sarif_file: rust-clippy-results.sarif 51 | wait-for-processing: true 52 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | permissions: 4 | contents: write 5 | 6 | on: 7 | push: 8 | tags: 9 | - v[0-9]+.* 10 | 11 | jobs: 12 | create-release: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v4 16 | - uses: taiki-e/create-gh-release-action@v1 17 | with: 18 | # (required) GitHub token for creating GitHub Releases. 19 | token: ${{ secrets.GITHUB_TOKEN }} 20 | 21 | upload-assets: 22 | strategy: 23 | matrix: 24 | os: 25 | - ubuntu-latest 26 | - macos-latest 27 | - windows-latest 28 | runs-on: ${{ matrix.os }} 29 | steps: 30 | - name: Install Rust 31 | run: rustup update stable 32 | - uses: actions/checkout@v4 33 | - uses: taiki-e/upload-rust-binary-action@v1 34 | with: 35 | # (required) Comma-separated list of binary names (non-extension portion of filename) to build and upload. 36 | # Note that glob pattern is not supported yet. 37 | bin: main,index,convert 38 | # (optional) On which platform to distribute the `.tar.gz` file. 39 | # [default value: unix] 40 | # [possible values: all, unix, windows, none] 41 | tar: none 42 | # (optional) On which platform to distribute the `.zip` file. 43 | # [default value: windows] 44 | # [possible values: all, unix, windows, none] 45 | zip: all 46 | # (required) GitHub token for uploading assets to GitHub Releases. 47 | archive: $tag-$target 48 | token: ${{ secrets.GITHUB_TOKEN }} 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /search_index 3 | /rocksdb 4 | 裁判文书全量数据(已完成) 5 | /fjall -------------------------------------------------------------------------------- /810air.torrent: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cncases/cases/d2dc319b3ed05cece9402cda447f775372230882/810air.torrent -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "adler32" 22 | version = "1.2.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" 25 | 26 | [[package]] 27 | name = "ahash" 28 | version = "0.8.12" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" 31 | dependencies = [ 32 | "cfg-if", 33 | "const-random", 34 | "getrandom 0.3.3", 35 | "once_cell", 36 | "version_check", 37 | "zerocopy", 38 | ] 39 | 40 | [[package]] 41 | name = "aho-corasick" 42 | version = "1.1.3" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 45 | dependencies = [ 46 | "memchr", 47 | ] 48 | 49 | [[package]] 50 | name = "allocator-api2" 51 | version = "0.2.21" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 54 | 55 | [[package]] 56 | name = "android-tzdata" 57 | version = "0.1.1" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 60 | 61 | [[package]] 62 | name = "android_system_properties" 63 | version = "0.1.5" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 66 | dependencies = [ 67 | "libc", 68 | ] 69 | 70 | [[package]] 71 | name = "arbitrary" 72 | version = "1.4.1" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" 75 | dependencies = [ 76 | "derive_arbitrary", 77 | ] 78 | 79 | [[package]] 80 | name = "arc-swap" 81 | version = "1.7.1" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" 84 | 85 | [[package]] 86 | name = "arrow" 87 | version = "55.1.0" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "b1bb018b6960c87fd9d025009820406f74e83281185a8bdcb44880d2aa5c9a87" 90 | dependencies = [ 91 | "arrow-arith", 92 | "arrow-array", 93 | "arrow-buffer", 94 | "arrow-cast", 95 | "arrow-data", 96 | "arrow-ord", 97 | "arrow-row", 98 | "arrow-schema", 99 | "arrow-select", 100 | "arrow-string", 101 | ] 102 | 103 | [[package]] 104 | name = "arrow-arith" 105 | version = "55.1.0" 106 | source = "registry+https://github.com/rust-lang/crates.io-index" 107 | checksum = "44de76b51473aa888ecd6ad93ceb262fb8d40d1f1154a4df2f069b3590aa7575" 108 | dependencies = [ 109 | "arrow-array", 110 | "arrow-buffer", 111 | "arrow-data", 112 | "arrow-schema", 113 | "chrono", 114 | "num", 115 | ] 116 | 117 | [[package]] 118 | name = "arrow-array" 119 | version = "55.1.0" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "29ed77e22744475a9a53d00026cf8e166fe73cf42d89c4c4ae63607ee1cfcc3f" 122 | dependencies = [ 123 | "ahash", 124 | "arrow-buffer", 125 | "arrow-data", 126 | "arrow-schema", 127 | "chrono", 128 | "half", 129 | "hashbrown 0.15.3", 130 | "num", 131 | ] 132 | 133 | [[package]] 134 | name = "arrow-buffer" 135 | version = "55.1.0" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "b0391c96eb58bf7389171d1e103112d3fc3e5625ca6b372d606f2688f1ea4cce" 138 | dependencies = [ 139 | "bytes", 140 | "half", 141 | "num", 142 | ] 143 | 144 | [[package]] 145 | name = "arrow-cast" 146 | version = "55.1.0" 147 | source = "registry+https://github.com/rust-lang/crates.io-index" 148 | checksum = "f39e1d774ece9292697fcbe06b5584401b26bd34be1bec25c33edae65c2420ff" 149 | dependencies = [ 150 | "arrow-array", 151 | "arrow-buffer", 152 | "arrow-data", 153 | "arrow-schema", 154 | "arrow-select", 155 | "atoi", 156 | "base64", 157 | "chrono", 158 | "half", 159 | "lexical-core", 160 | "num", 161 | "ryu", 162 | ] 163 | 164 | [[package]] 165 | name = "arrow-data" 166 | version = "55.1.0" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "cf75ac27a08c7f48b88e5c923f267e980f27070147ab74615ad85b5c5f90473d" 169 | dependencies = [ 170 | "arrow-buffer", 171 | "arrow-schema", 172 | "half", 173 | "num", 174 | ] 175 | 176 | [[package]] 177 | name = "arrow-ipc" 178 | version = "55.1.0" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | checksum = "a222f0d93772bd058d1268f4c28ea421a603d66f7979479048c429292fac7b2e" 181 | dependencies = [ 182 | "arrow-array", 183 | "arrow-buffer", 184 | "arrow-data", 185 | "arrow-schema", 186 | "flatbuffers", 187 | ] 188 | 189 | [[package]] 190 | name = "arrow-ord" 191 | version = "55.1.0" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "ab2f1065a5cad7b9efa9e22ce5747ce826aa3855766755d4904535123ef431e7" 194 | dependencies = [ 195 | "arrow-array", 196 | "arrow-buffer", 197 | "arrow-data", 198 | "arrow-schema", 199 | "arrow-select", 200 | ] 201 | 202 | [[package]] 203 | name = "arrow-row" 204 | version = "55.1.0" 205 | source = "registry+https://github.com/rust-lang/crates.io-index" 206 | checksum = "3703a0e3e92d23c3f756df73d2dc9476873f873a76ae63ef9d3de17fda83b2d8" 207 | dependencies = [ 208 | "arrow-array", 209 | "arrow-buffer", 210 | "arrow-data", 211 | "arrow-schema", 212 | "half", 213 | ] 214 | 215 | [[package]] 216 | name = "arrow-schema" 217 | version = "55.1.0" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "73a47aa0c771b5381de2b7f16998d351a6f4eb839f1e13d48353e17e873d969b" 220 | 221 | [[package]] 222 | name = "arrow-select" 223 | version = "55.1.0" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "24b7b85575702b23b85272b01bc1c25a01c9b9852305e5d0078c79ba25d995d4" 226 | dependencies = [ 227 | "ahash", 228 | "arrow-array", 229 | "arrow-buffer", 230 | "arrow-data", 231 | "arrow-schema", 232 | "num", 233 | ] 234 | 235 | [[package]] 236 | name = "arrow-string" 237 | version = "55.1.0" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | checksum = "9260fddf1cdf2799ace2b4c2fc0356a9789fa7551e0953e35435536fecefebbd" 240 | dependencies = [ 241 | "arrow-array", 242 | "arrow-buffer", 243 | "arrow-data", 244 | "arrow-schema", 245 | "arrow-select", 246 | "memchr", 247 | "num", 248 | "regex", 249 | "regex-syntax 0.8.5", 250 | ] 251 | 252 | [[package]] 253 | name = "askama" 254 | version = "0.14.0" 255 | source = "registry+https://github.com/rust-lang/crates.io-index" 256 | checksum = "f75363874b771be265f4ffe307ca705ef6f3baa19011c149da8674a87f1b75c4" 257 | dependencies = [ 258 | "askama_derive", 259 | "itoa", 260 | "percent-encoding", 261 | "serde", 262 | "serde_json", 263 | ] 264 | 265 | [[package]] 266 | name = "askama_derive" 267 | version = "0.14.0" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "129397200fe83088e8a68407a8e2b1f826cf0086b21ccdb866a722c8bcd3a94f" 270 | dependencies = [ 271 | "askama_parser", 272 | "basic-toml", 273 | "memchr", 274 | "proc-macro2", 275 | "quote", 276 | "rustc-hash", 277 | "serde", 278 | "serde_derive", 279 | "syn", 280 | ] 281 | 282 | [[package]] 283 | name = "askama_parser" 284 | version = "0.14.0" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | checksum = "d6ab5630b3d5eaf232620167977f95eb51f3432fc76852328774afbd242d4358" 287 | dependencies = [ 288 | "memchr", 289 | "serde", 290 | "serde_derive", 291 | "winnow", 292 | ] 293 | 294 | [[package]] 295 | name = "async-compression" 296 | version = "0.4.23" 297 | source = "registry+https://github.com/rust-lang/crates.io-index" 298 | checksum = "b37fc50485c4f3f736a4fb14199f6d5f5ba008d7f28fe710306c92780f004c07" 299 | dependencies = [ 300 | "futures-core", 301 | "memchr", 302 | "pin-project-lite", 303 | "tokio", 304 | "zstd", 305 | "zstd-safe", 306 | ] 307 | 308 | [[package]] 309 | name = "async-trait" 310 | version = "0.1.88" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 313 | dependencies = [ 314 | "proc-macro2", 315 | "quote", 316 | "syn", 317 | ] 318 | 319 | [[package]] 320 | name = "atoi" 321 | version = "2.0.0" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 324 | dependencies = [ 325 | "num-traits", 326 | ] 327 | 328 | [[package]] 329 | name = "atomic-waker" 330 | version = "1.1.2" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 333 | 334 | [[package]] 335 | name = "autocfg" 336 | version = "1.4.0" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 339 | 340 | [[package]] 341 | name = "axum" 342 | version = "0.8.4" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" 345 | dependencies = [ 346 | "axum-core", 347 | "bytes", 348 | "form_urlencoded", 349 | "futures-util", 350 | "http", 351 | "http-body", 352 | "http-body-util", 353 | "hyper", 354 | "hyper-util", 355 | "itoa", 356 | "matchit", 357 | "memchr", 358 | "mime", 359 | "percent-encoding", 360 | "pin-project-lite", 361 | "rustversion", 362 | "serde", 363 | "serde_json", 364 | "serde_path_to_error", 365 | "serde_urlencoded", 366 | "sync_wrapper", 367 | "tokio", 368 | "tower", 369 | "tower-layer", 370 | "tower-service", 371 | ] 372 | 373 | [[package]] 374 | name = "axum-core" 375 | version = "0.5.2" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" 378 | dependencies = [ 379 | "bytes", 380 | "futures-core", 381 | "http", 382 | "http-body", 383 | "http-body-util", 384 | "mime", 385 | "pin-project-lite", 386 | "rustversion", 387 | "sync_wrapper", 388 | "tower-layer", 389 | "tower-service", 390 | ] 391 | 392 | [[package]] 393 | name = "backtrace" 394 | version = "0.3.75" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 397 | dependencies = [ 398 | "addr2line", 399 | "cfg-if", 400 | "libc", 401 | "miniz_oxide", 402 | "object", 403 | "rustc-demangle", 404 | "windows-targets", 405 | ] 406 | 407 | [[package]] 408 | name = "base64" 409 | version = "0.22.1" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 412 | 413 | [[package]] 414 | name = "basic-toml" 415 | version = "0.1.10" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" 418 | dependencies = [ 419 | "serde", 420 | ] 421 | 422 | [[package]] 423 | name = "bincode" 424 | version = "2.0.1" 425 | source = "registry+https://github.com/rust-lang/crates.io-index" 426 | checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" 427 | dependencies = [ 428 | "bincode_derive", 429 | "serde", 430 | "unty", 431 | ] 432 | 433 | [[package]] 434 | name = "bincode_derive" 435 | version = "2.0.1" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" 438 | dependencies = [ 439 | "virtue", 440 | ] 441 | 442 | [[package]] 443 | name = "bitflags" 444 | version = "2.9.0" 445 | source = "registry+https://github.com/rust-lang/crates.io-index" 446 | checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 447 | 448 | [[package]] 449 | name = "bitpacking" 450 | version = "0.9.2" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "4c1d3e2bfd8d06048a179f7b17afc3188effa10385e7b00dc65af6aae732ea92" 453 | dependencies = [ 454 | "crunchy", 455 | ] 456 | 457 | [[package]] 458 | name = "bon" 459 | version = "3.6.3" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "ced38439e7a86a4761f7f7d5ded5ff009135939ecb464a24452eaa4c1696af7d" 462 | dependencies = [ 463 | "bon-macros", 464 | "rustversion", 465 | ] 466 | 467 | [[package]] 468 | name = "bon-macros" 469 | version = "3.6.3" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "0ce61d2d3844c6b8d31b2353d9f66cf5e632b3e9549583fe3cac2f4f6136725e" 472 | dependencies = [ 473 | "darling", 474 | "ident_case", 475 | "prettyplease", 476 | "proc-macro2", 477 | "quote", 478 | "rustversion", 479 | "syn", 480 | ] 481 | 482 | [[package]] 483 | name = "bstr" 484 | version = "1.12.0" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" 487 | dependencies = [ 488 | "memchr", 489 | ] 490 | 491 | [[package]] 492 | name = "bumpalo" 493 | version = "3.17.0" 494 | source = "registry+https://github.com/rust-lang/crates.io-index" 495 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 496 | 497 | [[package]] 498 | name = "byteorder" 499 | version = "1.5.0" 500 | source = "registry+https://github.com/rust-lang/crates.io-index" 501 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 502 | 503 | [[package]] 504 | name = "bytes" 505 | version = "1.10.1" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 508 | 509 | [[package]] 510 | name = "byteview" 511 | version = "0.6.1" 512 | source = "registry+https://github.com/rust-lang/crates.io-index" 513 | checksum = "6236364b88b9b6d0bc181ba374cf1ab55ba3ef97a1cb6f8cddad48a273767fb5" 514 | 515 | [[package]] 516 | name = "cases" 517 | version = "0.1.0" 518 | dependencies = [ 519 | "arrow", 520 | "askama", 521 | "axum", 522 | "basic-toml", 523 | "bincode", 524 | "clickhouse", 525 | "csv", 526 | "fjall", 527 | "indexmap", 528 | "jieba-rs", 529 | "parquet", 530 | "scraper", 531 | "serde", 532 | "stop-words", 533 | "tantivy", 534 | "tantivy-jieba", 535 | "tikv-jemallocator", 536 | "tokio", 537 | "tower", 538 | "tower-http", 539 | "tracing", 540 | "tracing-subscriber", 541 | "zip", 542 | ] 543 | 544 | [[package]] 545 | name = "cc" 546 | version = "1.2.22" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "32db95edf998450acc7881c932f94cd9b05c87b4b2599e8bab064753da4acfd1" 549 | dependencies = [ 550 | "jobserver", 551 | "libc", 552 | "shlex", 553 | ] 554 | 555 | [[package]] 556 | name = "cedarwood" 557 | version = "0.4.6" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "6d910bedd62c24733263d0bed247460853c9d22e8956bd4cd964302095e04e90" 560 | dependencies = [ 561 | "smallvec", 562 | ] 563 | 564 | [[package]] 565 | name = "census" 566 | version = "0.4.2" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "4f4c707c6a209cbe82d10abd08e1ea8995e9ea937d2550646e02798948992be0" 569 | 570 | [[package]] 571 | name = "cfg-if" 572 | version = "1.0.0" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 575 | 576 | [[package]] 577 | name = "chrono" 578 | version = "0.4.41" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 581 | dependencies = [ 582 | "android-tzdata", 583 | "iana-time-zone", 584 | "num-traits", 585 | "windows-link", 586 | ] 587 | 588 | [[package]] 589 | name = "cityhash-rs" 590 | version = "1.0.1" 591 | source = "registry+https://github.com/rust-lang/crates.io-index" 592 | checksum = "93a719913643003b84bd13022b4b7e703c09342cd03b679c4641c7d2e50dc34d" 593 | 594 | [[package]] 595 | name = "clickhouse" 596 | version = "0.13.2" 597 | source = "registry+https://github.com/rust-lang/crates.io-index" 598 | checksum = "d9894248c4c5a4402f76a56c273836a0c32547ec8a68166aedee7e01b7b8d102" 599 | dependencies = [ 600 | "bstr", 601 | "bytes", 602 | "cityhash-rs", 603 | "clickhouse-derive", 604 | "futures", 605 | "futures-channel", 606 | "http-body-util", 607 | "hyper", 608 | "hyper-util", 609 | "lz4_flex", 610 | "replace_with", 611 | "sealed", 612 | "serde", 613 | "static_assertions", 614 | "thiserror 1.0.69", 615 | "tokio", 616 | "url", 617 | ] 618 | 619 | [[package]] 620 | name = "clickhouse-derive" 621 | version = "0.2.0" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "d70f3e2893f7d3e017eeacdc9a708fbc29a10488e3ebca21f9df6a5d2b616dbb" 624 | dependencies = [ 625 | "proc-macro2", 626 | "quote", 627 | "serde_derive_internals", 628 | "syn", 629 | ] 630 | 631 | [[package]] 632 | name = "compare" 633 | version = "0.0.6" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "ea0095f6103c2a8b44acd6fd15960c801dafebf02e21940360833e0673f48ba7" 636 | 637 | [[package]] 638 | name = "const-random" 639 | version = "0.1.18" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" 642 | dependencies = [ 643 | "const-random-macro", 644 | ] 645 | 646 | [[package]] 647 | name = "const-random-macro" 648 | version = "0.1.16" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" 651 | dependencies = [ 652 | "getrandom 0.2.16", 653 | "once_cell", 654 | "tiny-keccak", 655 | ] 656 | 657 | [[package]] 658 | name = "core-foundation-sys" 659 | version = "0.8.7" 660 | source = "registry+https://github.com/rust-lang/crates.io-index" 661 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 662 | 663 | [[package]] 664 | name = "core2" 665 | version = "0.4.0" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" 668 | dependencies = [ 669 | "memchr", 670 | ] 671 | 672 | [[package]] 673 | name = "crc32fast" 674 | version = "1.4.2" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 677 | dependencies = [ 678 | "cfg-if", 679 | ] 680 | 681 | [[package]] 682 | name = "crossbeam-channel" 683 | version = "0.5.15" 684 | source = "registry+https://github.com/rust-lang/crates.io-index" 685 | checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" 686 | dependencies = [ 687 | "crossbeam-utils", 688 | ] 689 | 690 | [[package]] 691 | name = "crossbeam-deque" 692 | version = "0.8.6" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 695 | dependencies = [ 696 | "crossbeam-epoch", 697 | "crossbeam-utils", 698 | ] 699 | 700 | [[package]] 701 | name = "crossbeam-epoch" 702 | version = "0.9.18" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 705 | dependencies = [ 706 | "crossbeam-utils", 707 | ] 708 | 709 | [[package]] 710 | name = "crossbeam-skiplist" 711 | version = "0.1.3" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "df29de440c58ca2cc6e587ec3d22347551a32435fbde9d2bff64e78a9ffa151b" 714 | dependencies = [ 715 | "crossbeam-epoch", 716 | "crossbeam-utils", 717 | ] 718 | 719 | [[package]] 720 | name = "crossbeam-utils" 721 | version = "0.8.21" 722 | source = "registry+https://github.com/rust-lang/crates.io-index" 723 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 724 | 725 | [[package]] 726 | name = "crunchy" 727 | version = "0.2.3" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" 730 | 731 | [[package]] 732 | name = "cssparser" 733 | version = "0.34.0" 734 | source = "registry+https://github.com/rust-lang/crates.io-index" 735 | checksum = "b7c66d1cd8ed61bf80b38432613a7a2f09401ab8d0501110655f8b341484a3e3" 736 | dependencies = [ 737 | "cssparser-macros", 738 | "dtoa-short", 739 | "itoa", 740 | "phf", 741 | "smallvec", 742 | ] 743 | 744 | [[package]] 745 | name = "cssparser-macros" 746 | version = "0.6.1" 747 | source = "registry+https://github.com/rust-lang/crates.io-index" 748 | checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 749 | dependencies = [ 750 | "quote", 751 | "syn", 752 | ] 753 | 754 | [[package]] 755 | name = "csv" 756 | version = "1.3.1" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" 759 | dependencies = [ 760 | "csv-core", 761 | "itoa", 762 | "ryu", 763 | "serde", 764 | ] 765 | 766 | [[package]] 767 | name = "csv-core" 768 | version = "0.1.12" 769 | source = "registry+https://github.com/rust-lang/crates.io-index" 770 | checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" 771 | dependencies = [ 772 | "memchr", 773 | ] 774 | 775 | [[package]] 776 | name = "darling" 777 | version = "0.20.11" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 780 | dependencies = [ 781 | "darling_core", 782 | "darling_macro", 783 | ] 784 | 785 | [[package]] 786 | name = "darling_core" 787 | version = "0.20.11" 788 | source = "registry+https://github.com/rust-lang/crates.io-index" 789 | checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 790 | dependencies = [ 791 | "fnv", 792 | "ident_case", 793 | "proc-macro2", 794 | "quote", 795 | "strsim", 796 | "syn", 797 | ] 798 | 799 | [[package]] 800 | name = "darling_macro" 801 | version = "0.20.11" 802 | source = "registry+https://github.com/rust-lang/crates.io-index" 803 | checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 804 | dependencies = [ 805 | "darling_core", 806 | "quote", 807 | "syn", 808 | ] 809 | 810 | [[package]] 811 | name = "dary_heap" 812 | version = "0.3.7" 813 | source = "registry+https://github.com/rust-lang/crates.io-index" 814 | checksum = "04d2cd9c18b9f454ed67da600630b021a8a80bf33f8c95896ab33aaf1c26b728" 815 | 816 | [[package]] 817 | name = "dashmap" 818 | version = "6.1.0" 819 | source = "registry+https://github.com/rust-lang/crates.io-index" 820 | checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" 821 | dependencies = [ 822 | "cfg-if", 823 | "crossbeam-utils", 824 | "hashbrown 0.14.5", 825 | "lock_api", 826 | "once_cell", 827 | "parking_lot_core", 828 | ] 829 | 830 | [[package]] 831 | name = "deranged" 832 | version = "0.4.0" 833 | source = "registry+https://github.com/rust-lang/crates.io-index" 834 | checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 835 | dependencies = [ 836 | "powerfmt", 837 | "serde", 838 | ] 839 | 840 | [[package]] 841 | name = "derive_arbitrary" 842 | version = "1.4.1" 843 | source = "registry+https://github.com/rust-lang/crates.io-index" 844 | checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" 845 | dependencies = [ 846 | "proc-macro2", 847 | "quote", 848 | "syn", 849 | ] 850 | 851 | [[package]] 852 | name = "derive_more" 853 | version = "0.99.20" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" 856 | dependencies = [ 857 | "proc-macro2", 858 | "quote", 859 | "syn", 860 | ] 861 | 862 | [[package]] 863 | name = "displaydoc" 864 | version = "0.2.5" 865 | source = "registry+https://github.com/rust-lang/crates.io-index" 866 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 867 | dependencies = [ 868 | "proc-macro2", 869 | "quote", 870 | "syn", 871 | ] 872 | 873 | [[package]] 874 | name = "double-ended-peekable" 875 | version = "0.1.0" 876 | source = "registry+https://github.com/rust-lang/crates.io-index" 877 | checksum = "c0d05e1c0dbad51b52c38bda7adceef61b9efc2baf04acfe8726a8c4630a6f57" 878 | 879 | [[package]] 880 | name = "downcast-rs" 881 | version = "2.0.1" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "ea8a8b81cacc08888170eef4d13b775126db426d0b348bee9d18c2c1eaf123cf" 884 | 885 | [[package]] 886 | name = "dtoa" 887 | version = "1.0.10" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" 890 | 891 | [[package]] 892 | name = "dtoa-short" 893 | version = "0.3.5" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" 896 | dependencies = [ 897 | "dtoa", 898 | ] 899 | 900 | [[package]] 901 | name = "ego-tree" 902 | version = "0.10.0" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "b2972feb8dffe7bc8c5463b1dacda1b0dfbed3710e50f977d965429692d74cd8" 905 | 906 | [[package]] 907 | name = "either" 908 | version = "1.15.0" 909 | source = "registry+https://github.com/rust-lang/crates.io-index" 910 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 911 | 912 | [[package]] 913 | name = "enum_dispatch" 914 | version = "0.3.13" 915 | source = "registry+https://github.com/rust-lang/crates.io-index" 916 | checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" 917 | dependencies = [ 918 | "once_cell", 919 | "proc-macro2", 920 | "quote", 921 | "syn", 922 | ] 923 | 924 | [[package]] 925 | name = "equivalent" 926 | version = "1.0.2" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 929 | 930 | [[package]] 931 | name = "errno" 932 | version = "0.3.11" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" 935 | dependencies = [ 936 | "libc", 937 | "windows-sys 0.59.0", 938 | ] 939 | 940 | [[package]] 941 | name = "fastdivide" 942 | version = "0.4.2" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | checksum = "9afc2bd4d5a73106dd53d10d73d3401c2f32730ba2c0b93ddb888a8983680471" 945 | 946 | [[package]] 947 | name = "fastrand" 948 | version = "2.3.0" 949 | source = "registry+https://github.com/rust-lang/crates.io-index" 950 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 951 | 952 | [[package]] 953 | name = "fjall" 954 | version = "2.10.0" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "b929b3db7be7d7b4d4df67fb016fc446b8f57507b48a82e69d2a30610e460f28" 957 | dependencies = [ 958 | "byteorder", 959 | "byteview", 960 | "dashmap", 961 | "log", 962 | "lsm-tree", 963 | "path-absolutize", 964 | "std-semaphore", 965 | "tempfile", 966 | "xxhash-rust", 967 | ] 968 | 969 | [[package]] 970 | name = "flatbuffers" 971 | version = "25.2.10" 972 | source = "registry+https://github.com/rust-lang/crates.io-index" 973 | checksum = "1045398c1bfd89168b5fd3f1fc11f6e70b34f6f66300c87d44d3de849463abf1" 974 | dependencies = [ 975 | "bitflags", 976 | "rustc_version", 977 | ] 978 | 979 | [[package]] 980 | name = "flate2" 981 | version = "1.1.1" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" 984 | dependencies = [ 985 | "crc32fast", 986 | "miniz_oxide", 987 | ] 988 | 989 | [[package]] 990 | name = "fnv" 991 | version = "1.0.7" 992 | source = "registry+https://github.com/rust-lang/crates.io-index" 993 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 994 | 995 | [[package]] 996 | name = "foldhash" 997 | version = "0.1.5" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 1000 | 1001 | [[package]] 1002 | name = "form_urlencoded" 1003 | version = "1.2.1" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1006 | dependencies = [ 1007 | "percent-encoding", 1008 | ] 1009 | 1010 | [[package]] 1011 | name = "fs4" 1012 | version = "0.8.4" 1013 | source = "registry+https://github.com/rust-lang/crates.io-index" 1014 | checksum = "f7e180ac76c23b45e767bd7ae9579bc0bb458618c4bc71835926e098e61d15f8" 1015 | dependencies = [ 1016 | "rustix 0.38.44", 1017 | "windows-sys 0.52.0", 1018 | ] 1019 | 1020 | [[package]] 1021 | name = "futf" 1022 | version = "0.1.5" 1023 | source = "registry+https://github.com/rust-lang/crates.io-index" 1024 | checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" 1025 | dependencies = [ 1026 | "mac", 1027 | "new_debug_unreachable", 1028 | ] 1029 | 1030 | [[package]] 1031 | name = "futures" 1032 | version = "0.3.31" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 1035 | dependencies = [ 1036 | "futures-channel", 1037 | "futures-core", 1038 | "futures-executor", 1039 | "futures-io", 1040 | "futures-sink", 1041 | "futures-task", 1042 | "futures-util", 1043 | ] 1044 | 1045 | [[package]] 1046 | name = "futures-channel" 1047 | version = "0.3.31" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 1050 | dependencies = [ 1051 | "futures-core", 1052 | "futures-sink", 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "futures-core" 1057 | version = "0.3.31" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 1060 | 1061 | [[package]] 1062 | name = "futures-executor" 1063 | version = "0.3.31" 1064 | source = "registry+https://github.com/rust-lang/crates.io-index" 1065 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 1066 | dependencies = [ 1067 | "futures-core", 1068 | "futures-task", 1069 | "futures-util", 1070 | ] 1071 | 1072 | [[package]] 1073 | name = "futures-io" 1074 | version = "0.3.31" 1075 | source = "registry+https://github.com/rust-lang/crates.io-index" 1076 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 1077 | 1078 | [[package]] 1079 | name = "futures-macro" 1080 | version = "0.3.31" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 1083 | dependencies = [ 1084 | "proc-macro2", 1085 | "quote", 1086 | "syn", 1087 | ] 1088 | 1089 | [[package]] 1090 | name = "futures-sink" 1091 | version = "0.3.31" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 1094 | 1095 | [[package]] 1096 | name = "futures-task" 1097 | version = "0.3.31" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 1100 | 1101 | [[package]] 1102 | name = "futures-util" 1103 | version = "0.3.31" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 1106 | dependencies = [ 1107 | "futures-channel", 1108 | "futures-core", 1109 | "futures-io", 1110 | "futures-macro", 1111 | "futures-sink", 1112 | "futures-task", 1113 | "memchr", 1114 | "pin-project-lite", 1115 | "pin-utils", 1116 | "slab", 1117 | ] 1118 | 1119 | [[package]] 1120 | name = "fxhash" 1121 | version = "0.2.1" 1122 | source = "registry+https://github.com/rust-lang/crates.io-index" 1123 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 1124 | dependencies = [ 1125 | "byteorder", 1126 | ] 1127 | 1128 | [[package]] 1129 | name = "getopts" 1130 | version = "0.2.21" 1131 | source = "registry+https://github.com/rust-lang/crates.io-index" 1132 | checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" 1133 | dependencies = [ 1134 | "unicode-width", 1135 | ] 1136 | 1137 | [[package]] 1138 | name = "getrandom" 1139 | version = "0.2.16" 1140 | source = "registry+https://github.com/rust-lang/crates.io-index" 1141 | checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 1142 | dependencies = [ 1143 | "cfg-if", 1144 | "libc", 1145 | "wasi 0.11.0+wasi-snapshot-preview1", 1146 | ] 1147 | 1148 | [[package]] 1149 | name = "getrandom" 1150 | version = "0.3.3" 1151 | source = "registry+https://github.com/rust-lang/crates.io-index" 1152 | checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 1153 | dependencies = [ 1154 | "cfg-if", 1155 | "libc", 1156 | "r-efi", 1157 | "wasi 0.14.2+wasi-0.2.4", 1158 | ] 1159 | 1160 | [[package]] 1161 | name = "gimli" 1162 | version = "0.31.1" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 1165 | 1166 | [[package]] 1167 | name = "guardian" 1168 | version = "1.3.0" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "17e2ac29387b1aa07a1e448f7bb4f35b500787971e965b02842b900afa5c8f6f" 1171 | 1172 | [[package]] 1173 | name = "h2" 1174 | version = "0.4.10" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" 1177 | dependencies = [ 1178 | "atomic-waker", 1179 | "bytes", 1180 | "fnv", 1181 | "futures-core", 1182 | "futures-sink", 1183 | "http", 1184 | "indexmap", 1185 | "slab", 1186 | "tokio", 1187 | "tokio-util", 1188 | "tracing", 1189 | ] 1190 | 1191 | [[package]] 1192 | name = "half" 1193 | version = "2.6.0" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" 1196 | dependencies = [ 1197 | "cfg-if", 1198 | "crunchy", 1199 | "num-traits", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "hashbrown" 1204 | version = "0.14.5" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1207 | dependencies = [ 1208 | "ahash", 1209 | "allocator-api2", 1210 | ] 1211 | 1212 | [[package]] 1213 | name = "hashbrown" 1214 | version = "0.15.3" 1215 | source = "registry+https://github.com/rust-lang/crates.io-index" 1216 | checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" 1217 | dependencies = [ 1218 | "allocator-api2", 1219 | "equivalent", 1220 | "foldhash", 1221 | ] 1222 | 1223 | [[package]] 1224 | name = "html5ever" 1225 | version = "0.29.1" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" 1228 | dependencies = [ 1229 | "log", 1230 | "mac", 1231 | "markup5ever", 1232 | "match_token", 1233 | ] 1234 | 1235 | [[package]] 1236 | name = "htmlescape" 1237 | version = "0.3.1" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" 1240 | 1241 | [[package]] 1242 | name = "http" 1243 | version = "1.3.1" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 1246 | dependencies = [ 1247 | "bytes", 1248 | "fnv", 1249 | "itoa", 1250 | ] 1251 | 1252 | [[package]] 1253 | name = "http-body" 1254 | version = "1.0.1" 1255 | source = "registry+https://github.com/rust-lang/crates.io-index" 1256 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 1257 | dependencies = [ 1258 | "bytes", 1259 | "http", 1260 | ] 1261 | 1262 | [[package]] 1263 | name = "http-body-util" 1264 | version = "0.1.3" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 1267 | dependencies = [ 1268 | "bytes", 1269 | "futures-core", 1270 | "http", 1271 | "http-body", 1272 | "pin-project-lite", 1273 | ] 1274 | 1275 | [[package]] 1276 | name = "httparse" 1277 | version = "1.10.1" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 1280 | 1281 | [[package]] 1282 | name = "httpdate" 1283 | version = "1.0.3" 1284 | source = "registry+https://github.com/rust-lang/crates.io-index" 1285 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1286 | 1287 | [[package]] 1288 | name = "hyper" 1289 | version = "1.6.0" 1290 | source = "registry+https://github.com/rust-lang/crates.io-index" 1291 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1292 | dependencies = [ 1293 | "bytes", 1294 | "futures-channel", 1295 | "futures-util", 1296 | "h2", 1297 | "http", 1298 | "http-body", 1299 | "httparse", 1300 | "httpdate", 1301 | "itoa", 1302 | "pin-project-lite", 1303 | "smallvec", 1304 | "tokio", 1305 | "want", 1306 | ] 1307 | 1308 | [[package]] 1309 | name = "hyper-util" 1310 | version = "0.1.11" 1311 | source = "registry+https://github.com/rust-lang/crates.io-index" 1312 | checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" 1313 | dependencies = [ 1314 | "bytes", 1315 | "futures-channel", 1316 | "futures-util", 1317 | "http", 1318 | "http-body", 1319 | "hyper", 1320 | "libc", 1321 | "pin-project-lite", 1322 | "socket2", 1323 | "tokio", 1324 | "tower-service", 1325 | "tracing", 1326 | ] 1327 | 1328 | [[package]] 1329 | name = "hyperloglogplus" 1330 | version = "0.4.1" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "621debdf94dcac33e50475fdd76d34d5ea9c0362a834b9db08c3024696c1fbe3" 1333 | dependencies = [ 1334 | "serde", 1335 | ] 1336 | 1337 | [[package]] 1338 | name = "iana-time-zone" 1339 | version = "0.1.63" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 1342 | dependencies = [ 1343 | "android_system_properties", 1344 | "core-foundation-sys", 1345 | "iana-time-zone-haiku", 1346 | "js-sys", 1347 | "log", 1348 | "wasm-bindgen", 1349 | "windows-core", 1350 | ] 1351 | 1352 | [[package]] 1353 | name = "iana-time-zone-haiku" 1354 | version = "0.1.2" 1355 | source = "registry+https://github.com/rust-lang/crates.io-index" 1356 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1357 | dependencies = [ 1358 | "cc", 1359 | ] 1360 | 1361 | [[package]] 1362 | name = "icu_collections" 1363 | version = "2.0.0" 1364 | source = "registry+https://github.com/rust-lang/crates.io-index" 1365 | checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1366 | dependencies = [ 1367 | "displaydoc", 1368 | "potential_utf", 1369 | "yoke", 1370 | "zerofrom", 1371 | "zerovec", 1372 | ] 1373 | 1374 | [[package]] 1375 | name = "icu_locale_core" 1376 | version = "2.0.0" 1377 | source = "registry+https://github.com/rust-lang/crates.io-index" 1378 | checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1379 | dependencies = [ 1380 | "displaydoc", 1381 | "litemap", 1382 | "tinystr", 1383 | "writeable", 1384 | "zerovec", 1385 | ] 1386 | 1387 | [[package]] 1388 | name = "icu_normalizer" 1389 | version = "2.0.0" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1392 | dependencies = [ 1393 | "displaydoc", 1394 | "icu_collections", 1395 | "icu_normalizer_data", 1396 | "icu_properties", 1397 | "icu_provider", 1398 | "smallvec", 1399 | "zerovec", 1400 | ] 1401 | 1402 | [[package]] 1403 | name = "icu_normalizer_data" 1404 | version = "2.0.0" 1405 | source = "registry+https://github.com/rust-lang/crates.io-index" 1406 | checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1407 | 1408 | [[package]] 1409 | name = "icu_properties" 1410 | version = "2.0.0" 1411 | source = "registry+https://github.com/rust-lang/crates.io-index" 1412 | checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" 1413 | dependencies = [ 1414 | "displaydoc", 1415 | "icu_collections", 1416 | "icu_locale_core", 1417 | "icu_properties_data", 1418 | "icu_provider", 1419 | "potential_utf", 1420 | "zerotrie", 1421 | "zerovec", 1422 | ] 1423 | 1424 | [[package]] 1425 | name = "icu_properties_data" 1426 | version = "2.0.0" 1427 | source = "registry+https://github.com/rust-lang/crates.io-index" 1428 | checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" 1429 | 1430 | [[package]] 1431 | name = "icu_provider" 1432 | version = "2.0.0" 1433 | source = "registry+https://github.com/rust-lang/crates.io-index" 1434 | checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1435 | dependencies = [ 1436 | "displaydoc", 1437 | "icu_locale_core", 1438 | "stable_deref_trait", 1439 | "tinystr", 1440 | "writeable", 1441 | "yoke", 1442 | "zerofrom", 1443 | "zerotrie", 1444 | "zerovec", 1445 | ] 1446 | 1447 | [[package]] 1448 | name = "ident_case" 1449 | version = "1.0.1" 1450 | source = "registry+https://github.com/rust-lang/crates.io-index" 1451 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1452 | 1453 | [[package]] 1454 | name = "idna" 1455 | version = "1.0.3" 1456 | source = "registry+https://github.com/rust-lang/crates.io-index" 1457 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1458 | dependencies = [ 1459 | "idna_adapter", 1460 | "smallvec", 1461 | "utf8_iter", 1462 | ] 1463 | 1464 | [[package]] 1465 | name = "idna_adapter" 1466 | version = "1.2.1" 1467 | source = "registry+https://github.com/rust-lang/crates.io-index" 1468 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 1469 | dependencies = [ 1470 | "icu_normalizer", 1471 | "icu_properties", 1472 | ] 1473 | 1474 | [[package]] 1475 | name = "include-flate" 1476 | version = "0.3.0" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | checksum = "df49c16750695486c1f34de05da5b7438096156466e7f76c38fcdf285cf0113e" 1479 | dependencies = [ 1480 | "include-flate-codegen", 1481 | "lazy_static", 1482 | "libflate", 1483 | ] 1484 | 1485 | [[package]] 1486 | name = "include-flate-codegen" 1487 | version = "0.2.0" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | checksum = "8c5b246c6261be723b85c61ecf87804e8ea4a35cb68be0ff282ed84b95ffe7d7" 1490 | dependencies = [ 1491 | "libflate", 1492 | "proc-macro2", 1493 | "quote", 1494 | "syn", 1495 | ] 1496 | 1497 | [[package]] 1498 | name = "indexmap" 1499 | version = "2.9.0" 1500 | source = "registry+https://github.com/rust-lang/crates.io-index" 1501 | checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 1502 | dependencies = [ 1503 | "equivalent", 1504 | "hashbrown 0.15.3", 1505 | ] 1506 | 1507 | [[package]] 1508 | name = "integer-encoding" 1509 | version = "3.0.4" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" 1512 | 1513 | [[package]] 1514 | name = "interval-heap" 1515 | version = "0.0.5" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | checksum = "11274e5e8e89b8607cfedc2910b6626e998779b48a019151c7604d0adcb86ac6" 1518 | dependencies = [ 1519 | "compare", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "itertools" 1524 | version = "0.14.0" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 1527 | dependencies = [ 1528 | "either", 1529 | ] 1530 | 1531 | [[package]] 1532 | name = "itoa" 1533 | version = "1.0.15" 1534 | source = "registry+https://github.com/rust-lang/crates.io-index" 1535 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 1536 | 1537 | [[package]] 1538 | name = "jieba-macros" 1539 | version = "0.7.1" 1540 | source = "registry+https://github.com/rust-lang/crates.io-index" 1541 | checksum = "7c676b32a471d3cfae8dac2ad2f8334cd52e53377733cca8c1fb0a5062fec192" 1542 | dependencies = [ 1543 | "phf_codegen", 1544 | ] 1545 | 1546 | [[package]] 1547 | name = "jieba-rs" 1548 | version = "0.7.2" 1549 | source = "registry+https://github.com/rust-lang/crates.io-index" 1550 | checksum = "6d1bcad6332969e4d48ee568d430e14ee6dea70740c2549d005d87677ebefb0c" 1551 | dependencies = [ 1552 | "cedarwood", 1553 | "fxhash", 1554 | "include-flate", 1555 | "jieba-macros", 1556 | "lazy_static", 1557 | "phf", 1558 | "regex", 1559 | ] 1560 | 1561 | [[package]] 1562 | name = "jobserver" 1563 | version = "0.1.33" 1564 | source = "registry+https://github.com/rust-lang/crates.io-index" 1565 | checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" 1566 | dependencies = [ 1567 | "getrandom 0.3.3", 1568 | "libc", 1569 | ] 1570 | 1571 | [[package]] 1572 | name = "js-sys" 1573 | version = "0.3.77" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 1576 | dependencies = [ 1577 | "once_cell", 1578 | "wasm-bindgen", 1579 | ] 1580 | 1581 | [[package]] 1582 | name = "lazy_static" 1583 | version = "1.5.0" 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" 1585 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1586 | 1587 | [[package]] 1588 | name = "levenshtein_automata" 1589 | version = "0.2.1" 1590 | source = "registry+https://github.com/rust-lang/crates.io-index" 1591 | checksum = "0c2cdeb66e45e9f36bfad5bbdb4d2384e70936afbee843c6f6543f0c551ebb25" 1592 | 1593 | [[package]] 1594 | name = "lexical-core" 1595 | version = "1.0.5" 1596 | source = "registry+https://github.com/rust-lang/crates.io-index" 1597 | checksum = "b765c31809609075565a70b4b71402281283aeda7ecaf4818ac14a7b2ade8958" 1598 | dependencies = [ 1599 | "lexical-parse-float", 1600 | "lexical-parse-integer", 1601 | "lexical-util", 1602 | "lexical-write-float", 1603 | "lexical-write-integer", 1604 | ] 1605 | 1606 | [[package]] 1607 | name = "lexical-parse-float" 1608 | version = "1.0.5" 1609 | source = "registry+https://github.com/rust-lang/crates.io-index" 1610 | checksum = "de6f9cb01fb0b08060209a057c048fcbab8717b4c1ecd2eac66ebfe39a65b0f2" 1611 | dependencies = [ 1612 | "lexical-parse-integer", 1613 | "lexical-util", 1614 | "static_assertions", 1615 | ] 1616 | 1617 | [[package]] 1618 | name = "lexical-parse-integer" 1619 | version = "1.0.5" 1620 | source = "registry+https://github.com/rust-lang/crates.io-index" 1621 | checksum = "72207aae22fc0a121ba7b6d479e42cbfea549af1479c3f3a4f12c70dd66df12e" 1622 | dependencies = [ 1623 | "lexical-util", 1624 | "static_assertions", 1625 | ] 1626 | 1627 | [[package]] 1628 | name = "lexical-util" 1629 | version = "1.0.6" 1630 | source = "registry+https://github.com/rust-lang/crates.io-index" 1631 | checksum = "5a82e24bf537fd24c177ffbbdc6ebcc8d54732c35b50a3f28cc3f4e4c949a0b3" 1632 | dependencies = [ 1633 | "static_assertions", 1634 | ] 1635 | 1636 | [[package]] 1637 | name = "lexical-write-float" 1638 | version = "1.0.5" 1639 | source = "registry+https://github.com/rust-lang/crates.io-index" 1640 | checksum = "c5afc668a27f460fb45a81a757b6bf2f43c2d7e30cb5a2dcd3abf294c78d62bd" 1641 | dependencies = [ 1642 | "lexical-util", 1643 | "lexical-write-integer", 1644 | "static_assertions", 1645 | ] 1646 | 1647 | [[package]] 1648 | name = "lexical-write-integer" 1649 | version = "1.0.5" 1650 | source = "registry+https://github.com/rust-lang/crates.io-index" 1651 | checksum = "629ddff1a914a836fb245616a7888b62903aae58fa771e1d83943035efa0f978" 1652 | dependencies = [ 1653 | "lexical-util", 1654 | "static_assertions", 1655 | ] 1656 | 1657 | [[package]] 1658 | name = "libc" 1659 | version = "0.2.172" 1660 | source = "registry+https://github.com/rust-lang/crates.io-index" 1661 | checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 1662 | 1663 | [[package]] 1664 | name = "libflate" 1665 | version = "2.1.0" 1666 | source = "registry+https://github.com/rust-lang/crates.io-index" 1667 | checksum = "45d9dfdc14ea4ef0900c1cddbc8dcd553fbaacd8a4a282cf4018ae9dd04fb21e" 1668 | dependencies = [ 1669 | "adler32", 1670 | "core2", 1671 | "crc32fast", 1672 | "dary_heap", 1673 | "libflate_lz77", 1674 | ] 1675 | 1676 | [[package]] 1677 | name = "libflate_lz77" 1678 | version = "2.1.0" 1679 | source = "registry+https://github.com/rust-lang/crates.io-index" 1680 | checksum = "e6e0d73b369f386f1c44abd9c570d5318f55ccde816ff4b562fa452e5182863d" 1681 | dependencies = [ 1682 | "core2", 1683 | "hashbrown 0.14.5", 1684 | "rle-decode-fast", 1685 | ] 1686 | 1687 | [[package]] 1688 | name = "libm" 1689 | version = "0.2.15" 1690 | source = "registry+https://github.com/rust-lang/crates.io-index" 1691 | checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" 1692 | 1693 | [[package]] 1694 | name = "linux-raw-sys" 1695 | version = "0.4.15" 1696 | source = "registry+https://github.com/rust-lang/crates.io-index" 1697 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 1698 | 1699 | [[package]] 1700 | name = "linux-raw-sys" 1701 | version = "0.9.4" 1702 | source = "registry+https://github.com/rust-lang/crates.io-index" 1703 | checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 1704 | 1705 | [[package]] 1706 | name = "litemap" 1707 | version = "0.8.0" 1708 | source = "registry+https://github.com/rust-lang/crates.io-index" 1709 | checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 1710 | 1711 | [[package]] 1712 | name = "lock_api" 1713 | version = "0.4.12" 1714 | source = "registry+https://github.com/rust-lang/crates.io-index" 1715 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1716 | dependencies = [ 1717 | "autocfg", 1718 | "scopeguard", 1719 | ] 1720 | 1721 | [[package]] 1722 | name = "log" 1723 | version = "0.4.27" 1724 | source = "registry+https://github.com/rust-lang/crates.io-index" 1725 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 1726 | 1727 | [[package]] 1728 | name = "lru" 1729 | version = "0.12.5" 1730 | source = "registry+https://github.com/rust-lang/crates.io-index" 1731 | checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 1732 | dependencies = [ 1733 | "hashbrown 0.15.3", 1734 | ] 1735 | 1736 | [[package]] 1737 | name = "lsm-tree" 1738 | version = "2.10.0" 1739 | source = "registry+https://github.com/rust-lang/crates.io-index" 1740 | checksum = "d0d03b764a7e3009cc4d314bfce42ce28b4a2c458fc7149b57817cbed7898f43" 1741 | dependencies = [ 1742 | "byteorder", 1743 | "crossbeam-skiplist", 1744 | "double-ended-peekable", 1745 | "enum_dispatch", 1746 | "guardian", 1747 | "interval-heap", 1748 | "log", 1749 | "miniz_oxide", 1750 | "path-absolutize", 1751 | "quick_cache", 1752 | "rustc-hash", 1753 | "self_cell", 1754 | "tempfile", 1755 | "value-log", 1756 | "varint-rs", 1757 | "xxhash-rust", 1758 | ] 1759 | 1760 | [[package]] 1761 | name = "lz4_flex" 1762 | version = "0.11.3" 1763 | source = "registry+https://github.com/rust-lang/crates.io-index" 1764 | checksum = "75761162ae2b0e580d7e7c390558127e5f01b4194debd6221fd8c207fc80e3f5" 1765 | dependencies = [ 1766 | "twox-hash 1.6.3", 1767 | ] 1768 | 1769 | [[package]] 1770 | name = "mac" 1771 | version = "0.1.1" 1772 | source = "registry+https://github.com/rust-lang/crates.io-index" 1773 | checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" 1774 | 1775 | [[package]] 1776 | name = "markup5ever" 1777 | version = "0.14.1" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" 1780 | dependencies = [ 1781 | "log", 1782 | "phf", 1783 | "phf_codegen", 1784 | "string_cache", 1785 | "string_cache_codegen", 1786 | "tendril", 1787 | ] 1788 | 1789 | [[package]] 1790 | name = "match_token" 1791 | version = "0.1.0" 1792 | source = "registry+https://github.com/rust-lang/crates.io-index" 1793 | checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" 1794 | dependencies = [ 1795 | "proc-macro2", 1796 | "quote", 1797 | "syn", 1798 | ] 1799 | 1800 | [[package]] 1801 | name = "matchers" 1802 | version = "0.1.0" 1803 | source = "registry+https://github.com/rust-lang/crates.io-index" 1804 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1805 | dependencies = [ 1806 | "regex-automata 0.1.10", 1807 | ] 1808 | 1809 | [[package]] 1810 | name = "matchit" 1811 | version = "0.8.4" 1812 | source = "registry+https://github.com/rust-lang/crates.io-index" 1813 | checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" 1814 | 1815 | [[package]] 1816 | name = "measure_time" 1817 | version = "0.9.0" 1818 | source = "registry+https://github.com/rust-lang/crates.io-index" 1819 | checksum = "51c55d61e72fc3ab704396c5fa16f4c184db37978ae4e94ca8959693a235fc0e" 1820 | dependencies = [ 1821 | "log", 1822 | ] 1823 | 1824 | [[package]] 1825 | name = "memchr" 1826 | version = "2.7.4" 1827 | source = "registry+https://github.com/rust-lang/crates.io-index" 1828 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1829 | 1830 | [[package]] 1831 | name = "memmap2" 1832 | version = "0.9.5" 1833 | source = "registry+https://github.com/rust-lang/crates.io-index" 1834 | checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" 1835 | dependencies = [ 1836 | "libc", 1837 | ] 1838 | 1839 | [[package]] 1840 | name = "mime" 1841 | version = "0.3.17" 1842 | source = "registry+https://github.com/rust-lang/crates.io-index" 1843 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1844 | 1845 | [[package]] 1846 | name = "minimal-lexical" 1847 | version = "0.2.1" 1848 | source = "registry+https://github.com/rust-lang/crates.io-index" 1849 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1850 | 1851 | [[package]] 1852 | name = "miniz_oxide" 1853 | version = "0.8.8" 1854 | source = "registry+https://github.com/rust-lang/crates.io-index" 1855 | checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 1856 | dependencies = [ 1857 | "adler2", 1858 | ] 1859 | 1860 | [[package]] 1861 | name = "mio" 1862 | version = "1.0.3" 1863 | source = "registry+https://github.com/rust-lang/crates.io-index" 1864 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1865 | dependencies = [ 1866 | "libc", 1867 | "wasi 0.11.0+wasi-snapshot-preview1", 1868 | "windows-sys 0.52.0", 1869 | ] 1870 | 1871 | [[package]] 1872 | name = "murmurhash32" 1873 | version = "0.3.1" 1874 | source = "registry+https://github.com/rust-lang/crates.io-index" 1875 | checksum = "2195bf6aa996a481483b29d62a7663eed3fe39600c460e323f8ff41e90bdd89b" 1876 | 1877 | [[package]] 1878 | name = "new_debug_unreachable" 1879 | version = "1.0.6" 1880 | source = "registry+https://github.com/rust-lang/crates.io-index" 1881 | checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 1882 | 1883 | [[package]] 1884 | name = "nom" 1885 | version = "7.1.3" 1886 | source = "registry+https://github.com/rust-lang/crates.io-index" 1887 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1888 | dependencies = [ 1889 | "memchr", 1890 | "minimal-lexical", 1891 | ] 1892 | 1893 | [[package]] 1894 | name = "nu-ansi-term" 1895 | version = "0.46.0" 1896 | source = "registry+https://github.com/rust-lang/crates.io-index" 1897 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1898 | dependencies = [ 1899 | "overload", 1900 | "winapi", 1901 | ] 1902 | 1903 | [[package]] 1904 | name = "num" 1905 | version = "0.4.3" 1906 | source = "registry+https://github.com/rust-lang/crates.io-index" 1907 | checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" 1908 | dependencies = [ 1909 | "num-bigint", 1910 | "num-complex", 1911 | "num-integer", 1912 | "num-iter", 1913 | "num-rational", 1914 | "num-traits", 1915 | ] 1916 | 1917 | [[package]] 1918 | name = "num-bigint" 1919 | version = "0.4.6" 1920 | source = "registry+https://github.com/rust-lang/crates.io-index" 1921 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 1922 | dependencies = [ 1923 | "num-integer", 1924 | "num-traits", 1925 | ] 1926 | 1927 | [[package]] 1928 | name = "num-complex" 1929 | version = "0.4.6" 1930 | source = "registry+https://github.com/rust-lang/crates.io-index" 1931 | checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" 1932 | dependencies = [ 1933 | "num-traits", 1934 | ] 1935 | 1936 | [[package]] 1937 | name = "num-conv" 1938 | version = "0.1.0" 1939 | source = "registry+https://github.com/rust-lang/crates.io-index" 1940 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1941 | 1942 | [[package]] 1943 | name = "num-integer" 1944 | version = "0.1.46" 1945 | source = "registry+https://github.com/rust-lang/crates.io-index" 1946 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1947 | dependencies = [ 1948 | "num-traits", 1949 | ] 1950 | 1951 | [[package]] 1952 | name = "num-iter" 1953 | version = "0.1.45" 1954 | source = "registry+https://github.com/rust-lang/crates.io-index" 1955 | checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 1956 | dependencies = [ 1957 | "autocfg", 1958 | "num-integer", 1959 | "num-traits", 1960 | ] 1961 | 1962 | [[package]] 1963 | name = "num-rational" 1964 | version = "0.4.2" 1965 | source = "registry+https://github.com/rust-lang/crates.io-index" 1966 | checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" 1967 | dependencies = [ 1968 | "num-bigint", 1969 | "num-integer", 1970 | "num-traits", 1971 | ] 1972 | 1973 | [[package]] 1974 | name = "num-traits" 1975 | version = "0.2.19" 1976 | source = "registry+https://github.com/rust-lang/crates.io-index" 1977 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1978 | dependencies = [ 1979 | "autocfg", 1980 | "libm", 1981 | ] 1982 | 1983 | [[package]] 1984 | name = "object" 1985 | version = "0.36.7" 1986 | source = "registry+https://github.com/rust-lang/crates.io-index" 1987 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1988 | dependencies = [ 1989 | "memchr", 1990 | ] 1991 | 1992 | [[package]] 1993 | name = "once_cell" 1994 | version = "1.21.3" 1995 | source = "registry+https://github.com/rust-lang/crates.io-index" 1996 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1997 | 1998 | [[package]] 1999 | name = "oneshot" 2000 | version = "0.1.11" 2001 | source = "registry+https://github.com/rust-lang/crates.io-index" 2002 | checksum = "b4ce411919553d3f9fa53a0880544cda985a112117a0444d5ff1e870a893d6ea" 2003 | 2004 | [[package]] 2005 | name = "ordered-float" 2006 | version = "2.10.1" 2007 | source = "registry+https://github.com/rust-lang/crates.io-index" 2008 | checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" 2009 | dependencies = [ 2010 | "num-traits", 2011 | ] 2012 | 2013 | [[package]] 2014 | name = "overload" 2015 | version = "0.1.1" 2016 | source = "registry+https://github.com/rust-lang/crates.io-index" 2017 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 2018 | 2019 | [[package]] 2020 | name = "ownedbytes" 2021 | version = "0.9.0" 2022 | source = "registry+https://github.com/rust-lang/crates.io-index" 2023 | checksum = "2fbd56f7631767e61784dc43f8580f403f4475bd4aaa4da003e6295e1bab4a7e" 2024 | dependencies = [ 2025 | "stable_deref_trait", 2026 | ] 2027 | 2028 | [[package]] 2029 | name = "parking_lot" 2030 | version = "0.12.3" 2031 | source = "registry+https://github.com/rust-lang/crates.io-index" 2032 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 2033 | dependencies = [ 2034 | "lock_api", 2035 | "parking_lot_core", 2036 | ] 2037 | 2038 | [[package]] 2039 | name = "parking_lot_core" 2040 | version = "0.9.10" 2041 | source = "registry+https://github.com/rust-lang/crates.io-index" 2042 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 2043 | dependencies = [ 2044 | "cfg-if", 2045 | "libc", 2046 | "redox_syscall", 2047 | "smallvec", 2048 | "windows-targets", 2049 | ] 2050 | 2051 | [[package]] 2052 | name = "parquet" 2053 | version = "55.1.0" 2054 | source = "registry+https://github.com/rust-lang/crates.io-index" 2055 | checksum = "be7b2d778f6b841d37083ebdf32e33a524acde1266b5884a8ca29bf00dfa1231" 2056 | dependencies = [ 2057 | "ahash", 2058 | "arrow-array", 2059 | "arrow-buffer", 2060 | "arrow-cast", 2061 | "arrow-data", 2062 | "arrow-ipc", 2063 | "arrow-schema", 2064 | "arrow-select", 2065 | "base64", 2066 | "bytes", 2067 | "chrono", 2068 | "half", 2069 | "hashbrown 0.15.3", 2070 | "lz4_flex", 2071 | "num", 2072 | "num-bigint", 2073 | "paste", 2074 | "seq-macro", 2075 | "thrift", 2076 | "twox-hash 2.1.0", 2077 | ] 2078 | 2079 | [[package]] 2080 | name = "paste" 2081 | version = "1.0.15" 2082 | source = "registry+https://github.com/rust-lang/crates.io-index" 2083 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 2084 | 2085 | [[package]] 2086 | name = "path-absolutize" 2087 | version = "3.1.1" 2088 | source = "registry+https://github.com/rust-lang/crates.io-index" 2089 | checksum = "e4af381fe79fa195b4909485d99f73a80792331df0625188e707854f0b3383f5" 2090 | dependencies = [ 2091 | "path-dedot", 2092 | ] 2093 | 2094 | [[package]] 2095 | name = "path-dedot" 2096 | version = "3.1.1" 2097 | source = "registry+https://github.com/rust-lang/crates.io-index" 2098 | checksum = "07ba0ad7e047712414213ff67533e6dd477af0a4e1d14fb52343e53d30ea9397" 2099 | dependencies = [ 2100 | "once_cell", 2101 | ] 2102 | 2103 | [[package]] 2104 | name = "percent-encoding" 2105 | version = "2.3.1" 2106 | source = "registry+https://github.com/rust-lang/crates.io-index" 2107 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 2108 | 2109 | [[package]] 2110 | name = "phf" 2111 | version = "0.11.3" 2112 | source = "registry+https://github.com/rust-lang/crates.io-index" 2113 | checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" 2114 | dependencies = [ 2115 | "phf_macros", 2116 | "phf_shared", 2117 | ] 2118 | 2119 | [[package]] 2120 | name = "phf_codegen" 2121 | version = "0.11.3" 2122 | source = "registry+https://github.com/rust-lang/crates.io-index" 2123 | checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" 2124 | dependencies = [ 2125 | "phf_generator", 2126 | "phf_shared", 2127 | ] 2128 | 2129 | [[package]] 2130 | name = "phf_generator" 2131 | version = "0.11.3" 2132 | source = "registry+https://github.com/rust-lang/crates.io-index" 2133 | checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" 2134 | dependencies = [ 2135 | "phf_shared", 2136 | "rand", 2137 | ] 2138 | 2139 | [[package]] 2140 | name = "phf_macros" 2141 | version = "0.11.3" 2142 | source = "registry+https://github.com/rust-lang/crates.io-index" 2143 | checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" 2144 | dependencies = [ 2145 | "phf_generator", 2146 | "phf_shared", 2147 | "proc-macro2", 2148 | "quote", 2149 | "syn", 2150 | ] 2151 | 2152 | [[package]] 2153 | name = "phf_shared" 2154 | version = "0.11.3" 2155 | source = "registry+https://github.com/rust-lang/crates.io-index" 2156 | checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" 2157 | dependencies = [ 2158 | "siphasher", 2159 | ] 2160 | 2161 | [[package]] 2162 | name = "pin-project-lite" 2163 | version = "0.2.16" 2164 | source = "registry+https://github.com/rust-lang/crates.io-index" 2165 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 2166 | 2167 | [[package]] 2168 | name = "pin-utils" 2169 | version = "0.1.0" 2170 | source = "registry+https://github.com/rust-lang/crates.io-index" 2171 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2172 | 2173 | [[package]] 2174 | name = "pkg-config" 2175 | version = "0.3.32" 2176 | source = "registry+https://github.com/rust-lang/crates.io-index" 2177 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 2178 | 2179 | [[package]] 2180 | name = "potential_utf" 2181 | version = "0.1.2" 2182 | source = "registry+https://github.com/rust-lang/crates.io-index" 2183 | checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 2184 | dependencies = [ 2185 | "zerovec", 2186 | ] 2187 | 2188 | [[package]] 2189 | name = "powerfmt" 2190 | version = "0.2.0" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 2193 | 2194 | [[package]] 2195 | name = "ppv-lite86" 2196 | version = "0.2.21" 2197 | source = "registry+https://github.com/rust-lang/crates.io-index" 2198 | checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 2199 | dependencies = [ 2200 | "zerocopy", 2201 | ] 2202 | 2203 | [[package]] 2204 | name = "precomputed-hash" 2205 | version = "0.1.1" 2206 | source = "registry+https://github.com/rust-lang/crates.io-index" 2207 | checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 2208 | 2209 | [[package]] 2210 | name = "prettyplease" 2211 | version = "0.2.32" 2212 | source = "registry+https://github.com/rust-lang/crates.io-index" 2213 | checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" 2214 | dependencies = [ 2215 | "proc-macro2", 2216 | "syn", 2217 | ] 2218 | 2219 | [[package]] 2220 | name = "proc-macro2" 2221 | version = "1.0.95" 2222 | source = "registry+https://github.com/rust-lang/crates.io-index" 2223 | checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 2224 | dependencies = [ 2225 | "unicode-ident", 2226 | ] 2227 | 2228 | [[package]] 2229 | name = "quick_cache" 2230 | version = "0.6.14" 2231 | source = "registry+https://github.com/rust-lang/crates.io-index" 2232 | checksum = "6b450dad8382b1b95061d5ca1eb792081fb082adf48c678791fe917509596d5f" 2233 | dependencies = [ 2234 | "equivalent", 2235 | "hashbrown 0.15.3", 2236 | ] 2237 | 2238 | [[package]] 2239 | name = "quote" 2240 | version = "1.0.40" 2241 | source = "registry+https://github.com/rust-lang/crates.io-index" 2242 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 2243 | dependencies = [ 2244 | "proc-macro2", 2245 | ] 2246 | 2247 | [[package]] 2248 | name = "r-efi" 2249 | version = "5.2.0" 2250 | source = "registry+https://github.com/rust-lang/crates.io-index" 2251 | checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 2252 | 2253 | [[package]] 2254 | name = "rand" 2255 | version = "0.8.5" 2256 | source = "registry+https://github.com/rust-lang/crates.io-index" 2257 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2258 | dependencies = [ 2259 | "libc", 2260 | "rand_chacha", 2261 | "rand_core", 2262 | ] 2263 | 2264 | [[package]] 2265 | name = "rand_chacha" 2266 | version = "0.3.1" 2267 | source = "registry+https://github.com/rust-lang/crates.io-index" 2268 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2269 | dependencies = [ 2270 | "ppv-lite86", 2271 | "rand_core", 2272 | ] 2273 | 2274 | [[package]] 2275 | name = "rand_core" 2276 | version = "0.6.4" 2277 | source = "registry+https://github.com/rust-lang/crates.io-index" 2278 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2279 | dependencies = [ 2280 | "getrandom 0.2.16", 2281 | ] 2282 | 2283 | [[package]] 2284 | name = "rand_distr" 2285 | version = "0.4.3" 2286 | source = "registry+https://github.com/rust-lang/crates.io-index" 2287 | checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" 2288 | dependencies = [ 2289 | "num-traits", 2290 | "rand", 2291 | ] 2292 | 2293 | [[package]] 2294 | name = "rayon" 2295 | version = "1.10.0" 2296 | source = "registry+https://github.com/rust-lang/crates.io-index" 2297 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 2298 | dependencies = [ 2299 | "either", 2300 | "rayon-core", 2301 | ] 2302 | 2303 | [[package]] 2304 | name = "rayon-core" 2305 | version = "1.12.1" 2306 | source = "registry+https://github.com/rust-lang/crates.io-index" 2307 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 2308 | dependencies = [ 2309 | "crossbeam-deque", 2310 | "crossbeam-utils", 2311 | ] 2312 | 2313 | [[package]] 2314 | name = "redox_syscall" 2315 | version = "0.5.12" 2316 | source = "registry+https://github.com/rust-lang/crates.io-index" 2317 | checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" 2318 | dependencies = [ 2319 | "bitflags", 2320 | ] 2321 | 2322 | [[package]] 2323 | name = "regex" 2324 | version = "1.11.1" 2325 | source = "registry+https://github.com/rust-lang/crates.io-index" 2326 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 2327 | dependencies = [ 2328 | "aho-corasick", 2329 | "memchr", 2330 | "regex-automata 0.4.9", 2331 | "regex-syntax 0.8.5", 2332 | ] 2333 | 2334 | [[package]] 2335 | name = "regex-automata" 2336 | version = "0.1.10" 2337 | source = "registry+https://github.com/rust-lang/crates.io-index" 2338 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 2339 | dependencies = [ 2340 | "regex-syntax 0.6.29", 2341 | ] 2342 | 2343 | [[package]] 2344 | name = "regex-automata" 2345 | version = "0.4.9" 2346 | source = "registry+https://github.com/rust-lang/crates.io-index" 2347 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 2348 | dependencies = [ 2349 | "aho-corasick", 2350 | "memchr", 2351 | "regex-syntax 0.8.5", 2352 | ] 2353 | 2354 | [[package]] 2355 | name = "regex-syntax" 2356 | version = "0.6.29" 2357 | source = "registry+https://github.com/rust-lang/crates.io-index" 2358 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 2359 | 2360 | [[package]] 2361 | name = "regex-syntax" 2362 | version = "0.8.5" 2363 | source = "registry+https://github.com/rust-lang/crates.io-index" 2364 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 2365 | 2366 | [[package]] 2367 | name = "replace_with" 2368 | version = "0.1.7" 2369 | source = "registry+https://github.com/rust-lang/crates.io-index" 2370 | checksum = "e3a8614ee435691de62bcffcf4a66d91b3594bf1428a5722e79103249a095690" 2371 | 2372 | [[package]] 2373 | name = "rle-decode-fast" 2374 | version = "1.0.3" 2375 | source = "registry+https://github.com/rust-lang/crates.io-index" 2376 | checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" 2377 | 2378 | [[package]] 2379 | name = "rust-stemmers" 2380 | version = "1.2.0" 2381 | source = "registry+https://github.com/rust-lang/crates.io-index" 2382 | checksum = "e46a2036019fdb888131db7a4c847a1063a7493f971ed94ea82c67eada63ca54" 2383 | dependencies = [ 2384 | "serde", 2385 | "serde_derive", 2386 | ] 2387 | 2388 | [[package]] 2389 | name = "rustc-demangle" 2390 | version = "0.1.24" 2391 | source = "registry+https://github.com/rust-lang/crates.io-index" 2392 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 2393 | 2394 | [[package]] 2395 | name = "rustc-hash" 2396 | version = "2.1.1" 2397 | source = "registry+https://github.com/rust-lang/crates.io-index" 2398 | checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 2399 | 2400 | [[package]] 2401 | name = "rustc_version" 2402 | version = "0.4.1" 2403 | source = "registry+https://github.com/rust-lang/crates.io-index" 2404 | checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 2405 | dependencies = [ 2406 | "semver", 2407 | ] 2408 | 2409 | [[package]] 2410 | name = "rustix" 2411 | version = "0.38.44" 2412 | source = "registry+https://github.com/rust-lang/crates.io-index" 2413 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 2414 | dependencies = [ 2415 | "bitflags", 2416 | "errno", 2417 | "libc", 2418 | "linux-raw-sys 0.4.15", 2419 | "windows-sys 0.59.0", 2420 | ] 2421 | 2422 | [[package]] 2423 | name = "rustix" 2424 | version = "1.0.7" 2425 | source = "registry+https://github.com/rust-lang/crates.io-index" 2426 | checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" 2427 | dependencies = [ 2428 | "bitflags", 2429 | "errno", 2430 | "libc", 2431 | "linux-raw-sys 0.9.4", 2432 | "windows-sys 0.59.0", 2433 | ] 2434 | 2435 | [[package]] 2436 | name = "rustversion" 2437 | version = "1.0.20" 2438 | source = "registry+https://github.com/rust-lang/crates.io-index" 2439 | checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 2440 | 2441 | [[package]] 2442 | name = "ryu" 2443 | version = "1.0.20" 2444 | source = "registry+https://github.com/rust-lang/crates.io-index" 2445 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 2446 | 2447 | [[package]] 2448 | name = "scopeguard" 2449 | version = "1.2.0" 2450 | source = "registry+https://github.com/rust-lang/crates.io-index" 2451 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2452 | 2453 | [[package]] 2454 | name = "scraper" 2455 | version = "0.23.1" 2456 | source = "registry+https://github.com/rust-lang/crates.io-index" 2457 | checksum = "527e65d9d888567588db4c12da1087598d0f6f8b346cc2c5abc91f05fc2dffe2" 2458 | dependencies = [ 2459 | "cssparser", 2460 | "ego-tree", 2461 | "getopts", 2462 | "html5ever", 2463 | "precomputed-hash", 2464 | "selectors", 2465 | "tendril", 2466 | ] 2467 | 2468 | [[package]] 2469 | name = "sealed" 2470 | version = "0.6.0" 2471 | source = "registry+https://github.com/rust-lang/crates.io-index" 2472 | checksum = "22f968c5ea23d555e670b449c1c5e7b2fc399fdaec1d304a17cd48e288abc107" 2473 | dependencies = [ 2474 | "proc-macro2", 2475 | "quote", 2476 | "syn", 2477 | ] 2478 | 2479 | [[package]] 2480 | name = "selectors" 2481 | version = "0.26.0" 2482 | source = "registry+https://github.com/rust-lang/crates.io-index" 2483 | checksum = "fd568a4c9bb598e291a08244a5c1f5a8a6650bee243b5b0f8dbb3d9cc1d87fe8" 2484 | dependencies = [ 2485 | "bitflags", 2486 | "cssparser", 2487 | "derive_more", 2488 | "fxhash", 2489 | "log", 2490 | "new_debug_unreachable", 2491 | "phf", 2492 | "phf_codegen", 2493 | "precomputed-hash", 2494 | "servo_arc", 2495 | "smallvec", 2496 | ] 2497 | 2498 | [[package]] 2499 | name = "self_cell" 2500 | version = "1.2.0" 2501 | source = "registry+https://github.com/rust-lang/crates.io-index" 2502 | checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" 2503 | 2504 | [[package]] 2505 | name = "semver" 2506 | version = "1.0.26" 2507 | source = "registry+https://github.com/rust-lang/crates.io-index" 2508 | checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 2509 | 2510 | [[package]] 2511 | name = "seq-macro" 2512 | version = "0.3.6" 2513 | source = "registry+https://github.com/rust-lang/crates.io-index" 2514 | checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" 2515 | 2516 | [[package]] 2517 | name = "serde" 2518 | version = "1.0.219" 2519 | source = "registry+https://github.com/rust-lang/crates.io-index" 2520 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 2521 | dependencies = [ 2522 | "serde_derive", 2523 | ] 2524 | 2525 | [[package]] 2526 | name = "serde_derive" 2527 | version = "1.0.219" 2528 | source = "registry+https://github.com/rust-lang/crates.io-index" 2529 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 2530 | dependencies = [ 2531 | "proc-macro2", 2532 | "quote", 2533 | "syn", 2534 | ] 2535 | 2536 | [[package]] 2537 | name = "serde_derive_internals" 2538 | version = "0.29.1" 2539 | source = "registry+https://github.com/rust-lang/crates.io-index" 2540 | checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" 2541 | dependencies = [ 2542 | "proc-macro2", 2543 | "quote", 2544 | "syn", 2545 | ] 2546 | 2547 | [[package]] 2548 | name = "serde_json" 2549 | version = "1.0.140" 2550 | source = "registry+https://github.com/rust-lang/crates.io-index" 2551 | checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 2552 | dependencies = [ 2553 | "itoa", 2554 | "memchr", 2555 | "ryu", 2556 | "serde", 2557 | ] 2558 | 2559 | [[package]] 2560 | name = "serde_path_to_error" 2561 | version = "0.1.17" 2562 | source = "registry+https://github.com/rust-lang/crates.io-index" 2563 | checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" 2564 | dependencies = [ 2565 | "itoa", 2566 | "serde", 2567 | ] 2568 | 2569 | [[package]] 2570 | name = "serde_urlencoded" 2571 | version = "0.7.1" 2572 | source = "registry+https://github.com/rust-lang/crates.io-index" 2573 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2574 | dependencies = [ 2575 | "form_urlencoded", 2576 | "itoa", 2577 | "ryu", 2578 | "serde", 2579 | ] 2580 | 2581 | [[package]] 2582 | name = "servo_arc" 2583 | version = "0.4.0" 2584 | source = "registry+https://github.com/rust-lang/crates.io-index" 2585 | checksum = "ae65c4249478a2647db249fb43e23cec56a2c8974a427e7bd8cb5a1d0964921a" 2586 | dependencies = [ 2587 | "stable_deref_trait", 2588 | ] 2589 | 2590 | [[package]] 2591 | name = "sharded-slab" 2592 | version = "0.1.7" 2593 | source = "registry+https://github.com/rust-lang/crates.io-index" 2594 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 2595 | dependencies = [ 2596 | "lazy_static", 2597 | ] 2598 | 2599 | [[package]] 2600 | name = "shlex" 2601 | version = "1.3.0" 2602 | source = "registry+https://github.com/rust-lang/crates.io-index" 2603 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 2604 | 2605 | [[package]] 2606 | name = "simd-adler32" 2607 | version = "0.3.7" 2608 | source = "registry+https://github.com/rust-lang/crates.io-index" 2609 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 2610 | 2611 | [[package]] 2612 | name = "siphasher" 2613 | version = "1.0.1" 2614 | source = "registry+https://github.com/rust-lang/crates.io-index" 2615 | checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 2616 | 2617 | [[package]] 2618 | name = "sketches-ddsketch" 2619 | version = "0.3.0" 2620 | source = "registry+https://github.com/rust-lang/crates.io-index" 2621 | checksum = "c1e9a774a6c28142ac54bb25d25562e6bcf957493a184f15ad4eebccb23e410a" 2622 | dependencies = [ 2623 | "serde", 2624 | ] 2625 | 2626 | [[package]] 2627 | name = "slab" 2628 | version = "0.4.9" 2629 | source = "registry+https://github.com/rust-lang/crates.io-index" 2630 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2631 | dependencies = [ 2632 | "autocfg", 2633 | ] 2634 | 2635 | [[package]] 2636 | name = "smallvec" 2637 | version = "1.15.0" 2638 | source = "registry+https://github.com/rust-lang/crates.io-index" 2639 | checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 2640 | 2641 | [[package]] 2642 | name = "socket2" 2643 | version = "0.5.9" 2644 | source = "registry+https://github.com/rust-lang/crates.io-index" 2645 | checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" 2646 | dependencies = [ 2647 | "libc", 2648 | "windows-sys 0.52.0", 2649 | ] 2650 | 2651 | [[package]] 2652 | name = "stable_deref_trait" 2653 | version = "1.2.0" 2654 | source = "registry+https://github.com/rust-lang/crates.io-index" 2655 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2656 | 2657 | [[package]] 2658 | name = "static_assertions" 2659 | version = "1.1.0" 2660 | source = "registry+https://github.com/rust-lang/crates.io-index" 2661 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 2662 | 2663 | [[package]] 2664 | name = "std-semaphore" 2665 | version = "0.1.0" 2666 | source = "registry+https://github.com/rust-lang/crates.io-index" 2667 | checksum = "33ae9eec00137a8eed469fb4148acd9fc6ac8c3f9b110f52cd34698c8b5bfa0e" 2668 | 2669 | [[package]] 2670 | name = "stop-words" 2671 | version = "0.8.1" 2672 | source = "registry+https://github.com/rust-lang/crates.io-index" 2673 | checksum = "3c6a86be9f7fa4559b7339669e72026eb437f5e9c5a85c207fe1033079033a17" 2674 | dependencies = [ 2675 | "serde_json", 2676 | ] 2677 | 2678 | [[package]] 2679 | name = "string_cache" 2680 | version = "0.8.9" 2681 | source = "registry+https://github.com/rust-lang/crates.io-index" 2682 | checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" 2683 | dependencies = [ 2684 | "new_debug_unreachable", 2685 | "parking_lot", 2686 | "phf_shared", 2687 | "precomputed-hash", 2688 | "serde", 2689 | ] 2690 | 2691 | [[package]] 2692 | name = "string_cache_codegen" 2693 | version = "0.5.4" 2694 | source = "registry+https://github.com/rust-lang/crates.io-index" 2695 | checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" 2696 | dependencies = [ 2697 | "phf_generator", 2698 | "phf_shared", 2699 | "proc-macro2", 2700 | "quote", 2701 | ] 2702 | 2703 | [[package]] 2704 | name = "strsim" 2705 | version = "0.11.1" 2706 | source = "registry+https://github.com/rust-lang/crates.io-index" 2707 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 2708 | 2709 | [[package]] 2710 | name = "syn" 2711 | version = "2.0.101" 2712 | source = "registry+https://github.com/rust-lang/crates.io-index" 2713 | checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" 2714 | dependencies = [ 2715 | "proc-macro2", 2716 | "quote", 2717 | "unicode-ident", 2718 | ] 2719 | 2720 | [[package]] 2721 | name = "sync_wrapper" 2722 | version = "1.0.2" 2723 | source = "registry+https://github.com/rust-lang/crates.io-index" 2724 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 2725 | 2726 | [[package]] 2727 | name = "synstructure" 2728 | version = "0.13.2" 2729 | source = "registry+https://github.com/rust-lang/crates.io-index" 2730 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 2731 | dependencies = [ 2732 | "proc-macro2", 2733 | "quote", 2734 | "syn", 2735 | ] 2736 | 2737 | [[package]] 2738 | name = "tantivy" 2739 | version = "0.24.1" 2740 | source = "registry+https://github.com/rust-lang/crates.io-index" 2741 | checksum = "ca2374a21157427c5faff2d90930f035b6c22a5d7b0e5b0b7f522e988ef33c06" 2742 | dependencies = [ 2743 | "aho-corasick", 2744 | "arc-swap", 2745 | "base64", 2746 | "bitpacking", 2747 | "bon", 2748 | "byteorder", 2749 | "census", 2750 | "crc32fast", 2751 | "crossbeam-channel", 2752 | "downcast-rs", 2753 | "fastdivide", 2754 | "fnv", 2755 | "fs4", 2756 | "htmlescape", 2757 | "hyperloglogplus", 2758 | "itertools", 2759 | "levenshtein_automata", 2760 | "log", 2761 | "lru", 2762 | "lz4_flex", 2763 | "measure_time", 2764 | "memmap2", 2765 | "once_cell", 2766 | "oneshot", 2767 | "rayon", 2768 | "regex", 2769 | "rust-stemmers", 2770 | "rustc-hash", 2771 | "serde", 2772 | "serde_json", 2773 | "sketches-ddsketch", 2774 | "smallvec", 2775 | "tantivy-bitpacker", 2776 | "tantivy-columnar", 2777 | "tantivy-common", 2778 | "tantivy-fst", 2779 | "tantivy-query-grammar", 2780 | "tantivy-stacker", 2781 | "tantivy-tokenizer-api", 2782 | "tempfile", 2783 | "thiserror 2.0.12", 2784 | "time", 2785 | "uuid", 2786 | "winapi", 2787 | ] 2788 | 2789 | [[package]] 2790 | name = "tantivy-bitpacker" 2791 | version = "0.8.0" 2792 | source = "registry+https://github.com/rust-lang/crates.io-index" 2793 | checksum = "1adc286a39e089ae9938935cd488d7d34f14502544a36607effd2239ff0e2494" 2794 | dependencies = [ 2795 | "bitpacking", 2796 | ] 2797 | 2798 | [[package]] 2799 | name = "tantivy-columnar" 2800 | version = "0.5.0" 2801 | source = "registry+https://github.com/rust-lang/crates.io-index" 2802 | checksum = "6300428e0c104c4f7db6f95b466a6f5c1b9aece094ec57cdd365337908dc7344" 2803 | dependencies = [ 2804 | "downcast-rs", 2805 | "fastdivide", 2806 | "itertools", 2807 | "serde", 2808 | "tantivy-bitpacker", 2809 | "tantivy-common", 2810 | "tantivy-sstable", 2811 | "tantivy-stacker", 2812 | ] 2813 | 2814 | [[package]] 2815 | name = "tantivy-common" 2816 | version = "0.9.0" 2817 | source = "registry+https://github.com/rust-lang/crates.io-index" 2818 | checksum = "e91b6ea6090ce03dc72c27d0619e77185d26cc3b20775966c346c6d4f7e99d7f" 2819 | dependencies = [ 2820 | "async-trait", 2821 | "byteorder", 2822 | "ownedbytes", 2823 | "serde", 2824 | "time", 2825 | ] 2826 | 2827 | [[package]] 2828 | name = "tantivy-fst" 2829 | version = "0.5.0" 2830 | source = "registry+https://github.com/rust-lang/crates.io-index" 2831 | checksum = "d60769b80ad7953d8a7b2c70cdfe722bbcdcac6bccc8ac934c40c034d866fc18" 2832 | dependencies = [ 2833 | "byteorder", 2834 | "regex-syntax 0.8.5", 2835 | "utf8-ranges", 2836 | ] 2837 | 2838 | [[package]] 2839 | name = "tantivy-jieba" 2840 | version = "0.11.0" 2841 | source = "git+https://github.com/jiegec/tantivy-jieba#60606b0be42f4d50cadb239e220b349dc9527336" 2842 | dependencies = [ 2843 | "jieba-rs", 2844 | "lazy_static", 2845 | "tantivy-tokenizer-api", 2846 | ] 2847 | 2848 | [[package]] 2849 | name = "tantivy-query-grammar" 2850 | version = "0.24.0" 2851 | source = "registry+https://github.com/rust-lang/crates.io-index" 2852 | checksum = "e810cdeeebca57fc3f7bfec5f85fdbea9031b2ac9b990eb5ff49b371d52bbe6a" 2853 | dependencies = [ 2854 | "nom", 2855 | "serde", 2856 | "serde_json", 2857 | ] 2858 | 2859 | [[package]] 2860 | name = "tantivy-sstable" 2861 | version = "0.5.0" 2862 | source = "registry+https://github.com/rust-lang/crates.io-index" 2863 | checksum = "709f22c08a4c90e1b36711c1c6cad5ae21b20b093e535b69b18783dd2cb99416" 2864 | dependencies = [ 2865 | "futures-util", 2866 | "itertools", 2867 | "tantivy-bitpacker", 2868 | "tantivy-common", 2869 | "tantivy-fst", 2870 | "zstd", 2871 | ] 2872 | 2873 | [[package]] 2874 | name = "tantivy-stacker" 2875 | version = "0.5.0" 2876 | source = "registry+https://github.com/rust-lang/crates.io-index" 2877 | checksum = "2bcdebb267671311d1e8891fd9d1301803fdb8ad21ba22e0a30d0cab49ba59c1" 2878 | dependencies = [ 2879 | "murmurhash32", 2880 | "rand_distr", 2881 | "tantivy-common", 2882 | ] 2883 | 2884 | [[package]] 2885 | name = "tantivy-tokenizer-api" 2886 | version = "0.5.0" 2887 | source = "registry+https://github.com/rust-lang/crates.io-index" 2888 | checksum = "dfa942fcee81e213e09715bbce8734ae2180070b97b33839a795ba1de201547d" 2889 | dependencies = [ 2890 | "serde", 2891 | ] 2892 | 2893 | [[package]] 2894 | name = "tempfile" 2895 | version = "3.20.0" 2896 | source = "registry+https://github.com/rust-lang/crates.io-index" 2897 | checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 2898 | dependencies = [ 2899 | "fastrand", 2900 | "getrandom 0.3.3", 2901 | "once_cell", 2902 | "rustix 1.0.7", 2903 | "windows-sys 0.59.0", 2904 | ] 2905 | 2906 | [[package]] 2907 | name = "tendril" 2908 | version = "0.4.3" 2909 | source = "registry+https://github.com/rust-lang/crates.io-index" 2910 | checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" 2911 | dependencies = [ 2912 | "futf", 2913 | "mac", 2914 | "utf-8", 2915 | ] 2916 | 2917 | [[package]] 2918 | name = "thiserror" 2919 | version = "1.0.69" 2920 | source = "registry+https://github.com/rust-lang/crates.io-index" 2921 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 2922 | dependencies = [ 2923 | "thiserror-impl 1.0.69", 2924 | ] 2925 | 2926 | [[package]] 2927 | name = "thiserror" 2928 | version = "2.0.12" 2929 | source = "registry+https://github.com/rust-lang/crates.io-index" 2930 | checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 2931 | dependencies = [ 2932 | "thiserror-impl 2.0.12", 2933 | ] 2934 | 2935 | [[package]] 2936 | name = "thiserror-impl" 2937 | version = "1.0.69" 2938 | source = "registry+https://github.com/rust-lang/crates.io-index" 2939 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 2940 | dependencies = [ 2941 | "proc-macro2", 2942 | "quote", 2943 | "syn", 2944 | ] 2945 | 2946 | [[package]] 2947 | name = "thiserror-impl" 2948 | version = "2.0.12" 2949 | source = "registry+https://github.com/rust-lang/crates.io-index" 2950 | checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 2951 | dependencies = [ 2952 | "proc-macro2", 2953 | "quote", 2954 | "syn", 2955 | ] 2956 | 2957 | [[package]] 2958 | name = "thread_local" 2959 | version = "1.1.8" 2960 | source = "registry+https://github.com/rust-lang/crates.io-index" 2961 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 2962 | dependencies = [ 2963 | "cfg-if", 2964 | "once_cell", 2965 | ] 2966 | 2967 | [[package]] 2968 | name = "thrift" 2969 | version = "0.17.0" 2970 | source = "registry+https://github.com/rust-lang/crates.io-index" 2971 | checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" 2972 | dependencies = [ 2973 | "byteorder", 2974 | "integer-encoding", 2975 | "ordered-float", 2976 | ] 2977 | 2978 | [[package]] 2979 | name = "tikv-jemalloc-sys" 2980 | version = "0.6.0+5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7" 2981 | source = "registry+https://github.com/rust-lang/crates.io-index" 2982 | checksum = "cd3c60906412afa9c2b5b5a48ca6a5abe5736aec9eb48ad05037a677e52e4e2d" 2983 | dependencies = [ 2984 | "cc", 2985 | "libc", 2986 | ] 2987 | 2988 | [[package]] 2989 | name = "tikv-jemallocator" 2990 | version = "0.6.0" 2991 | source = "registry+https://github.com/rust-lang/crates.io-index" 2992 | checksum = "4cec5ff18518d81584f477e9bfdf957f5bb0979b0bac3af4ca30b5b3ae2d2865" 2993 | dependencies = [ 2994 | "libc", 2995 | "tikv-jemalloc-sys", 2996 | ] 2997 | 2998 | [[package]] 2999 | name = "time" 3000 | version = "0.3.41" 3001 | source = "registry+https://github.com/rust-lang/crates.io-index" 3002 | checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 3003 | dependencies = [ 3004 | "deranged", 3005 | "itoa", 3006 | "num-conv", 3007 | "powerfmt", 3008 | "serde", 3009 | "time-core", 3010 | "time-macros", 3011 | ] 3012 | 3013 | [[package]] 3014 | name = "time-core" 3015 | version = "0.1.4" 3016 | source = "registry+https://github.com/rust-lang/crates.io-index" 3017 | checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 3018 | 3019 | [[package]] 3020 | name = "time-macros" 3021 | version = "0.2.22" 3022 | source = "registry+https://github.com/rust-lang/crates.io-index" 3023 | checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 3024 | dependencies = [ 3025 | "num-conv", 3026 | "time-core", 3027 | ] 3028 | 3029 | [[package]] 3030 | name = "tiny-keccak" 3031 | version = "2.0.2" 3032 | source = "registry+https://github.com/rust-lang/crates.io-index" 3033 | checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" 3034 | dependencies = [ 3035 | "crunchy", 3036 | ] 3037 | 3038 | [[package]] 3039 | name = "tinystr" 3040 | version = "0.8.1" 3041 | source = "registry+https://github.com/rust-lang/crates.io-index" 3042 | checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 3043 | dependencies = [ 3044 | "displaydoc", 3045 | "zerovec", 3046 | ] 3047 | 3048 | [[package]] 3049 | name = "tokio" 3050 | version = "1.45.0" 3051 | source = "registry+https://github.com/rust-lang/crates.io-index" 3052 | checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" 3053 | dependencies = [ 3054 | "backtrace", 3055 | "bytes", 3056 | "libc", 3057 | "mio", 3058 | "pin-project-lite", 3059 | "socket2", 3060 | "tokio-macros", 3061 | "windows-sys 0.52.0", 3062 | ] 3063 | 3064 | [[package]] 3065 | name = "tokio-macros" 3066 | version = "2.5.0" 3067 | source = "registry+https://github.com/rust-lang/crates.io-index" 3068 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 3069 | dependencies = [ 3070 | "proc-macro2", 3071 | "quote", 3072 | "syn", 3073 | ] 3074 | 3075 | [[package]] 3076 | name = "tokio-util" 3077 | version = "0.7.15" 3078 | source = "registry+https://github.com/rust-lang/crates.io-index" 3079 | checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 3080 | dependencies = [ 3081 | "bytes", 3082 | "futures-core", 3083 | "futures-sink", 3084 | "pin-project-lite", 3085 | "tokio", 3086 | ] 3087 | 3088 | [[package]] 3089 | name = "tower" 3090 | version = "0.5.2" 3091 | source = "registry+https://github.com/rust-lang/crates.io-index" 3092 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 3093 | dependencies = [ 3094 | "futures-core", 3095 | "futures-util", 3096 | "pin-project-lite", 3097 | "sync_wrapper", 3098 | "tokio", 3099 | "tower-layer", 3100 | "tower-service", 3101 | ] 3102 | 3103 | [[package]] 3104 | name = "tower-http" 3105 | version = "0.6.4" 3106 | source = "registry+https://github.com/rust-lang/crates.io-index" 3107 | checksum = "0fdb0c213ca27a9f57ab69ddb290fd80d970922355b83ae380b395d3986b8a2e" 3108 | dependencies = [ 3109 | "async-compression", 3110 | "bitflags", 3111 | "bytes", 3112 | "futures-core", 3113 | "http", 3114 | "http-body", 3115 | "pin-project-lite", 3116 | "tokio", 3117 | "tokio-util", 3118 | "tower-layer", 3119 | "tower-service", 3120 | ] 3121 | 3122 | [[package]] 3123 | name = "tower-layer" 3124 | version = "0.3.3" 3125 | source = "registry+https://github.com/rust-lang/crates.io-index" 3126 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 3127 | 3128 | [[package]] 3129 | name = "tower-service" 3130 | version = "0.3.3" 3131 | source = "registry+https://github.com/rust-lang/crates.io-index" 3132 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 3133 | 3134 | [[package]] 3135 | name = "tracing" 3136 | version = "0.1.41" 3137 | source = "registry+https://github.com/rust-lang/crates.io-index" 3138 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 3139 | dependencies = [ 3140 | "pin-project-lite", 3141 | "tracing-attributes", 3142 | "tracing-core", 3143 | ] 3144 | 3145 | [[package]] 3146 | name = "tracing-attributes" 3147 | version = "0.1.28" 3148 | source = "registry+https://github.com/rust-lang/crates.io-index" 3149 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 3150 | dependencies = [ 3151 | "proc-macro2", 3152 | "quote", 3153 | "syn", 3154 | ] 3155 | 3156 | [[package]] 3157 | name = "tracing-core" 3158 | version = "0.1.33" 3159 | source = "registry+https://github.com/rust-lang/crates.io-index" 3160 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 3161 | dependencies = [ 3162 | "once_cell", 3163 | "valuable", 3164 | ] 3165 | 3166 | [[package]] 3167 | name = "tracing-log" 3168 | version = "0.2.0" 3169 | source = "registry+https://github.com/rust-lang/crates.io-index" 3170 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 3171 | dependencies = [ 3172 | "log", 3173 | "once_cell", 3174 | "tracing-core", 3175 | ] 3176 | 3177 | [[package]] 3178 | name = "tracing-subscriber" 3179 | version = "0.3.19" 3180 | source = "registry+https://github.com/rust-lang/crates.io-index" 3181 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 3182 | dependencies = [ 3183 | "matchers", 3184 | "nu-ansi-term", 3185 | "once_cell", 3186 | "regex", 3187 | "sharded-slab", 3188 | "smallvec", 3189 | "thread_local", 3190 | "tracing", 3191 | "tracing-core", 3192 | "tracing-log", 3193 | ] 3194 | 3195 | [[package]] 3196 | name = "try-lock" 3197 | version = "0.2.5" 3198 | source = "registry+https://github.com/rust-lang/crates.io-index" 3199 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 3200 | 3201 | [[package]] 3202 | name = "twox-hash" 3203 | version = "1.6.3" 3204 | source = "registry+https://github.com/rust-lang/crates.io-index" 3205 | checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" 3206 | dependencies = [ 3207 | "cfg-if", 3208 | "static_assertions", 3209 | ] 3210 | 3211 | [[package]] 3212 | name = "twox-hash" 3213 | version = "2.1.0" 3214 | source = "registry+https://github.com/rust-lang/crates.io-index" 3215 | checksum = "e7b17f197b3050ba473acf9181f7b1d3b66d1cf7356c6cc57886662276e65908" 3216 | 3217 | [[package]] 3218 | name = "unicode-ident" 3219 | version = "1.0.18" 3220 | source = "registry+https://github.com/rust-lang/crates.io-index" 3221 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 3222 | 3223 | [[package]] 3224 | name = "unicode-width" 3225 | version = "0.1.14" 3226 | source = "registry+https://github.com/rust-lang/crates.io-index" 3227 | checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 3228 | 3229 | [[package]] 3230 | name = "unty" 3231 | version = "0.0.4" 3232 | source = "registry+https://github.com/rust-lang/crates.io-index" 3233 | checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" 3234 | 3235 | [[package]] 3236 | name = "url" 3237 | version = "2.5.4" 3238 | source = "registry+https://github.com/rust-lang/crates.io-index" 3239 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 3240 | dependencies = [ 3241 | "form_urlencoded", 3242 | "idna", 3243 | "percent-encoding", 3244 | ] 3245 | 3246 | [[package]] 3247 | name = "utf-8" 3248 | version = "0.7.6" 3249 | source = "registry+https://github.com/rust-lang/crates.io-index" 3250 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 3251 | 3252 | [[package]] 3253 | name = "utf8-ranges" 3254 | version = "1.0.5" 3255 | source = "registry+https://github.com/rust-lang/crates.io-index" 3256 | checksum = "7fcfc827f90e53a02eaef5e535ee14266c1d569214c6aa70133a624d8a3164ba" 3257 | 3258 | [[package]] 3259 | name = "utf8_iter" 3260 | version = "1.0.4" 3261 | source = "registry+https://github.com/rust-lang/crates.io-index" 3262 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 3263 | 3264 | [[package]] 3265 | name = "uuid" 3266 | version = "1.16.0" 3267 | source = "registry+https://github.com/rust-lang/crates.io-index" 3268 | checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" 3269 | dependencies = [ 3270 | "getrandom 0.3.3", 3271 | "serde", 3272 | ] 3273 | 3274 | [[package]] 3275 | name = "valuable" 3276 | version = "0.1.1" 3277 | source = "registry+https://github.com/rust-lang/crates.io-index" 3278 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 3279 | 3280 | [[package]] 3281 | name = "value-log" 3282 | version = "1.9.0" 3283 | source = "registry+https://github.com/rust-lang/crates.io-index" 3284 | checksum = "62fc7c4ce161f049607ecea654dca3f2d727da5371ae85e2e4f14ce2b98ed67c" 3285 | dependencies = [ 3286 | "byteorder", 3287 | "byteview", 3288 | "interval-heap", 3289 | "log", 3290 | "path-absolutize", 3291 | "rustc-hash", 3292 | "tempfile", 3293 | "varint-rs", 3294 | "xxhash-rust", 3295 | ] 3296 | 3297 | [[package]] 3298 | name = "varint-rs" 3299 | version = "2.2.0" 3300 | source = "registry+https://github.com/rust-lang/crates.io-index" 3301 | checksum = "8f54a172d0620933a27a4360d3db3e2ae0dd6cceae9730751a036bbf182c4b23" 3302 | 3303 | [[package]] 3304 | name = "version_check" 3305 | version = "0.9.5" 3306 | source = "registry+https://github.com/rust-lang/crates.io-index" 3307 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 3308 | 3309 | [[package]] 3310 | name = "virtue" 3311 | version = "0.0.18" 3312 | source = "registry+https://github.com/rust-lang/crates.io-index" 3313 | checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" 3314 | 3315 | [[package]] 3316 | name = "want" 3317 | version = "0.3.1" 3318 | source = "registry+https://github.com/rust-lang/crates.io-index" 3319 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 3320 | dependencies = [ 3321 | "try-lock", 3322 | ] 3323 | 3324 | [[package]] 3325 | name = "wasi" 3326 | version = "0.11.0+wasi-snapshot-preview1" 3327 | source = "registry+https://github.com/rust-lang/crates.io-index" 3328 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3329 | 3330 | [[package]] 3331 | name = "wasi" 3332 | version = "0.14.2+wasi-0.2.4" 3333 | source = "registry+https://github.com/rust-lang/crates.io-index" 3334 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 3335 | dependencies = [ 3336 | "wit-bindgen-rt", 3337 | ] 3338 | 3339 | [[package]] 3340 | name = "wasm-bindgen" 3341 | version = "0.2.100" 3342 | source = "registry+https://github.com/rust-lang/crates.io-index" 3343 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 3344 | dependencies = [ 3345 | "cfg-if", 3346 | "once_cell", 3347 | "rustversion", 3348 | "wasm-bindgen-macro", 3349 | ] 3350 | 3351 | [[package]] 3352 | name = "wasm-bindgen-backend" 3353 | version = "0.2.100" 3354 | source = "registry+https://github.com/rust-lang/crates.io-index" 3355 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 3356 | dependencies = [ 3357 | "bumpalo", 3358 | "log", 3359 | "proc-macro2", 3360 | "quote", 3361 | "syn", 3362 | "wasm-bindgen-shared", 3363 | ] 3364 | 3365 | [[package]] 3366 | name = "wasm-bindgen-macro" 3367 | version = "0.2.100" 3368 | source = "registry+https://github.com/rust-lang/crates.io-index" 3369 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 3370 | dependencies = [ 3371 | "quote", 3372 | "wasm-bindgen-macro-support", 3373 | ] 3374 | 3375 | [[package]] 3376 | name = "wasm-bindgen-macro-support" 3377 | version = "0.2.100" 3378 | source = "registry+https://github.com/rust-lang/crates.io-index" 3379 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 3380 | dependencies = [ 3381 | "proc-macro2", 3382 | "quote", 3383 | "syn", 3384 | "wasm-bindgen-backend", 3385 | "wasm-bindgen-shared", 3386 | ] 3387 | 3388 | [[package]] 3389 | name = "wasm-bindgen-shared" 3390 | version = "0.2.100" 3391 | source = "registry+https://github.com/rust-lang/crates.io-index" 3392 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 3393 | dependencies = [ 3394 | "unicode-ident", 3395 | ] 3396 | 3397 | [[package]] 3398 | name = "winapi" 3399 | version = "0.3.9" 3400 | source = "registry+https://github.com/rust-lang/crates.io-index" 3401 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3402 | dependencies = [ 3403 | "winapi-i686-pc-windows-gnu", 3404 | "winapi-x86_64-pc-windows-gnu", 3405 | ] 3406 | 3407 | [[package]] 3408 | name = "winapi-i686-pc-windows-gnu" 3409 | version = "0.4.0" 3410 | source = "registry+https://github.com/rust-lang/crates.io-index" 3411 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3412 | 3413 | [[package]] 3414 | name = "winapi-x86_64-pc-windows-gnu" 3415 | version = "0.4.0" 3416 | source = "registry+https://github.com/rust-lang/crates.io-index" 3417 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3418 | 3419 | [[package]] 3420 | name = "windows-core" 3421 | version = "0.61.0" 3422 | source = "registry+https://github.com/rust-lang/crates.io-index" 3423 | checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" 3424 | dependencies = [ 3425 | "windows-implement", 3426 | "windows-interface", 3427 | "windows-link", 3428 | "windows-result", 3429 | "windows-strings", 3430 | ] 3431 | 3432 | [[package]] 3433 | name = "windows-implement" 3434 | version = "0.60.0" 3435 | source = "registry+https://github.com/rust-lang/crates.io-index" 3436 | checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 3437 | dependencies = [ 3438 | "proc-macro2", 3439 | "quote", 3440 | "syn", 3441 | ] 3442 | 3443 | [[package]] 3444 | name = "windows-interface" 3445 | version = "0.59.1" 3446 | source = "registry+https://github.com/rust-lang/crates.io-index" 3447 | checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 3448 | dependencies = [ 3449 | "proc-macro2", 3450 | "quote", 3451 | "syn", 3452 | ] 3453 | 3454 | [[package]] 3455 | name = "windows-link" 3456 | version = "0.1.1" 3457 | source = "registry+https://github.com/rust-lang/crates.io-index" 3458 | checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" 3459 | 3460 | [[package]] 3461 | name = "windows-result" 3462 | version = "0.3.2" 3463 | source = "registry+https://github.com/rust-lang/crates.io-index" 3464 | checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" 3465 | dependencies = [ 3466 | "windows-link", 3467 | ] 3468 | 3469 | [[package]] 3470 | name = "windows-strings" 3471 | version = "0.4.0" 3472 | source = "registry+https://github.com/rust-lang/crates.io-index" 3473 | checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" 3474 | dependencies = [ 3475 | "windows-link", 3476 | ] 3477 | 3478 | [[package]] 3479 | name = "windows-sys" 3480 | version = "0.52.0" 3481 | source = "registry+https://github.com/rust-lang/crates.io-index" 3482 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3483 | dependencies = [ 3484 | "windows-targets", 3485 | ] 3486 | 3487 | [[package]] 3488 | name = "windows-sys" 3489 | version = "0.59.0" 3490 | source = "registry+https://github.com/rust-lang/crates.io-index" 3491 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 3492 | dependencies = [ 3493 | "windows-targets", 3494 | ] 3495 | 3496 | [[package]] 3497 | name = "windows-targets" 3498 | version = "0.52.6" 3499 | source = "registry+https://github.com/rust-lang/crates.io-index" 3500 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 3501 | dependencies = [ 3502 | "windows_aarch64_gnullvm", 3503 | "windows_aarch64_msvc", 3504 | "windows_i686_gnu", 3505 | "windows_i686_gnullvm", 3506 | "windows_i686_msvc", 3507 | "windows_x86_64_gnu", 3508 | "windows_x86_64_gnullvm", 3509 | "windows_x86_64_msvc", 3510 | ] 3511 | 3512 | [[package]] 3513 | name = "windows_aarch64_gnullvm" 3514 | version = "0.52.6" 3515 | source = "registry+https://github.com/rust-lang/crates.io-index" 3516 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 3517 | 3518 | [[package]] 3519 | name = "windows_aarch64_msvc" 3520 | version = "0.52.6" 3521 | source = "registry+https://github.com/rust-lang/crates.io-index" 3522 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 3523 | 3524 | [[package]] 3525 | name = "windows_i686_gnu" 3526 | version = "0.52.6" 3527 | source = "registry+https://github.com/rust-lang/crates.io-index" 3528 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 3529 | 3530 | [[package]] 3531 | name = "windows_i686_gnullvm" 3532 | version = "0.52.6" 3533 | source = "registry+https://github.com/rust-lang/crates.io-index" 3534 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 3535 | 3536 | [[package]] 3537 | name = "windows_i686_msvc" 3538 | version = "0.52.6" 3539 | source = "registry+https://github.com/rust-lang/crates.io-index" 3540 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3541 | 3542 | [[package]] 3543 | name = "windows_x86_64_gnu" 3544 | version = "0.52.6" 3545 | source = "registry+https://github.com/rust-lang/crates.io-index" 3546 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3547 | 3548 | [[package]] 3549 | name = "windows_x86_64_gnullvm" 3550 | version = "0.52.6" 3551 | source = "registry+https://github.com/rust-lang/crates.io-index" 3552 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3553 | 3554 | [[package]] 3555 | name = "windows_x86_64_msvc" 3556 | version = "0.52.6" 3557 | source = "registry+https://github.com/rust-lang/crates.io-index" 3558 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 3559 | 3560 | [[package]] 3561 | name = "winnow" 3562 | version = "0.7.10" 3563 | source = "registry+https://github.com/rust-lang/crates.io-index" 3564 | checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" 3565 | dependencies = [ 3566 | "memchr", 3567 | ] 3568 | 3569 | [[package]] 3570 | name = "wit-bindgen-rt" 3571 | version = "0.39.0" 3572 | source = "registry+https://github.com/rust-lang/crates.io-index" 3573 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 3574 | dependencies = [ 3575 | "bitflags", 3576 | ] 3577 | 3578 | [[package]] 3579 | name = "writeable" 3580 | version = "0.6.1" 3581 | source = "registry+https://github.com/rust-lang/crates.io-index" 3582 | checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 3583 | 3584 | [[package]] 3585 | name = "xxhash-rust" 3586 | version = "0.8.15" 3587 | source = "registry+https://github.com/rust-lang/crates.io-index" 3588 | checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" 3589 | 3590 | [[package]] 3591 | name = "yoke" 3592 | version = "0.8.0" 3593 | source = "registry+https://github.com/rust-lang/crates.io-index" 3594 | checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 3595 | dependencies = [ 3596 | "serde", 3597 | "stable_deref_trait", 3598 | "yoke-derive", 3599 | "zerofrom", 3600 | ] 3601 | 3602 | [[package]] 3603 | name = "yoke-derive" 3604 | version = "0.8.0" 3605 | source = "registry+https://github.com/rust-lang/crates.io-index" 3606 | checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 3607 | dependencies = [ 3608 | "proc-macro2", 3609 | "quote", 3610 | "syn", 3611 | "synstructure", 3612 | ] 3613 | 3614 | [[package]] 3615 | name = "zerocopy" 3616 | version = "0.8.25" 3617 | source = "registry+https://github.com/rust-lang/crates.io-index" 3618 | checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" 3619 | dependencies = [ 3620 | "zerocopy-derive", 3621 | ] 3622 | 3623 | [[package]] 3624 | name = "zerocopy-derive" 3625 | version = "0.8.25" 3626 | source = "registry+https://github.com/rust-lang/crates.io-index" 3627 | checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" 3628 | dependencies = [ 3629 | "proc-macro2", 3630 | "quote", 3631 | "syn", 3632 | ] 3633 | 3634 | [[package]] 3635 | name = "zerofrom" 3636 | version = "0.1.6" 3637 | source = "registry+https://github.com/rust-lang/crates.io-index" 3638 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 3639 | dependencies = [ 3640 | "zerofrom-derive", 3641 | ] 3642 | 3643 | [[package]] 3644 | name = "zerofrom-derive" 3645 | version = "0.1.6" 3646 | source = "registry+https://github.com/rust-lang/crates.io-index" 3647 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 3648 | dependencies = [ 3649 | "proc-macro2", 3650 | "quote", 3651 | "syn", 3652 | "synstructure", 3653 | ] 3654 | 3655 | [[package]] 3656 | name = "zerotrie" 3657 | version = "0.2.2" 3658 | source = "registry+https://github.com/rust-lang/crates.io-index" 3659 | checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 3660 | dependencies = [ 3661 | "displaydoc", 3662 | "yoke", 3663 | "zerofrom", 3664 | ] 3665 | 3666 | [[package]] 3667 | name = "zerovec" 3668 | version = "0.11.2" 3669 | source = "registry+https://github.com/rust-lang/crates.io-index" 3670 | checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 3671 | dependencies = [ 3672 | "yoke", 3673 | "zerofrom", 3674 | "zerovec-derive", 3675 | ] 3676 | 3677 | [[package]] 3678 | name = "zerovec-derive" 3679 | version = "0.11.1" 3680 | source = "registry+https://github.com/rust-lang/crates.io-index" 3681 | checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 3682 | dependencies = [ 3683 | "proc-macro2", 3684 | "quote", 3685 | "syn", 3686 | ] 3687 | 3688 | [[package]] 3689 | name = "zip" 3690 | version = "2.6.1" 3691 | source = "registry+https://github.com/rust-lang/crates.io-index" 3692 | checksum = "1dcb24d0152526ae49b9b96c1dcf71850ca1e0b882e4e28ed898a93c41334744" 3693 | dependencies = [ 3694 | "arbitrary", 3695 | "crc32fast", 3696 | "crossbeam-utils", 3697 | "flate2", 3698 | "indexmap", 3699 | "memchr", 3700 | "zopfli", 3701 | ] 3702 | 3703 | [[package]] 3704 | name = "zopfli" 3705 | version = "0.8.2" 3706 | source = "registry+https://github.com/rust-lang/crates.io-index" 3707 | checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" 3708 | dependencies = [ 3709 | "bumpalo", 3710 | "crc32fast", 3711 | "log", 3712 | "simd-adler32", 3713 | ] 3714 | 3715 | [[package]] 3716 | name = "zstd" 3717 | version = "0.13.3" 3718 | source = "registry+https://github.com/rust-lang/crates.io-index" 3719 | checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" 3720 | dependencies = [ 3721 | "zstd-safe", 3722 | ] 3723 | 3724 | [[package]] 3725 | name = "zstd-safe" 3726 | version = "7.2.4" 3727 | source = "registry+https://github.com/rust-lang/crates.io-index" 3728 | checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" 3729 | dependencies = [ 3730 | "zstd-sys", 3731 | ] 3732 | 3733 | [[package]] 3734 | name = "zstd-sys" 3735 | version = "2.0.15+zstd.1.5.7" 3736 | source = "registry+https://github.com/rust-lang/crates.io-index" 3737 | checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" 3738 | dependencies = [ 3739 | "cc", 3740 | "pkg-config", 3741 | ] 3742 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "cases" 3 | version = "0.1.0" 4 | edition = "2024" 5 | rust-version = "1.85.0" 6 | 7 | [dependencies] 8 | askama = { version = "0.14" } 9 | axum = { version = "0.8.4", features = [ 10 | "http2", 11 | "query", 12 | "tokio", 13 | "http1", 14 | "json", 15 | ], default-features = false } 16 | basic-toml = "*" 17 | bincode = "2.0.1" 18 | csv = "1" 19 | fjall = { version = "2.10.0", default-features = false, features = [ 20 | "single_writer_tx", 21 | "miniz", 22 | ] } 23 | indexmap = "2" 24 | scraper = "0.23.1" 25 | serde = { version = "1", features = ["derive"] } 26 | stop-words = "0.8.1" 27 | tantivy = "0.24.1" 28 | tantivy-jieba = { git = "https://github.com/jiegec/tantivy-jieba" } 29 | tokio = { version = "1", features = ["macros", "rt-multi-thread"] } 30 | tower = "0.5.2" 31 | tower-http = { version = "0.6.2", features = ["compression-zstd", "timeout"] } 32 | tracing = { version = "0.1", features = [ 33 | "release_max_level_info", 34 | "max_level_info", 35 | ] } 36 | tracing-subscriber = { version = "0.3", features = ["env-filter"] } 37 | zip = { version = "2.6.1", default-features = false, features = ["deflate"] } 38 | 39 | [target.'cfg(not(target_os = "windows"))'.dependencies] 40 | tikv-jemallocator = "0.6" 41 | 42 | [dev-dependencies] 43 | arrow = { version = "55", default-features = false } 44 | clickhouse = { version = "0.13.2" } 45 | jieba-rs = "0.7.2" 46 | parquet = { version = "55", default-features = false, features = [ 47 | "arrow", 48 | "lz4", 49 | ] } 50 | 51 | [profile.release] 52 | lto = "fat" 53 | strip = true 54 | codegen-units = 1 55 | panic = "abort" 56 | rpath = false 57 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cases 2 | 3 | 中国裁判文书网搜索 4 | 5 | ## 用法 6 | 7 | > [!CAUTION] 8 | > 需要磁盘空间 320G 以上,可能需要数小时的时间 9 | 10 | 11 | ### 0. 下载程序并创建配置文件 12 | 13 | 方法一:从 releases 页面下载已编译好的二进制文件(推荐),https://github.com/cncases/cases/releases 14 | 15 | 方法二:自行编译 16 | 17 | ```bash 18 | ## 安装 rust 19 | https://www.rust-lang.org/tools/install 20 | 21 | ## clone 本仓库 22 | git clone https://github.com/cncases/cases.git 23 | 24 | ## 编译,对应程序在 target/release/ 文件夹中 25 | cargo build -r 26 | ``` 27 | 28 | 配置文件参考[config.toml](./config.toml) 29 | 30 | ### 1. 下载原始数据(102G) 31 | 32 | 方法:通过bt下载,种子文件为 `810air.torrent` ,可以从本[仓库](./810air.torrent)下载,也可以通过链接 https://files.catbox.moe/810air.torrent 33 | 34 | 原始数据来源于[马克数据网](https://www.macrodatas.cn/article/1147471898),文书数量超过8500万,约102G。下载后**不要**解压子文件,将文件路径填写到 `config.toml` 中的 `raw_data_path` 变量中; 35 | 36 | ### 2. 将数据加载到数据库中 37 | 38 | 运行 `convert config.toml` 程序。此过程会将原始数据放入数据库中,数据库文件路径为 `config.toml` 中的 `db` 变量;转换后的数据大小约为 200G,转换可能会花费数小时的时间;如果中途中断,再次运行会从中断处继续。 39 | 40 | ### 3. 创建索引 41 | 运行 `index config.toml` 程序会将数据库中的数据创建索引,索引文件路径为 `config.toml` 中的 `index_path` 变量;如果中途中断,需要删除 `index_path` 中的文件,重新运行 `index` 程序;默认情况下,不会索引案件内容,索引大小约为 15.5G,可能会花费数小时的时间。如果需要索引案件内容,需要将index.toml中的 `index_with_full_text` 设置为 `true`,但是这会使索引文件增加到150G左右,索引时间也会增加到十几个小时。 42 | 43 | ### 4. 运行搜索服务 44 | 运行 `main config.toml` 程序,用浏览器打开`config.toml`网址,即可搜索。 45 | 46 | ## 说明 47 | 48 | 当程序和配置文件放在同一目录下,且配置文件命名为 `config.toml` 时,可以省略配置文件路径参数。 49 | 50 | ![screenshot](Screenshot.png) 51 | -------------------------------------------------------------------------------- /Screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cncases/cases/d2dc319b3ed05cece9402cda447f775372230882/Screenshot.png -------------------------------------------------------------------------------- /config.toml: -------------------------------------------------------------------------------- 1 | db = "fjall" # path to store rocksdb 2 | index_path = "search_index" # path to store index 3 | index_with_full_text = false # whether establish full-text index 4 | addr = "127.0.0.1:8081" # If allow LAN access, change it to "0.0.0.0:port". 5 | 6 | # The raw data path you downloaded from the torrent, and you must NOT unzip it. 7 | raw_data_path = "裁判文书全量数据(已完成)" 8 | -------------------------------------------------------------------------------- /examples/clickhouse.rs: -------------------------------------------------------------------------------- 1 | /// convert cases to clickhouse 2 | /// 3 | /// You need to change the clickhouse user and password. 4 | /// 5 | /// ```bash 6 | /// cargo build -r --example clickhouse 7 | /// ./target/release/examples/clickhouse 8 | /// ``` 9 | /// 10 | /// ```sql 11 | /// CREATE TABLE 12 | /// cases ( 13 | /// `id` UInt32, 14 | /// `doc_id` String, 15 | /// `case_id` Nullable(String), 16 | /// `case_name` Nullable(String), 17 | /// `court` Nullable(String), 18 | /// `case_type` LowCardinality(Nullable(String)), 19 | /// `procedure` LowCardinality(Nullable(String)), 20 | /// `judgment_date` LowCardinality(Nullable(String)), 21 | /// `public_date` LowCardinality(Nullable(String)), 22 | /// `parties` Nullable(String), 23 | /// `cause` Nullable(String) CODEC(ZSTD), 24 | /// `legal_basis` Nullable(String) CODEC(ZSTD), 25 | /// ) ENGINE = MergeTree () PRIMARY KEY ( 26 | /// id 27 | /// ) 28 | /// ``` 29 | use bincode::config::standard; 30 | use cases::{CONFIG, Case, kv_sep_partition_option}; 31 | use clickhouse::{Client, Row}; 32 | use fjall::Config; 33 | use serde::{Deserialize, Serialize}; 34 | 35 | #[tokio::main] 36 | async fn main() { 37 | let time = std::time::Instant::now(); 38 | let client = Client::default() 39 | .with_url("http://localhost:8123") 40 | .with_user("clickhouse_user") 41 | .with_password("clickhouse_password"); 42 | 43 | let keyspace = Config::new(CONFIG.db.as_str()).open().unwrap(); 44 | let db = keyspace 45 | .open_partition("cases", kv_sep_partition_option()) 46 | .unwrap(); 47 | 48 | let mut count = 0; 49 | let mut batch = vec![]; 50 | 51 | for i in db.iter() { 52 | let (k, v) = i.unwrap(); 53 | let id = u32::from_be_bytes(k[..].try_into().unwrap()); 54 | let (case, _): (Case, _) = bincode::decode_from_slice(&v, standard()).unwrap(); 55 | 56 | let legal_basis = if case.legal_basis.is_empty() || case.legal_basis == "," { 57 | None 58 | } else { 59 | Some(case.legal_basis) 60 | }; 61 | 62 | let new_case = NewCase { 63 | id, 64 | doc_id: case.doc_id, 65 | case_id: (!case.case_id.is_empty()).then_some(case.case_id), 66 | case_name: (!case.case_name.is_empty()).then_some(case.case_name), 67 | court: (!case.court.is_empty()).then_some(case.court), 68 | case_type: (!case.case_type.is_empty()).then_some(case.case_type), 69 | procedure: (!case.procedure.is_empty()).then_some(case.procedure), 70 | judgment_date: (!case.judgment_date.is_empty()).then_some(case.judgment_date), 71 | public_date: (!case.public_date.is_empty()).then_some(case.public_date), 72 | parties: (!case.parties.is_empty()).then_some(case.parties), 73 | cause: (!case.cause.is_empty()).then_some(case.cause), 74 | legal_basis, 75 | }; 76 | 77 | count += 1; 78 | batch.push(new_case); 79 | if batch.len() >= 100000 { 80 | let mut insert = client.insert("cases").unwrap(); 81 | for case in batch.iter() { 82 | insert.write(case).await.unwrap(); 83 | } 84 | insert.end().await.unwrap(); 85 | batch.clear(); 86 | println!("batch {count}, time: {}", time.elapsed().as_secs()) 87 | } 88 | } 89 | 90 | let mut insert = client.insert("cases").unwrap(); 91 | for case in batch.iter() { 92 | insert.write(case).await.unwrap(); 93 | } 94 | insert.end().await.unwrap(); 95 | batch.clear(); 96 | println!("Done, time: {}", time.elapsed().as_secs()) 97 | } 98 | 99 | #[derive(Debug, Row, Serialize, Deserialize)] 100 | struct NewCase { 101 | id: u32, 102 | doc_id: String, 103 | case_id: Option, 104 | case_name: Option, 105 | court: Option, 106 | case_type: Option, 107 | procedure: Option, 108 | judgment_date: Option, 109 | public_date: Option, 110 | parties: Option, 111 | cause: Option, 112 | legal_basis: Option, 113 | } 114 | -------------------------------------------------------------------------------- /examples/parquet.rs: -------------------------------------------------------------------------------- 1 | /// Convert the cases database to parquet format 2 | /// 3 | /// cargo build -r --example parquet 4 | /// ./target/release/examples/parquet 5 | use std::{fs::File, sync::Arc}; 6 | 7 | use arrow::{ 8 | array::{ArrayRef, RecordBatch, StringArray, UInt32Array}, 9 | datatypes::{DataType, Field, Schema}, 10 | }; 11 | use bincode::config::standard; 12 | use cases::{CONFIG, Case, kv_sep_partition_option}; 13 | use fjall::Config; 14 | use parquet::{arrow::ArrowWriter, basic::Compression, file::properties::WriterProperties}; 15 | 16 | const ROW_SIZE: usize = 200_000; 17 | 18 | fn main() { 19 | let keyspace = Config::new(CONFIG.db.as_str()).open().unwrap(); 20 | let db = keyspace 21 | .open_partition("cases", kv_sep_partition_option()) 22 | .unwrap(); 23 | 24 | let schema = Arc::new(Schema::new(vec![ 25 | Field::new("id", DataType::UInt32, false), 26 | Field::new("doc_id", DataType::Utf8, false), 27 | Field::new("case_id", DataType::Utf8, false), 28 | Field::new("case_name", DataType::Utf8, false), 29 | Field::new("court", DataType::Utf8, false), 30 | Field::new("procedure", DataType::Utf8, false), 31 | Field::new("judgment_date", DataType::Utf8, false), 32 | Field::new("public_date", DataType::Utf8, false), 33 | Field::new("parties", DataType::Utf8, false), 34 | Field::new("cause", DataType::Utf8, false), 35 | Field::new("legal_basis", DataType::Utf8, false), 36 | Field::new("full_text", DataType::Utf8, false), 37 | ])); 38 | 39 | let mut id_vec = Vec::with_capacity(ROW_SIZE); 40 | let mut doc_id_vec = Vec::with_capacity(ROW_SIZE); 41 | let mut case_id_vec = Vec::with_capacity(ROW_SIZE); 42 | let mut case_name_vec = Vec::with_capacity(ROW_SIZE); 43 | let mut court_vec = Vec::with_capacity(ROW_SIZE); 44 | let mut procedure_vec = Vec::with_capacity(ROW_SIZE); 45 | let mut judgment_date_vec = Vec::with_capacity(ROW_SIZE); 46 | let mut public_date_vec = Vec::with_capacity(ROW_SIZE); 47 | let mut parties_vec = Vec::with_capacity(ROW_SIZE); 48 | let mut cause_vec = Vec::with_capacity(ROW_SIZE); 49 | let mut legal_basis_vec = Vec::with_capacity(ROW_SIZE); 50 | let mut full_text_vec = Vec::with_capacity(ROW_SIZE); 51 | 52 | let props = WriterProperties::builder() 53 | .set_compression(Compression::LZ4) 54 | .set_write_batch_size(8192) 55 | .set_data_page_row_count_limit(ROW_SIZE) 56 | .build(); 57 | 58 | let mut count = 0; 59 | for i in db.iter() { 60 | let (k, v) = i.unwrap(); 61 | let id = u32::from_be_bytes(k[..].try_into().unwrap()); 62 | let (case, _): (Case, _) = bincode::decode_from_slice(&v, standard()).unwrap(); 63 | id_vec.push(id); 64 | doc_id_vec.push(case.doc_id); 65 | case_id_vec.push(case.case_id); 66 | case_name_vec.push(case.case_name); 67 | court_vec.push(case.court); 68 | procedure_vec.push(case.procedure); 69 | judgment_date_vec.push(case.judgment_date); 70 | public_date_vec.push(case.public_date); 71 | parties_vec.push(case.parties); 72 | cause_vec.push(case.cause); 73 | legal_basis_vec.push(case.legal_basis); 74 | full_text_vec.push(case.full_text); 75 | 76 | if id_vec.len() >= ROW_SIZE { 77 | count += 1; 78 | let id_array = UInt32Array::from(id_vec.clone()); 79 | let doc_id_array = StringArray::from(doc_id_vec.clone()); 80 | let case_id_array = StringArray::from(case_id_vec.clone()); 81 | let case_name_array = StringArray::from(case_name_vec.clone()); 82 | let court_array = StringArray::from(court_vec.clone()); 83 | let procedure_array = StringArray::from(procedure_vec.clone()); 84 | let judgment_date_array = StringArray::from(judgment_date_vec.clone()); 85 | let public_date_array = StringArray::from(public_date_vec.clone()); 86 | let parties_array = StringArray::from(parties_vec.clone()); 87 | let cause_array = StringArray::from(cause_vec.clone()); 88 | let legal_basis_array = StringArray::from(legal_basis_vec.clone()); 89 | let full_text_array = StringArray::from(full_text_vec.clone()); 90 | 91 | let batch = RecordBatch::try_new( 92 | schema.clone(), 93 | vec![ 94 | Arc::new(id_array) as ArrayRef, 95 | Arc::new(doc_id_array) as ArrayRef, 96 | Arc::new(case_id_array) as ArrayRef, 97 | Arc::new(case_name_array) as ArrayRef, 98 | Arc::new(court_array) as ArrayRef, 99 | Arc::new(procedure_array) as ArrayRef, 100 | Arc::new(judgment_date_array) as ArrayRef, 101 | Arc::new(public_date_array) as ArrayRef, 102 | Arc::new(parties_array) as ArrayRef, 103 | Arc::new(cause_array) as ArrayRef, 104 | Arc::new(legal_basis_array) as ArrayRef, 105 | Arc::new(full_text_array) as ArrayRef, 106 | ], 107 | ) 108 | .unwrap(); 109 | 110 | let file_name = format!("cases_{}.parquet", count); 111 | println!("Writing {}", file_name); 112 | let file = File::create(file_name).unwrap(); 113 | let mut writer = 114 | ArrowWriter::try_new(&file, batch.schema(), Some(props.clone())).unwrap(); 115 | writer.write(&batch).expect("Writing batch"); 116 | writer.close().unwrap(); 117 | 118 | id_vec.clear(); 119 | doc_id_vec.clear(); 120 | case_id_vec.clear(); 121 | case_name_vec.clear(); 122 | court_vec.clear(); 123 | procedure_vec.clear(); 124 | judgment_date_vec.clear(); 125 | public_date_vec.clear(); 126 | parties_vec.clear(); 127 | cause_vec.clear(); 128 | legal_basis_vec.clear(); 129 | full_text_vec.clear(); 130 | } 131 | } 132 | 133 | if !id_vec.is_empty() { 134 | count += 1; 135 | let id_array = UInt32Array::from(id_vec); 136 | let doc_id_array = StringArray::from(doc_id_vec); 137 | let case_id_array = StringArray::from(case_id_vec); 138 | let case_name_array = StringArray::from(case_name_vec); 139 | let court_array = StringArray::from(court_vec); 140 | let procedure_array = StringArray::from(procedure_vec); 141 | let judgment_date_array = StringArray::from(judgment_date_vec); 142 | let public_date_array = StringArray::from(public_date_vec); 143 | let parties_array = StringArray::from(parties_vec); 144 | let cause_array = StringArray::from(cause_vec); 145 | let legal_basis_array = StringArray::from(legal_basis_vec); 146 | let full_text_array = StringArray::from(full_text_vec); 147 | 148 | let batch = RecordBatch::try_new( 149 | schema.clone(), 150 | vec![ 151 | Arc::new(id_array) as ArrayRef, 152 | Arc::new(doc_id_array) as ArrayRef, 153 | Arc::new(case_id_array) as ArrayRef, 154 | Arc::new(case_name_array) as ArrayRef, 155 | Arc::new(court_array) as ArrayRef, 156 | Arc::new(procedure_array) as ArrayRef, 157 | Arc::new(judgment_date_array) as ArrayRef, 158 | Arc::new(public_date_array) as ArrayRef, 159 | Arc::new(parties_array) as ArrayRef, 160 | Arc::new(cause_array) as ArrayRef, 161 | Arc::new(legal_basis_array) as ArrayRef, 162 | Arc::new(full_text_array) as ArrayRef, 163 | ], 164 | ) 165 | .unwrap(); 166 | 167 | let file_name = format!("cases_{}.parquet", count); 168 | println!("Writing {}", file_name); 169 | let file = File::create(file_name).unwrap(); 170 | let mut writer = ArrowWriter::try_new(&file, batch.schema(), Some(props)).unwrap(); 171 | writer.write(&batch).expect("Writing batch"); 172 | writer.close().unwrap(); 173 | } 174 | 175 | println!("Done"); 176 | } 177 | -------------------------------------------------------------------------------- /examples/stopwords.rs: -------------------------------------------------------------------------------- 1 | /// generate stop words 2 | /// 3 | /// cargo build -r --example stopwords 4 | /// ./target/release/examples/stopwords 5 | use jieba_rs::Jieba; 6 | use tracing::info; 7 | 8 | use cases::{CONFIG, Case}; 9 | use std::{ 10 | collections::{HashMap, HashSet}, 11 | fs::{self, read_to_string}, 12 | io::Write, 13 | }; 14 | 15 | fn main() { 16 | tracing_subscriber::fmt().init(); 17 | unzip(CONFIG.raw_data_path.as_ref().unwrap()); 18 | } 19 | 20 | fn unzip(path: &str) { 21 | let time = std::time::Instant::now(); 22 | let mut id = 0; 23 | let jieba = Jieba::new(); 24 | let mut meta_count = HashMap::new(); 25 | let mut fulltext_count = HashMap::new(); 26 | let stop_words = stop_words::get(stop_words::LANGUAGE::Chinese); 27 | let custom_stop_words = read_to_string("stopwords.txt").unwrap(); 28 | let mut custom_stop_words: HashSet = custom_stop_words 29 | .split_whitespace() 30 | .map(|x| x.to_owned()) 31 | .collect(); 32 | custom_stop_words.extend(stop_words); 33 | 34 | for subdir in fs::read_dir(path).unwrap() { 35 | let subdir = subdir.unwrap(); 36 | let subdir_path = subdir.path().to_str().unwrap().to_string(); 37 | if subdir_path.ends_with(".zip") { 38 | info!("unzipping {}", subdir_path); 39 | let file = fs::File::open(&subdir_path).unwrap(); 40 | let mut archive = zip::ZipArchive::new(file).unwrap(); 41 | 42 | for i in 0..archive.len() { 43 | let file = archive.by_index(i).unwrap(); 44 | let raw_name = file.name(); 45 | if raw_name.ends_with(".csv") { 46 | let mut rdr = csv::Reader::from_reader(file); 47 | let mut j = 0; 48 | for result in rdr.deserialize() { 49 | let mut case: Case = result.unwrap(); 50 | id += 1; 51 | j += 1; 52 | case.full_text = 53 | case.full_text 54 | .split_whitespace() 55 | .fold(String::new(), |mut acc, x| { 56 | acc.push_str("

"); 57 | acc.push_str(x); 58 | acc.push_str("

"); 59 | acc 60 | }); 61 | 62 | let meta = vec![ 63 | case.case_id, 64 | case.case_name, 65 | case.court, 66 | case.case_type, 67 | case.procedure, 68 | case.judgment_date, 69 | case.public_date, 70 | case.parties, 71 | case.cause, 72 | case.legal_basis, 73 | ] 74 | .join("\n"); 75 | 76 | let fulltext = case.full_text; 77 | 78 | let meta_words = jieba.cut(&meta, false); 79 | let fulltext_words = jieba.cut(&fulltext, false); 80 | 81 | for word in meta_words { 82 | if custom_stop_words.contains(word) { 83 | continue; 84 | } 85 | let count = meta_count.entry(word.to_owned()).or_insert(0); 86 | *count += 1; 87 | } 88 | 89 | for word in fulltext_words { 90 | if custom_stop_words.contains(word) { 91 | continue; 92 | } 93 | let count = fulltext_count.entry(word.to_owned()).or_insert(0); 94 | *count += 1; 95 | } 96 | 97 | if j % 1000 == 0 { 98 | info!("{} {} {}", id, j, time.elapsed().as_secs_f64()); 99 | } 100 | 101 | if j > 10000 { 102 | break; 103 | } 104 | } 105 | } 106 | } 107 | 108 | info!("done {id} {}", subdir_path); 109 | } 110 | } 111 | 112 | let mut meta_count: Vec<_> = meta_count.into_iter().collect(); 113 | meta_count.sort_by(|a, b| b.1.cmp(&a.1)); 114 | let mut fulltext_count: Vec<_> = fulltext_count.into_iter().collect(); 115 | fulltext_count.sort_by(|a, b| b.1.cmp(&a.1)); 116 | 117 | let mut meta_file = fs::File::create("meta.txt").unwrap(); 118 | for (word, count) in meta_count { 119 | writeln!(meta_file, "{:05} {}", count, word).unwrap(); 120 | } 121 | 122 | let mut fulltext_file = fs::File::create("fulltext.txt").unwrap(); 123 | for (word, count) in fulltext_count { 124 | writeln!(fulltext_file, "{:05} {}", count, word).unwrap(); 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /src/bin/convert.rs: -------------------------------------------------------------------------------- 1 | use bincode::config::standard; 2 | use cases::{CONFIG, Case, kv_sep_partition_option}; 3 | use fjall::Config; 4 | use std::fs; 5 | use tracing::info; 6 | use tracing_subscriber::{layer::SubscriberExt as _, util::SubscriberInitExt}; 7 | 8 | #[cfg(not(target_os = "windows"))] 9 | #[global_allocator] 10 | static GLOBAL: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; 11 | 12 | fn main() { 13 | tracing_subscriber::registry() 14 | .with(tracing_subscriber::EnvFilter::new("info,fjall=warn")) 15 | .with(tracing_subscriber::fmt::layer()) 16 | .init(); 17 | convert(CONFIG.raw_data_path.as_ref().unwrap(), &CONFIG.db); 18 | } 19 | 20 | fn convert(raw_path: &str, db_path: &str) { 21 | let time = std::time::Instant::now(); 22 | let mut ft = Vec::with_capacity(1024); 23 | let mut id: u32 = 0; 24 | let keyspace = Config::new(db_path) 25 | .max_write_buffer_size(256_000_000) 26 | .open() 27 | .unwrap(); 28 | let db = keyspace 29 | .open_partition("cases", kv_sep_partition_option()) 30 | .unwrap(); 31 | 32 | for subdir in fs::read_dir(raw_path).unwrap() { 33 | let subdir = subdir.unwrap(); 34 | let subdir_path = subdir.path().to_str().unwrap().to_string(); 35 | if subdir_path.ends_with(".zip") { 36 | info!("unzipping {}", subdir_path); 37 | let file = fs::File::open(&subdir_path).unwrap(); 38 | let mut archive = zip::ZipArchive::new(file).unwrap(); 39 | 40 | let mut buf = String::new(); 41 | for i in 0..archive.len() { 42 | let file = archive.by_index(i).unwrap(); 43 | let raw_name = file.name(); 44 | if raw_name.ends_with(".csv") { 45 | let mut rdr = csv::Reader::from_reader(file); 46 | for result in rdr.deserialize() { 47 | id += 1; 48 | if db.contains_key(id.to_be_bytes()).unwrap() { 49 | if id % 10000 == 0 { 50 | info!("skipping {}", id); 51 | } 52 | continue; 53 | } 54 | 55 | let mut case: Case = result.unwrap(); 56 | // https://wenshu.court.gov.cn/website/wenshu/181107ANFZ0BXSK4/index.html?docId=964fc681687d4e47a0a9ace500096dde 57 | case.doc_id = case 58 | .doc_id 59 | .rsplit_once("=") 60 | .unwrap_or_default() 61 | .1 62 | .to_string(); 63 | 64 | case.full_text.split_whitespace().for_each(|word| { 65 | buf.push_str("

"); 66 | buf.push_str(word); 67 | buf.push_str("

"); 68 | }); 69 | 70 | case.full_text = buf.clone(); 71 | buf.clear(); 72 | 73 | ft.push((id, case)); 74 | 75 | if ft.len() >= 10240 { 76 | info!("inserting {id}, time: {}", time.elapsed().as_secs()); 77 | let mut batch = keyspace.batch(); 78 | for (id, case) in ft.iter() { 79 | batch.insert( 80 | &db, 81 | (*id).to_be_bytes(), 82 | bincode::encode_to_vec(case, standard()).unwrap(), 83 | ); 84 | } 85 | batch.commit().unwrap(); 86 | ft.clear(); 87 | } 88 | } 89 | } 90 | } 91 | 92 | info!("done {}", subdir_path); 93 | } 94 | } 95 | 96 | if !ft.is_empty() { 97 | info!("inserting {id}, time: {}", time.elapsed().as_secs()); 98 | let mut batch = keyspace.batch(); 99 | for (id, case) in ft.iter() { 100 | batch.insert( 101 | &db, 102 | (*id).to_be_bytes(), 103 | bincode::encode_to_vec(case, standard()).unwrap(), 104 | ); 105 | } 106 | batch.commit().unwrap(); 107 | ft.clear(); 108 | } 109 | 110 | info!("Done"); 111 | } 112 | -------------------------------------------------------------------------------- /src/bin/index.rs: -------------------------------------------------------------------------------- 1 | use std::path::Path; 2 | 3 | use bincode::config::standard; 4 | use cases::{CONFIG, Case, Tan, kv_sep_partition_option, remove_html_tags}; 5 | use fjall::Config; 6 | use tantivy::TantivyDocument; 7 | use tracing::info; 8 | use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; 9 | 10 | #[cfg(not(target_os = "windows"))] 11 | #[global_allocator] 12 | static GLOBAL: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; 13 | 14 | fn main() { 15 | tracing_subscriber::registry() 16 | .with(tracing_subscriber::EnvFilter::new( 17 | "info,tantivy=warn,html5ever=error", 18 | )) 19 | .with(tracing_subscriber::fmt::layer()) 20 | .init(); 21 | 22 | let schema = Tan::schema(); 23 | 24 | let id_field = schema.get_field("id").unwrap(); 25 | let case_id = schema.get_field("case_id").unwrap(); 26 | let case_name = schema.get_field("case_name").unwrap(); 27 | let court = schema.get_field("court").unwrap(); 28 | let case_type = schema.get_field("case_type").unwrap(); 29 | let procedure = schema.get_field("procedure").unwrap(); 30 | let year = schema.get_field("year").unwrap(); 31 | let month = schema.get_field("month").unwrap(); 32 | let day = schema.get_field("day").unwrap(); 33 | let judgment_date = schema.get_field("judgment_date").unwrap(); 34 | let public_date = schema.get_field("public_date").unwrap(); 35 | let parties = schema.get_field("parties").unwrap(); 36 | let cause = schema.get_field("cause").unwrap(); 37 | let legal_basis = schema.get_field("legal_basis").unwrap(); 38 | let full_text = schema.get_field("full_text").unwrap(); 39 | 40 | let index_path = Path::new(&CONFIG.index_path); 41 | if !index_path.exists() { 42 | std::fs::create_dir(index_path).unwrap(); 43 | } 44 | 45 | let index = Tan::index().unwrap(); 46 | let mut writer = index.writer(50 * 1024 * 1024).unwrap(); 47 | 48 | let time = std::time::Instant::now(); 49 | 50 | let keyspace_new = Config::new(&CONFIG.db) 51 | .max_write_buffer_size(256_000_000) 52 | .open() 53 | .unwrap(); 54 | 55 | let cases_new = keyspace_new 56 | .open_partition("cases", kv_sep_partition_option()) 57 | .unwrap(); 58 | 59 | for i in cases_new.iter() { 60 | let (k, v) = i.unwrap(); 61 | let id = u32::from_be_bytes(k[..].try_into().unwrap()); 62 | let (mut case, _): (Case, _) = bincode::decode_from_slice(&v, standard()).unwrap(); 63 | 64 | if CONFIG.index_with_full_text { 65 | case.full_text = remove_html_tags(&case.full_text); 66 | } 67 | 68 | let mut doc = TantivyDocument::default(); 69 | doc.add_u64(id_field, id as u64); 70 | if !case.case_id.is_empty() { 71 | doc.add_text(case_id, &case.case_id); 72 | } 73 | if !case.case_name.is_empty() { 74 | doc.add_text(case_name, &case.case_name); 75 | } 76 | if !case.court.is_empty() { 77 | doc.add_text(court, &case.court); 78 | } 79 | if !case.case_type.is_empty() { 80 | doc.add_text(case_type, &case.case_type); 81 | } 82 | if !case.procedure.is_empty() { 83 | doc.add_text(procedure, &case.procedure); 84 | } 85 | if !case.judgment_date.is_empty() { 86 | doc.add_text(judgment_date, &case.judgment_date); 87 | let s: Vec<&str> = case.judgment_date.split("-").collect(); 88 | if let Some(y) = s.first() { 89 | if let Ok(judge_year) = y.parse() { 90 | doc.add_u64(year, judge_year); 91 | } 92 | } 93 | if let Some(m) = s.get(1) { 94 | if let Ok(judge_month) = m.parse() { 95 | doc.add_u64(month, judge_month); 96 | } 97 | } 98 | if let Some(d) = s.get(2) { 99 | if let Ok(judge_day) = d.parse() { 100 | doc.add_u64(day, judge_day); 101 | } 102 | } 103 | } 104 | if !case.public_date.is_empty() { 105 | doc.add_text(public_date, &case.public_date); 106 | } 107 | if !case.parties.is_empty() { 108 | doc.add_text(parties, &case.parties); 109 | } 110 | if !case.cause.is_empty() { 111 | doc.add_text(cause, &case.cause); 112 | } 113 | if !case.legal_basis.is_empty() { 114 | doc.add_text(legal_basis, &case.legal_basis); 115 | } 116 | if CONFIG.index_with_full_text && !case.full_text.is_empty() { 117 | doc.add_text(full_text, &case.full_text); 118 | } 119 | writer.add_document(doc).unwrap(); 120 | 121 | if id % 10000 == 0 { 122 | writer.commit().unwrap(); 123 | info!("{} done, {}", id, time.elapsed().as_secs()); 124 | } 125 | } 126 | 127 | writer.commit().unwrap(); 128 | info!( 129 | "Total {}, {}", 130 | cases_new.approximate_len(), 131 | time.elapsed().as_secs() 132 | ); 133 | } 134 | -------------------------------------------------------------------------------- /src/bin/main.rs: -------------------------------------------------------------------------------- 1 | use axum::{Router, routing::get}; 2 | use cases::{AppState, CONFIG, Tan, case, help, kv_sep_partition_option, logo, search, style}; 3 | use fjall::Config; 4 | use std::{net::SocketAddr, sync::Arc, time::Duration}; 5 | use tokio::net::TcpListener; 6 | use tower::ServiceBuilder; 7 | use tower_http::{compression::CompressionLayer, timeout::TimeoutLayer}; 8 | use tracing::info; 9 | use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; 10 | 11 | #[cfg(not(target_os = "windows"))] 12 | #[global_allocator] 13 | static GLOBAL: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; 14 | 15 | #[tokio::main] 16 | async fn main() { 17 | tracing_subscriber::registry() 18 | .with(tracing_subscriber::EnvFilter::new("info,tantivy=warn")) 19 | .with(tracing_subscriber::fmt::layer()) 20 | .init(); 21 | 22 | let addr: SocketAddr = CONFIG.addr.parse().unwrap(); 23 | let searcher = Arc::new(Tan::searcher().unwrap()); 24 | 25 | let keyspace = Config::new(CONFIG.db.as_str()).open().unwrap(); 26 | let db = keyspace 27 | .open_partition("cases", kv_sep_partition_option()) 28 | .unwrap(); 29 | let app_state = AppState { db, searcher }; 30 | 31 | let middleware_stack = ServiceBuilder::new() 32 | .layer(CompressionLayer::new()) 33 | .layer(TimeoutLayer::new(Duration::from_secs(10))); 34 | 35 | let app = Router::new() 36 | .route("/", get(search)) 37 | .route("/case/{id}", get(case)) 38 | .route("/style.css", get(style)) 39 | .route("/help.txt", get(help)) 40 | .route("/logo.png", get(logo)) 41 | .layer(middleware_stack) 42 | .with_state(app_state); 43 | 44 | info!("listening on http://{}", addr); 45 | let listener = TcpListener::bind(addr).await.unwrap(); 46 | axum::serve(listener, app).await.unwrap(); 47 | } 48 | -------------------------------------------------------------------------------- /src/config.rs: -------------------------------------------------------------------------------- 1 | use serde::{Deserialize, Serialize}; 2 | use std::{fs::read_to_string, sync::LazyLock}; 3 | 4 | pub static CONFIG: LazyLock = LazyLock::new(Config::load_config); 5 | 6 | #[derive(Debug, Serialize, Deserialize)] 7 | pub struct Config { 8 | pub db: String, 9 | pub index_path: String, 10 | pub index_with_full_text: bool, 11 | pub addr: String, 12 | pub raw_data_path: Option, 13 | } 14 | 15 | impl Config { 16 | fn load_config() -> Config { 17 | let cfg_file = std::env::args() 18 | .nth(1) 19 | .unwrap_or_else(|| "config.toml".to_owned()); 20 | let config: Config = basic_toml::from_str(&read_to_string(cfg_file).unwrap()).unwrap(); 21 | config 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/controller.rs: -------------------------------------------------------------------------------- 1 | use askama::Template; 2 | use axum::{ 3 | body::Body, 4 | extract::{Path, Query, State}, 5 | http::{Response, StatusCode, header}, 6 | response::{Html, IntoResponse}, 7 | }; 8 | use bincode::config::standard; 9 | use indexmap::IndexSet; 10 | use serde::Deserialize; 11 | use tantivy::{ 12 | DocAddress, Score, TantivyDocument, 13 | collector::{Count, TopDocs}, 14 | schema::Value, 15 | }; 16 | use tracing::info; 17 | 18 | use crate::{AppState, Case, remove_html_tags}; 19 | 20 | #[derive(Template)] 21 | #[template(path = "case.html", escape = "none")] 22 | pub struct CasePage { 23 | case: Case, 24 | } 25 | 26 | pub async fn case(State(state): State, Path(id): Path) -> impl IntoResponse { 27 | info!("id: {}", id); 28 | if let Some(v) = state.db.get(id.to_be_bytes()).unwrap() { 29 | let (case, _): (Case, _) = bincode::decode_from_slice(&v, standard()).unwrap(); 30 | let case = CasePage { case }; 31 | into_response(&case) 32 | } else { 33 | (StatusCode::NOT_FOUND, "Not found").into_response() 34 | } 35 | } 36 | 37 | #[derive(Debug, Deserialize)] 38 | pub struct QuerySearch { 39 | search: Option, 40 | offset: Option, 41 | export: Option, 42 | } 43 | 44 | #[derive(Template)] 45 | #[template(path = "search.html")] 46 | pub struct SearchPage { 47 | search: String, 48 | offset: usize, 49 | total: usize, 50 | cases: Vec<(u32, String, Case)>, 51 | } 52 | 53 | pub async fn search( 54 | Query(input): Query, 55 | State(state): State, 56 | ) -> impl IntoResponse { 57 | let offset = input.offset.unwrap_or_default(); 58 | let search = input.search.unwrap_or_default(); 59 | let export = input.export.unwrap_or_default(); 60 | let limit = if export { 10000 } else { 20 }; 61 | let mut ids: IndexSet = IndexSet::with_capacity(20); 62 | let mut total = 0; 63 | if !search.is_empty() { 64 | if export { 65 | info!("exporting: {search}, offset: {offset}, limit: {limit}"); 66 | } else { 67 | info!("searching: {search}, offset: {offset}, limit: {limit}"); 68 | } 69 | let (query, _) = state.searcher.query_parser.parse_query_lenient(&search); 70 | let searcher = state.searcher.reader.searcher(); 71 | total = searcher.search(&query, &Count).unwrap(); 72 | 73 | let top_docs: Vec<(Score, DocAddress)> = searcher 74 | .search(&query, &TopDocs::with_limit(limit).and_offset(offset)) 75 | .unwrap_or_default(); 76 | 77 | for (_score, doc_address) in top_docs { 78 | if let Some(id) = searcher 79 | .doc::(doc_address) 80 | .unwrap() 81 | .get_first(state.searcher.id) 82 | .unwrap() 83 | .as_u64() 84 | { 85 | ids.insert(id as u32); 86 | } 87 | } 88 | } 89 | 90 | let mut cases = Vec::with_capacity(ids.len()); 91 | for id in ids { 92 | if let Some(v) = state.db.get(id.to_be_bytes()).unwrap() { 93 | let (case, _): (Case, _) = bincode::decode_from_slice(&v, standard()).unwrap(); 94 | let preview = remove_html_tags(&case.full_text) 95 | .chars() 96 | .take(240) 97 | .collect(); 98 | cases.push((id, preview, case)); 99 | } 100 | } 101 | 102 | // export to csv 103 | if export { 104 | let fname = format!("{}_{}_{}_{}.csv", search, total, limit, offset); 105 | let body = Vec::new(); 106 | let mut wtr = csv::Writer::from_writer(body); 107 | wtr.write_record([ 108 | "id", 109 | "url", 110 | "case_id", 111 | "case_name", 112 | "court", 113 | "case_type", 114 | "procedure", 115 | "judgment_date", 116 | "public_date", 117 | "parties", 118 | "cause", 119 | "legal_basis", 120 | "full_text", 121 | ]) 122 | .unwrap(); 123 | for (id, _, case) in &cases { 124 | wtr.write_record([ 125 | &id.to_string(), 126 | &case.doc_id, 127 | &case.case_id, 128 | &case.case_name, 129 | &case.court, 130 | &case.case_type, 131 | &case.procedure, 132 | &case.judgment_date, 133 | &case.public_date, 134 | &case.parties, 135 | &case.cause, 136 | &case.legal_basis, 137 | &case.full_text, 138 | ]) 139 | .unwrap(); 140 | } 141 | wtr.flush().unwrap(); 142 | 143 | let headers = [ 144 | (header::CONTENT_TYPE, "text/csv; charset=utf-8"), 145 | ( 146 | header::CONTENT_DISPOSITION, 147 | &format!("attachment; filename={}", fname), 148 | ), 149 | ]; 150 | return (headers, wtr.into_inner().unwrap()).into_response(); 151 | } 152 | 153 | let body = SearchPage { 154 | search, 155 | offset, 156 | cases, 157 | total, 158 | }; 159 | 160 | into_response(&body) 161 | } 162 | 163 | pub async fn style() -> impl IntoResponse { 164 | let headers = [ 165 | (header::CONTENT_TYPE, "text/css"), 166 | ( 167 | header::CACHE_CONTROL, 168 | "public, max-age=1209600, s-maxage=86400", 169 | ), 170 | ]; 171 | 172 | (headers, include_str!("../static/style.css")) 173 | } 174 | 175 | pub async fn logo() -> impl IntoResponse { 176 | let headers = [ 177 | (header::CONTENT_TYPE, "image/png"), 178 | ( 179 | header::CACHE_CONTROL, 180 | "public, max-age=1209600, s-maxage=86400", 181 | ), 182 | ]; 183 | 184 | (headers, include_bytes!("../static/logo.png").as_slice()) 185 | } 186 | 187 | pub async fn help() -> impl IntoResponse { 188 | let headers = [ 189 | (header::CONTENT_TYPE, "text/plain; charset=utf-8"), 190 | ( 191 | header::CACHE_CONTROL, 192 | "public, max-age=1209600, s-maxage=86400", 193 | ), 194 | ]; 195 | 196 | (headers, include_bytes!("../static/help.txt").as_slice()) 197 | } 198 | 199 | fn into_response(t: &T) -> Response { 200 | match t.render() { 201 | Ok(body) => Html(body).into_response(), 202 | Err(_) => StatusCode::INTERNAL_SERVER_ERROR.into_response(), 203 | } 204 | } 205 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | use bincode::{Decode, Encode}; 2 | pub use config::CONFIG; 3 | pub use controller::{case, help, logo, search, style}; 4 | use fjall::{KvSeparationOptions, PartitionCreateOptions, PartitionHandle}; 5 | use scraper::Html; 6 | use serde::{Deserialize, Serialize}; 7 | use std::sync::Arc; 8 | use tantivy::Searcher; 9 | pub use tantivy::Tan; 10 | 11 | mod config; 12 | mod controller; 13 | mod tantivy; 14 | 15 | #[derive(Clone)] 16 | pub struct AppState { 17 | pub db: PartitionHandle, 18 | pub searcher: Arc, 19 | } 20 | 21 | pub fn kv_sep_partition_option() -> PartitionCreateOptions { 22 | PartitionCreateOptions::default() 23 | .max_memtable_size(128_000_000) 24 | .with_kv_separation( 25 | KvSeparationOptions::default() 26 | .separation_threshold(750) 27 | .file_target_size(256_000_000), 28 | ) 29 | } 30 | 31 | #[derive(Debug, Encode, Decode, Serialize, Deserialize)] 32 | pub struct Case { 33 | #[serde(rename = "原始链接")] 34 | pub doc_id: String, 35 | #[serde(rename = "案号")] 36 | pub case_id: String, 37 | #[serde(rename = "案件名称")] 38 | pub case_name: String, 39 | #[serde(rename = "法院")] 40 | pub court: String, 41 | // #[serde(rename = "所属地区")] 42 | // pub region: String, 43 | #[serde(rename = "案件类型")] 44 | pub case_type: String, 45 | // #[serde(rename = "案件类型编码")] 46 | // case_type_code: String, 47 | // #[serde(rename = "来源")] 48 | // source: String, 49 | #[serde(rename = "审理程序")] 50 | pub procedure: String, 51 | #[serde(rename = "裁判日期")] 52 | pub judgment_date: String, 53 | #[serde(rename = "公开日期")] 54 | pub public_date: String, 55 | #[serde(rename = "当事人")] 56 | pub parties: String, 57 | #[serde(rename = "案由")] 58 | pub cause: String, 59 | #[serde(rename = "法律依据")] 60 | pub legal_basis: String, 61 | #[serde(rename = "全文")] 62 | pub full_text: String, 63 | } 64 | 65 | pub fn remove_html_tags(html: &str) -> String { 66 | let document = Html::parse_document(html); 67 | document.root_element().text().collect::>().join(" ") 68 | } 69 | -------------------------------------------------------------------------------- /src/tantivy.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashSet; 2 | 3 | use tantivy::{ 4 | IndexReader, ReloadPolicy, 5 | directory::MmapDirectory, 6 | query::QueryParser, 7 | schema::{ 8 | Field, IndexRecordOption, NumericOptions, STORED, Schema, SchemaBuilder, TextFieldIndexing, 9 | TextOptions, 10 | }, 11 | tokenizer::{RemoveLongFilter, StopWordFilter, TextAnalyzer}, 12 | }; 13 | 14 | use crate::CONFIG; 15 | 16 | pub struct Searcher { 17 | pub reader: IndexReader, 18 | pub query_parser: QueryParser, 19 | pub id: Field, 20 | } 21 | 22 | pub struct Tan; 23 | impl Tan { 24 | pub fn schema() -> Schema { 25 | let mut schema_builder = SchemaBuilder::default(); 26 | 27 | let text_indexing = TextFieldIndexing::default() 28 | .set_tokenizer("jieba") 29 | .set_index_option(IndexRecordOption::WithFreqsAndPositions); 30 | let num_options = NumericOptions::default().set_indexed(); 31 | let text_options_nostored = TextOptions::default().set_indexing_options(text_indexing); 32 | schema_builder.add_u64_field("id", STORED); 33 | schema_builder.add_text_field("case_id", text_options_nostored.clone()); 34 | schema_builder.add_text_field("case_name", text_options_nostored.clone()); 35 | schema_builder.add_text_field("court", text_options_nostored.clone()); 36 | schema_builder.add_text_field("case_type", text_options_nostored.clone()); 37 | schema_builder.add_text_field("procedure", text_options_nostored.clone()); 38 | schema_builder.add_text_field("judgment_date", text_options_nostored.clone()); 39 | schema_builder.add_u64_field("year", num_options.clone()); 40 | schema_builder.add_u64_field("month", num_options.clone()); 41 | schema_builder.add_u64_field("day", num_options); 42 | schema_builder.add_text_field("public_date", text_options_nostored.clone()); 43 | schema_builder.add_text_field("parties", text_options_nostored.clone()); 44 | schema_builder.add_text_field("cause", text_options_nostored.clone()); 45 | 46 | schema_builder.add_text_field("legal_basis", text_options_nostored.clone()); 47 | schema_builder.add_text_field("full_text", text_options_nostored); 48 | schema_builder.build() 49 | } 50 | 51 | pub fn index() -> tantivy::Result { 52 | let path = std::path::Path::new(CONFIG.index_path.as_str()); 53 | if !path.exists() { 54 | std::fs::create_dir(path).unwrap(); 55 | } 56 | let schema = Self::schema(); 57 | let index = tantivy::Index::open_or_create(MmapDirectory::open(path).unwrap(), schema)?; 58 | let stop_words = stop_words::get(stop_words::LANGUAGE::Chinese); 59 | let custom_stop_words = include_str!("../stopwords.txt"); 60 | let mut custom_stop_words: HashSet = custom_stop_words 61 | .split_whitespace() 62 | .map(|x| x.to_owned()) 63 | .collect(); 64 | custom_stop_words.extend(stop_words); 65 | 66 | let jieba_tokenizer = tantivy_jieba::JiebaTokenizer {}; 67 | let tokenizer = TextAnalyzer::builder(jieba_tokenizer) 68 | .filter(StopWordFilter::remove(custom_stop_words)) 69 | .filter(RemoveLongFilter::limit(40)) 70 | .build(); 71 | index.tokenizers().register("jieba", tokenizer); 72 | 73 | Ok(index) 74 | } 75 | 76 | pub fn searcher() -> tantivy::Result { 77 | let schema = Self::schema(); 78 | 79 | let id = schema.get_field("id")?; 80 | let case_id = schema.get_field("case_id")?; 81 | let case_name = schema.get_field("case_name")?; 82 | let court = schema.get_field("court")?; 83 | let case_type = schema.get_field("case_type")?; 84 | let cause = schema.get_field("cause")?; 85 | let legal_basis = schema.get_field("legal_basis")?; 86 | let parties = schema.get_field("parties")?; 87 | let procedure = schema.get_field("procedure")?; 88 | let judgment_date = schema.get_field("judgment_date")?; 89 | let year = schema.get_field("year")?; 90 | let month = schema.get_field("month")?; 91 | let day = schema.get_field("day")?; 92 | let public_date = schema.get_field("public_date")?; 93 | let full_text = schema.get_field("full_text")?; 94 | 95 | let index = Self::index()?; 96 | let mut default_fields = vec![ 97 | case_id, 98 | case_name, 99 | court, 100 | case_type, 101 | cause, 102 | legal_basis, 103 | parties, 104 | procedure, 105 | judgment_date, 106 | year, 107 | month, 108 | day, 109 | public_date, 110 | ]; 111 | 112 | if CONFIG.index_with_full_text { 113 | default_fields.push(full_text); 114 | } 115 | 116 | let mut query_parser = QueryParser::for_index(&index, default_fields); 117 | 118 | query_parser.set_conjunction_by_default(); 119 | query_parser.set_field_boost(case_id, 9.); 120 | query_parser.set_field_boost(case_name, 3.); 121 | 122 | let reader = index 123 | .reader_builder() 124 | .reload_policy(ReloadPolicy::OnCommitWithDelay) 125 | .try_into()?; 126 | 127 | Ok(Searcher { 128 | reader, 129 | query_parser, 130 | id, 131 | }) 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /static/help.txt: -------------------------------------------------------------------------------- 1 | Tantivy 查询语法简明指南(适用于案件检索系统) 2 | 3 | 可用字段一览: 4 | 5 | 字段名 | 说明 | 类型 6 | ----------------|--------------|-------- 7 | case_id | 案件编号 | 文本 8 | case_name | 案件名称 | 文本 9 | court | 法院 | 文本 10 | case_type | 案件类型 | 文本 11 | procedure | 审理程序 | 文本 12 | judgment_date | 判决日期 | 文本 13 | year | 年份 | 数字 14 | month | 月份 | 数字 15 | day | 日期 | 数字 16 | public_date | 公开日期 | 文本 17 | parties | 当事人 | 文本 18 | cause | 案由 | 文本 19 | legal_basis | 法律依据 | 文本 20 | full_text | 全文 | 文本 21 | 22 | ----------------------------- 23 | 24 | ⚠️ 注意:查询语法中的所有标点符号(如冒号、引号、括号等)必须使用英文半角格式。 25 | 26 | 多字段组合示例: 27 | 28 | 示例 1: 29 | case_name:离婚 AND court:中级人民法院 30 | 31 | 示例 2: 32 | cause:交通事故 OR procedure:二审 33 | 34 | 示例 3: 35 | court:上海 AND -cause:合同 36 | 37 | 示例 4: 38 | court:高级人民法院 AND (full_text:侵权 OR full_text:赔偿) 39 | 40 | 示例 5: 41 | case_name:"抚养 纠纷" AND year:[2021 TO 2023] 42 | 43 | ----------------------------- 44 | 45 | 查询语法说明: 46 | 47 | 1. 基本关键词搜索: 48 | 离婚 判决 49 | 说明:在所有默认字段中查找“离婚”或“判决” 50 | 51 | 2. 指定字段搜索: 52 | case_name:离婚 53 | 说明:仅匹配案件名称中包含“离婚”的文档 54 | 55 | case_name:离婚 判决 56 | 说明:等价于 case_name:离婚 AND 判决(字段只作用于第一个词) 57 | 58 | 3. 布尔逻辑组合: 59 | case_type:民事 AND court:上海 60 | +court:上海 -cause:合同 61 | 说明:使用 AND / OR 或 +(必须)/ -(排除)组合逻辑 62 | 63 | 4. 精确短语查询: 64 | case_name:"离婚 纠纷" 65 | 说明:匹配“离婚纠纷”连续出现的文档 66 | 67 | 5. 范围查询(数字 / 日期): 68 | year:[2020 TO 2023] 69 | 说明:[] 包含边界;{} 排除边界 70 | 71 | 6. 集合查询(IN): 72 | court: IN [北京 上海 广州] 73 | 说明:等价于 court:北京 OR court:上海 OR court:广州 74 | 75 | 7. 加权查询(Boost): 76 | case_type:刑事^2.0 OR 民事^0.5 77 | 说明:提高包含“刑事”文档的得分 78 | 79 | ----------------------------- 80 | 81 | 82 | 更多语法详见: 83 | https://docs.rs/tantivy/latest/tantivy/query/struct.QueryParser.html 84 | 85 | 导出功能: 86 | 最多导出10000条,调整offset参数可获得更多结果,offset=10000,即可获得第10000~20000条结果。如: 87 | https://caseopen.org/?search=%E6%8B%90%E5%8D%96&offset=10000&search_type=default&export=true 88 | 89 | 更多合作请发邮件至 contact@caseopen.org 90 | -------------------------------------------------------------------------------- /static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cncases/cases/d2dc319b3ed05cece9402cda447f775372230882/static/logo.png -------------------------------------------------------------------------------- /static/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: arial, sans-serif; 3 | min-height: 100vh; 4 | display: flex; 5 | flex-direction: column; 6 | } 7 | 8 | .nav { 9 | display: flex; 10 | align-items: center; 11 | justify-content: flex-end; 12 | gap: 10px; 13 | margin-top: 10px; 14 | } 15 | 16 | .search { 17 | display: flex; 18 | flex-direction: column; 19 | align-items: center; 20 | justify-content: center; 21 | height: 55vh; 22 | margin-top: 85px; 23 | } 24 | 25 | .logo { 26 | display: block; 27 | } 28 | 29 | .searchbar { 30 | margin-top: 30px; 31 | display: flex; 32 | align-items: center; 33 | justify-content: space-between; 34 | width: 560px; 35 | height: 25px; 36 | padding: 10px; 37 | border: 1px solid #ddd; 38 | border-radius: 30px; 39 | } 40 | 41 | .search-input { 42 | width: 100%; 43 | height: 100%; 44 | border: none; 45 | outline: none; 46 | background-color: transparent; 47 | } 48 | 49 | .search-header { 50 | border-bottom: 1px solid #e6e8eb; 51 | } 52 | 53 | .search-nav { 54 | display: flex; 55 | align-items: center; 56 | margin-top: 10px; 57 | margin-left: 15px; 58 | } 59 | 60 | .search-button { 61 | background: none; 62 | border: none; 63 | } 64 | 65 | .search-nav > a > img { 66 | width: 120px; 67 | margin-top: 12px; 68 | } 69 | 70 | .search-second-nav { 71 | display: flex; 72 | align-items: center; 73 | justify-content: space-between; 74 | margin-top: 11px; 75 | margin-left: 150px; 76 | width: 575px; 77 | } 78 | 79 | .search-second-nav .search-type a { 80 | font-family: 81 | Google Sans, 82 | arial, 83 | sans-serif; 84 | color: #777; 85 | font-size: 14px; 86 | text-decoration: none; 87 | padding: 10px 15px; 88 | line-height: 19px; 89 | border: 1px solid transparent; 90 | border-radius: 2px; 91 | } 92 | 93 | .noline { 94 | text-decoration: none; 95 | } 96 | 97 | .search-second-nav .selected { 98 | border-bottom: 3px solid #1a73e8; 99 | color: #1a73e8; 100 | } 101 | 102 | .search-second-nav div { 103 | display: flex; 104 | } 105 | 106 | .search-searchbar { 107 | margin-top: 10px; 108 | margin-left: 17px; 109 | } 110 | 111 | .search-text { 112 | vertical-align: sub; 113 | margin-left: 10px; 114 | } 115 | 116 | /* Search Results */ 117 | 118 | .search-results { 119 | margin-left: 150px; 120 | width: 632px; 121 | margin-bottom: 30px; 122 | } 123 | 124 | .search-result-text { 125 | margin-top: 12px; 126 | } 127 | 128 | .search-result-text h3 { 129 | font-family: arial, sans-serif; 130 | font-size: 20px; 131 | font-weight: 400; 132 | color: #1a0dab; 133 | margin-block-start: 0em; 134 | margin-block-end: 0em; 135 | margin-top: 5px; 136 | } 137 | 138 | .search-result-text p { 139 | font-family: arial, sans-serif; 140 | font-size: 14px; 141 | font-weight: 400; 142 | color: #4d5156; 143 | margin-block-start: 0em; 144 | margin-block-end: 0em; 145 | margin-top: 5px; 146 | margin-bottom: 5px; 147 | line-height: 22.12px; 148 | } 149 | 150 | .search-result-text a { 151 | font-family: arial, sans-serif; 152 | font-size: 14px; 153 | font-weight: 400; 154 | color: #1a0dab; 155 | margin-block-start: 0em; 156 | margin-block-end: 0em; 157 | text-decoration: none; 158 | } 159 | 160 | .search-result-text a:hover { 161 | text-decoration: underline; 162 | } 163 | 164 | .search-result-text .nounderline:hover { 165 | text-decoration: none; 166 | } 167 | 168 | .search-result-text .underlineonhover:hover { 169 | text-decoration: underline; 170 | } 171 | 172 | .pagination { 173 | margin-top: 30px; 174 | margin-left: 150px; 175 | margin-bottom: 60px; 176 | width: 632px; 177 | } 178 | 179 | .pagination a { 180 | text-decoration: none; 181 | } 182 | 183 | .full_text { 184 | line-height: 25pt; 185 | text-indent: 30pt; 186 | margin: 0.5pt 0cm; 187 | font-family: 宋体; 188 | font-size: 15pt; 189 | text-align: justify; 190 | 191 | .c_right { 192 | text-align: right; 193 | } 194 | } 195 | 196 | .full_text > div:not(.c_right):nth-child(-n + 3) { 197 | text-align: center; 198 | font-family: 黑体; 199 | font-size: 18pt; 200 | } 201 | 202 | footer { 203 | margin-left: 150px; 204 | border-top: 2px solid #eef; 205 | margin-top: auto; 206 | } 207 | 208 | @media only screen and (max-width: 600px) { 209 | .searchbar { 210 | max-width: -webkit-fill-available; 211 | } 212 | 213 | .mobile-none { 214 | display: none; 215 | } 216 | 217 | .mobile-padding { 218 | padding-left: 0px; 219 | } 220 | 221 | footer { 222 | margin-left: 0px; 223 | } 224 | 225 | .search-nav { 226 | flex-wrap: wrap; 227 | justify-content: center; 228 | } 229 | 230 | .search-results { 231 | margin-left: 0px; 232 | width: 100%; 233 | } 234 | 235 | .search-searchbar { 236 | margin-left: 0px; 237 | max-width: 300px; 238 | } 239 | 240 | .search-mobile-none { 241 | display: none !important; 242 | } 243 | 244 | .search-second-nav { 245 | margin-left: 0px; 246 | width: 100%; 247 | } 248 | 249 | .search-second-nav a { 250 | padding: 10px 10px; 251 | } 252 | 253 | .search-mobile-none { 254 | display: none !important; 255 | } 256 | } 257 | -------------------------------------------------------------------------------- /stopwords.txt: -------------------------------------------------------------------------------- 1 | > 2 | p 3 | < 4 | , 5 | : 6 | × 7 | - 8 | / 9 | ; 10 | . 11 | * 12 | � 13 | # 14 | & 15 | ” 16 | “ 17 | 原告 18 | 被告 19 | 原 20 | 本院 21 | 委托 22 | 裁定 23 | 双方 24 | 证据 25 | 提出 26 | 副本 27 | 马克 28 | 人民检察院 29 | 辩称 30 | 组成 31 | 合议庭 32 | 共计 33 | 判处 34 | 准许 35 | 本次 36 | 提供 37 | 法律 38 | 公诉 39 | 同意 40 | 判令 41 | 上诉 42 | 证明 43 | 申请人 44 | 成立 45 | 诉 46 | 决 47 | 裁 48 | 人民法院 49 | 被上诉人 50 | 代理人 51 | 终结 52 | 法院 53 | 被告人 54 | 汉族 55 | 以下 56 | 机关 57 | 到庭 58 | 上诉人 59 | 本院认为 60 | 认为 61 | 予以 62 | 主张 63 | 支持 64 | 请求 65 | 判决 66 | 递交 67 | 受理费 68 | 上诉状 69 | 本案 70 | 一份 71 | 审判员 72 | 中华人民共和国 73 | 中国 74 | 适用 75 | 有限责任 76 | 罪 77 | 条 78 | 判 79 | 字 80 | 系 81 | 书 82 | 之日起 83 | 判决书 84 | 义务 85 | 案件 86 | 股份 87 | 若干 88 | 问题 89 | 实施 90 | 生效 91 | 解释 92 | 规定 93 | 审理 94 | 期限 95 | 一案 96 | 原审 97 | 效力 98 | 上述 99 | 出生 100 | 诉讼请求 101 | 确认 102 | X 103 | 犯 104 | 类 105 | 执 106 | 案 107 | 元 108 | 号 109 | 公司 110 | 申请 111 | 执行 112 | 未 113 | 支付 114 | 履行 115 | 约定 116 | 依法 117 | 承担 118 | 事实 119 | 被执行人 120 | 当事人 121 | 期间 122 | 诉讼 123 | 应当 124 | 责任 125 | 进行 126 | 没有 127 | 发生 128 | 参加 129 | 送达 130 | 提交 131 | 不服 132 | 不予 133 | 费用 134 | 符合 135 | 受理 136 | 数据网 137 | 负担 138 | 立案 139 | 十日 140 | 登记 141 | 事务所律师 142 | 驳回 143 | 协议 144 | 指定 145 | 提起 146 | 无异议 147 | 开庭 148 | 处理 149 | 造成 150 | 异议 151 | 传唤 152 | 撤回 153 | 罪犯 154 | 简称 155 | 人民陪审员 156 | 书记员 157 | 综上 158 | 有限公司 159 | 认定 160 | 要求 161 | 人民币 162 | 起诉 163 | 员 164 | 情况 165 | 出具 166 | 查明 167 | 作出 168 | 羁押 169 | 审判 170 | 确定 171 | 取得 172 | 继续 173 | 同期 174 | 享有 175 | 补偿 176 | 再次 177 | 后果 178 | 能够 179 | 因涉嫌 180 | 足以认定 181 | 采取 182 | 充分 183 | 仅 184 | 经审查 185 | 接受 186 | 受害人 187 | 如实 188 | 情形 189 | 调查 190 | 相关 191 | 现已 192 | 交纳 193 | 通知 194 | xa0 195 | 事实清楚 196 | 不能 197 | 代理 198 | 实际 199 | 表示 200 | 适用法律 201 | 明确 202 | 缴纳 -------------------------------------------------------------------------------- /templates/case.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 裁判文书网 - {{case.case_id}} - {{case.case_name}} 11 | 12 | 13 | 14 |
15 |
16 |

{{ case.case_name }}

17 |

裁判日期:{{ case.judgment_date }}

18 |

发布日期:{{ case.public_date }}

19 |

案号:{{case.case_id}}

20 |

法院:{{ case.court }}

21 |

案件类型:{{ case.case_type }}

22 |

审理程序:{{ case.procedure }}

23 |

当事人:{{ case.parties }}

24 |

案由:{{ case.cause }}

25 |

原始链接:{{ case.doc_id }}

26 |

法律依据:{{ case.legal_basis }}

27 |

28 |

29 |

全文

30 |
{{ case.full_text }}
31 |
32 |
33 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /templates/search.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 裁判文书网 11 | 12 | 13 | 14 |
15 | 30 | 51 |
52 | 53 |
54 | {% for (id, preview, case) in cases %} 55 |
56 | 57 |

{{ case.case_name }}

58 |
59 |

60 | {{ case.judgment_date }} - {{ case.case_type }} - {{ 61 | case.procedure }} 62 |

63 |

{{ preview }}

64 | {{case.case_id}} - {{ case.court }} 67 |
68 | {% endfor %} 69 |
70 | 71 | 78 | 86 | 87 | 88 | --------------------------------------------------------------------------------