mirror of
https://github.com/meilisearch/MeiliSearch
synced 2025-01-11 14:04:31 +01:00
Merge remote-tracking branch 'origin/main' into search-refactor
This commit is contained in:
commit
a81165f0d8
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -23,7 +23,8 @@ A clear and concise description of what you expected to happen.
|
|||||||
**Screenshots**
|
**Screenshots**
|
||||||
If applicable, add screenshots to help explain your problem.
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
**Meilisearch version:** [e.g. v0.20.0]
|
**Meilisearch version:**
|
||||||
|
[e.g. v0.20.0]
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
Additional information that may be relevant to the issue.
|
Additional information that may be relevant to the issue.
|
||||||
|
34
.github/ISSUE_TEMPLATE/sprint_issue.md
vendored
Normal file
34
.github/ISSUE_TEMPLATE/sprint_issue.md
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
name: New sprint issue
|
||||||
|
about: ⚠️ Should only be used by the engine team ⚠️
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Related product team resources: [roadmap card]() (_internal only_) and [PRD]() (_internal only_)
|
||||||
|
Related product discussion:
|
||||||
|
Related spec: WIP
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
<!---Copy/paste the information in the roadmap resources or briefly detail the product motivation. Ask product team if any hesitation.-->
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
<!---Write a quick description of the usage if the usage has already been defined-->
|
||||||
|
|
||||||
|
Refer to the final spec to know the details and the final decisions about the usage.
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
|
||||||
|
<!---Feel free to adapt this list with more technical/product steps-->
|
||||||
|
|
||||||
|
- [ ] Release a prototype
|
||||||
|
- [ ] If prototype validated, merge changes into `main`
|
||||||
|
- [ ] Update the spec
|
||||||
|
|
||||||
|
## Impacted teams
|
||||||
|
|
||||||
|
<!---Ping the related teams. Ask for the engine manager if any hesitation-->
|
40
.github/workflows/publish-binaries.yml
vendored
40
.github/workflows/publish-binaries.yml
vendored
@ -96,14 +96,12 @@ jobs:
|
|||||||
|
|
||||||
publish-macos-apple-silicon:
|
publish-macos-apple-silicon:
|
||||||
name: Publish binary for macOS silicon
|
name: Publish binary for macOS silicon
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: macos-12
|
||||||
needs: check-version
|
needs: check-version
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: macos-12
|
- target: aarch64-apple-darwin
|
||||||
target: aarch64-apple-darwin
|
|
||||||
asset_name: meilisearch-macos-apple-silicon
|
asset_name: meilisearch-macos-apple-silicon
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
@ -132,21 +130,29 @@ jobs:
|
|||||||
|
|
||||||
publish-aarch64:
|
publish-aarch64:
|
||||||
name: Publish binary for aarch64
|
name: Publish binary for aarch64
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ubuntu-latest
|
||||||
needs: check-version
|
needs: check-version
|
||||||
|
container:
|
||||||
|
# Use ubuntu-18.04 to compile with glibc 2.27
|
||||||
|
image: ubuntu:18.04
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- build: aarch64
|
- target: aarch64-unknown-linux-gnu
|
||||||
os: ubuntu-18.04
|
|
||||||
target: aarch64-unknown-linux-gnu
|
|
||||||
linker: gcc-aarch64-linux-gnu
|
|
||||||
use-cross: true
|
|
||||||
asset_name: meilisearch-linux-aarch64
|
asset_name: meilisearch-linux-aarch64
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
- name: Install needed dependencies
|
||||||
|
run: |
|
||||||
|
apt-get update -y && apt upgrade -y
|
||||||
|
apt-get install -y curl build-essential gcc-aarch64-linux-gnu
|
||||||
|
- name: Set up Docker for cross compilation
|
||||||
|
run: |
|
||||||
|
apt-get install -y curl apt-transport-https ca-certificates software-properties-common
|
||||||
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
|
||||||
|
add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
|
||||||
|
apt-get update -y && apt-get install -y docker-ce
|
||||||
- name: Installing Rust toolchain
|
- name: Installing Rust toolchain
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
@ -154,15 +160,7 @@ jobs:
|
|||||||
profile: minimal
|
profile: minimal
|
||||||
target: ${{ matrix.target }}
|
target: ${{ matrix.target }}
|
||||||
override: true
|
override: true
|
||||||
- name: APT update
|
|
||||||
run: |
|
|
||||||
sudo apt update
|
|
||||||
- name: Install target specific tools
|
|
||||||
if: matrix.use-cross
|
|
||||||
run: |
|
|
||||||
sudo apt-get install -y ${{ matrix.linker }}
|
|
||||||
- name: Configure target aarch64 GNU
|
- name: Configure target aarch64 GNU
|
||||||
if: matrix.target == 'aarch64-unknown-linux-gnu'
|
|
||||||
## Environment variable is not passed using env:
|
## Environment variable is not passed using env:
|
||||||
## LD gold won't work with MUSL
|
## LD gold won't work with MUSL
|
||||||
# env:
|
# env:
|
||||||
@ -176,8 +174,10 @@ jobs:
|
|||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
command: build
|
command: build
|
||||||
use-cross: ${{ matrix.use-cross }}
|
use-cross: true
|
||||||
args: --release --target ${{ matrix.target }}
|
args: --release --target ${{ matrix.target }}
|
||||||
|
env:
|
||||||
|
CROSS_DOCKER_IN_DOCKER: true
|
||||||
- name: List target output files
|
- name: List target output files
|
||||||
run: ls -lR ./target
|
run: ls -lR ./target
|
||||||
- name: Upload the binary to release
|
- name: Upload the binary to release
|
||||||
|
10
.github/workflows/test-suite.yml
vendored
10
.github/workflows/test-suite.yml
vendored
@ -43,7 +43,7 @@ jobs:
|
|||||||
toolchain: nightly
|
toolchain: nightly
|
||||||
override: true
|
override: true
|
||||||
- name: Cache dependencies
|
- name: Cache dependencies
|
||||||
uses: Swatinem/rust-cache@v2.2.0
|
uses: Swatinem/rust-cache@v2.2.1
|
||||||
- name: Run cargo check without any default features
|
- name: Run cargo check without any default features
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
@ -65,7 +65,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: Cache dependencies
|
- name: Cache dependencies
|
||||||
uses: Swatinem/rust-cache@v2.2.0
|
uses: Swatinem/rust-cache@v2.2.1
|
||||||
- name: Run cargo check without any default features
|
- name: Run cargo check without any default features
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
@ -123,7 +123,7 @@ jobs:
|
|||||||
toolchain: stable
|
toolchain: stable
|
||||||
override: true
|
override: true
|
||||||
- name: Cache dependencies
|
- name: Cache dependencies
|
||||||
uses: Swatinem/rust-cache@v2.2.0
|
uses: Swatinem/rust-cache@v2.2.1
|
||||||
- name: Run tests in debug
|
- name: Run tests in debug
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
@ -142,7 +142,7 @@ jobs:
|
|||||||
override: true
|
override: true
|
||||||
components: clippy
|
components: clippy
|
||||||
- name: Cache dependencies
|
- name: Cache dependencies
|
||||||
uses: Swatinem/rust-cache@v2.2.0
|
uses: Swatinem/rust-cache@v2.2.1
|
||||||
- name: Run cargo clippy
|
- name: Run cargo clippy
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
@ -162,7 +162,7 @@ jobs:
|
|||||||
override: true
|
override: true
|
||||||
components: rustfmt
|
components: rustfmt
|
||||||
- name: Cache dependencies
|
- name: Cache dependencies
|
||||||
uses: Swatinem/rust-cache@v2.2.0
|
uses: Swatinem/rust-cache@v2.2.1
|
||||||
- name: Run cargo fmt
|
- name: Run cargo fmt
|
||||||
# Since we never ran the `build.rs` script in the benchmark directory we are missing one auto-generated import file.
|
# Since we never ran the `build.rs` script in the benchmark directory we are missing one auto-generated import file.
|
||||||
# Since we want to trigger (and fail) this action as fast as possible, instead of building the benchmark crate
|
# Since we want to trigger (and fail) this action as fast as possible, instead of building the benchmark crate
|
||||||
|
@ -120,29 +120,9 @@ The full Meilisearch release process is described in [this guide](https://github
|
|||||||
|
|
||||||
Depending on the developed feature, you might need to provide a prototyped version of Meilisearch to make it easier to test by the users.
|
Depending on the developed feature, you might need to provide a prototyped version of Meilisearch to make it easier to test by the users.
|
||||||
|
|
||||||
The prototype name must follow this convention: `prototype-X-Y` where
|
This happens in two steps:
|
||||||
- `X` is the feature name formatted in `kebab-case`. It should not end with a single number.
|
- [Release the prototype](https://github.com/meilisearch/engine-team/blob/main/resources/prototypes.md#how-to-publish-a-prototype)
|
||||||
- `Y` is the version of the prototype, starting from `0`.
|
- [Communicate about it](https://github.com/meilisearch/engine-team/blob/main/resources/prototypes.md#communication)
|
||||||
|
|
||||||
✅ Example: `prototype-auto-resize-0`. </br>
|
|
||||||
❌ Bad example: `auto-resize-0`: lacks the `prototype` prefix. </br>
|
|
||||||
❌ Bad example: `prototype-auto-resize`: lacks the version suffix. </br>
|
|
||||||
❌ Bad example: `prototype-auto-resize-0-0`: feature name ends with a single number.
|
|
||||||
|
|
||||||
Steps to create a prototype:
|
|
||||||
|
|
||||||
1. In your terminal, go to the last commit of your branch (the one you want to provide as a prototype).
|
|
||||||
2. Create a tag following the convention: `git tag prototype-X-Y`
|
|
||||||
3. Run Meilisearch and check that its launch summary features a line: `Prototype: prototype-X-Y` (you may need to switch branches and back after tagging for this to work).
|
|
||||||
3. Push the tag: `git push origin prototype-X-Y`
|
|
||||||
4. Check the [Docker CI](https://github.com/meilisearch/meilisearch/actions/workflows/publish-docker-images.yml) is now running.
|
|
||||||
|
|
||||||
🐳 Once the CI has finished to run (~1h30), a Docker image named `prototype-X-Y` will be available on [DockerHub](https://hub.docker.com/repository/docker/getmeili/meilisearch/general). People can use it with the following command: `docker run -p 7700:7700 -v $(pwd)/meili_data:/meili_data getmeili/meilisearch:prototype-X-Y`. <br>
|
|
||||||
More information about [how to run Meilisearch with Docker](https://docs.meilisearch.com/learn/cookbooks/docker.html#download-meilisearch-with-docker).
|
|
||||||
|
|
||||||
⚙️ However, no binaries will be created. If the users do not use Docker, they can go to the `prototype-X-Y` tag in the Meilisearch repository and compile from the source code.
|
|
||||||
|
|
||||||
⚠️ When sharing a prototype with users, remind them to not use it in production. Prototypes are solely for test purposes.
|
|
||||||
|
|
||||||
### Release assets
|
### Release assets
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ impl<'a> Display for Error<'a> {
|
|||||||
writeln!(f, "The `_geoBoundingBox` filter expects two pairs of arguments: `_geoBoundingBox([latitude, longitude], [latitude, longitude])`.")?
|
writeln!(f, "The `_geoBoundingBox` filter expects two pairs of arguments: `_geoBoundingBox([latitude, longitude], [latitude, longitude])`.")?
|
||||||
}
|
}
|
||||||
ErrorKind::ReservedGeo(name) => {
|
ErrorKind::ReservedGeo(name) => {
|
||||||
writeln!(f, "`{}` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance), or _geoBoundingBox([latitude, longitude], [latitude, longitude]) built-in rules to filter on `_geo` coordinates.", name.escape_debug())?
|
writeln!(f, "`{}` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance)` or `_geoBoundingBox([latitude, longitude], [latitude, longitude])` built-in rules to filter on `_geo` coordinates.", name.escape_debug())?
|
||||||
}
|
}
|
||||||
ErrorKind::MisusedGeoRadius => {
|
ErrorKind::MisusedGeoRadius => {
|
||||||
writeln!(f, "The `_geoRadius` filter is an operation and can't be used as a value.")?
|
writeln!(f, "The `_geoRadius` filter is an operation and can't be used as a value.")?
|
||||||
|
@ -141,7 +141,7 @@ pub enum FilterCondition<'a> {
|
|||||||
Or(Vec<Self>),
|
Or(Vec<Self>),
|
||||||
And(Vec<Self>),
|
And(Vec<Self>),
|
||||||
GeoLowerThan { point: [Token<'a>; 2], radius: Token<'a> },
|
GeoLowerThan { point: [Token<'a>; 2], radius: Token<'a> },
|
||||||
GeoBoundingBox { top_left_point: [Token<'a>; 2], bottom_right_point: [Token<'a>; 2] },
|
GeoBoundingBox { top_right_point: [Token<'a>; 2], bottom_left_point: [Token<'a>; 2] },
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> FilterCondition<'a> {
|
impl<'a> FilterCondition<'a> {
|
||||||
@ -362,8 +362,8 @@ fn parse_geo_bounding_box(input: Span) -> IResult<FilterCondition> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let res = FilterCondition::GeoBoundingBox {
|
let res = FilterCondition::GeoBoundingBox {
|
||||||
top_left_point: [args[0][0].into(), args[0][1].into()],
|
top_right_point: [args[0][0].into(), args[0][1].into()],
|
||||||
bottom_right_point: [args[1][0].into(), args[1][1].into()],
|
bottom_left_point: [args[1][0].into(), args[1][1].into()],
|
||||||
};
|
};
|
||||||
Ok((input, res))
|
Ok((input, res))
|
||||||
}
|
}
|
||||||
@ -382,6 +382,34 @@ fn parse_geo_point(input: Span) -> IResult<FilterCondition> {
|
|||||||
Err(nom::Err::Failure(Error::new_from_kind(input, ErrorKind::ReservedGeo("_geoPoint"))))
|
Err(nom::Err::Failure(Error::new_from_kind(input, ErrorKind::ReservedGeo("_geoPoint"))))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// geoPoint = WS* "_geoDistance(float WS* "," WS* float WS* "," WS* float)
|
||||||
|
fn parse_geo_distance(input: Span) -> IResult<FilterCondition> {
|
||||||
|
// we want to forbid space BEFORE the _geoDistance but not after
|
||||||
|
tuple((
|
||||||
|
multispace0,
|
||||||
|
tag("_geoDistance"),
|
||||||
|
// if we were able to parse `_geoDistance` we are going to return a Failure whatever happens next.
|
||||||
|
cut(delimited(char('('), separated_list1(tag(","), ws(recognize_float)), char(')'))),
|
||||||
|
))(input)
|
||||||
|
.map_err(|e| e.map(|_| Error::new_from_kind(input, ErrorKind::ReservedGeo("_geoDistance"))))?;
|
||||||
|
// if we succeeded we still return a `Failure` because `geoDistance` filters are not allowed
|
||||||
|
Err(nom::Err::Failure(Error::new_from_kind(input, ErrorKind::ReservedGeo("_geoDistance"))))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// geo = WS* "_geo(float WS* "," WS* float WS* "," WS* float)
|
||||||
|
fn parse_geo(input: Span) -> IResult<FilterCondition> {
|
||||||
|
// we want to forbid space BEFORE the _geo but not after
|
||||||
|
tuple((
|
||||||
|
multispace0,
|
||||||
|
word_exact("_geo"),
|
||||||
|
// if we were able to parse `_geo` we are going to return a Failure whatever happens next.
|
||||||
|
cut(delimited(char('('), separated_list1(tag(","), ws(recognize_float)), char(')'))),
|
||||||
|
))(input)
|
||||||
|
.map_err(|e| e.map(|_| Error::new_from_kind(input, ErrorKind::ReservedGeo("_geo"))))?;
|
||||||
|
// if we succeeded we still return a `Failure` because `_geo` filter is not allowed
|
||||||
|
Err(nom::Err::Failure(Error::new_from_kind(input, ErrorKind::ReservedGeo("_geo"))))
|
||||||
|
}
|
||||||
|
|
||||||
fn parse_error_reserved_keyword(input: Span) -> IResult<FilterCondition> {
|
fn parse_error_reserved_keyword(input: Span) -> IResult<FilterCondition> {
|
||||||
match parse_condition(input) {
|
match parse_condition(input) {
|
||||||
Ok(result) => Ok(result),
|
Ok(result) => Ok(result),
|
||||||
@ -418,6 +446,8 @@ fn parse_primary(input: Span, depth: usize) -> IResult<FilterCondition> {
|
|||||||
parse_not_exists,
|
parse_not_exists,
|
||||||
parse_to,
|
parse_to,
|
||||||
// the next lines are only for error handling and are written at the end to have the less possible performance impact
|
// the next lines are only for error handling and are written at the end to have the less possible performance impact
|
||||||
|
parse_geo,
|
||||||
|
parse_geo_distance,
|
||||||
parse_geo_point,
|
parse_geo_point,
|
||||||
parse_error_reserved_keyword,
|
parse_error_reserved_keyword,
|
||||||
))(input)
|
))(input)
|
||||||
@ -621,15 +651,35 @@ pub mod tests {
|
|||||||
"###);
|
"###);
|
||||||
|
|
||||||
insta::assert_display_snapshot!(p("_geoPoint(12, 13, 14)"), @r###"
|
insta::assert_display_snapshot!(p("_geoPoint(12, 13, 14)"), @r###"
|
||||||
`_geoPoint` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance), or _geoBoundingBox([latitude, longitude], [latitude, longitude]) built-in rules to filter on `_geo` coordinates.
|
`_geoPoint` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance)` or `_geoBoundingBox([latitude, longitude], [latitude, longitude])` built-in rules to filter on `_geo` coordinates.
|
||||||
1:22 _geoPoint(12, 13, 14)
|
1:22 _geoPoint(12, 13, 14)
|
||||||
"###);
|
"###);
|
||||||
|
|
||||||
insta::assert_display_snapshot!(p("position <= _geoPoint(12, 13, 14)"), @r###"
|
insta::assert_display_snapshot!(p("position <= _geoPoint(12, 13, 14)"), @r###"
|
||||||
`_geoPoint` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance), or _geoBoundingBox([latitude, longitude], [latitude, longitude]) built-in rules to filter on `_geo` coordinates.
|
`_geoPoint` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance)` or `_geoBoundingBox([latitude, longitude], [latitude, longitude])` built-in rules to filter on `_geo` coordinates.
|
||||||
13:34 position <= _geoPoint(12, 13, 14)
|
13:34 position <= _geoPoint(12, 13, 14)
|
||||||
"###);
|
"###);
|
||||||
|
|
||||||
|
insta::assert_display_snapshot!(p("_geoDistance(12, 13, 14)"), @r###"
|
||||||
|
`_geoDistance` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance)` or `_geoBoundingBox([latitude, longitude], [latitude, longitude])` built-in rules to filter on `_geo` coordinates.
|
||||||
|
1:25 _geoDistance(12, 13, 14)
|
||||||
|
"###);
|
||||||
|
|
||||||
|
insta::assert_display_snapshot!(p("position <= _geoDistance(12, 13, 14)"), @r###"
|
||||||
|
`_geoDistance` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance)` or `_geoBoundingBox([latitude, longitude], [latitude, longitude])` built-in rules to filter on `_geo` coordinates.
|
||||||
|
13:37 position <= _geoDistance(12, 13, 14)
|
||||||
|
"###);
|
||||||
|
|
||||||
|
insta::assert_display_snapshot!(p("_geo(12, 13, 14)"), @r###"
|
||||||
|
`_geo` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance)` or `_geoBoundingBox([latitude, longitude], [latitude, longitude])` built-in rules to filter on `_geo` coordinates.
|
||||||
|
1:17 _geo(12, 13, 14)
|
||||||
|
"###);
|
||||||
|
|
||||||
|
insta::assert_display_snapshot!(p("position <= _geo(12, 13, 14)"), @r###"
|
||||||
|
`_geo` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance)` or `_geoBoundingBox([latitude, longitude], [latitude, longitude])` built-in rules to filter on `_geo` coordinates.
|
||||||
|
13:29 position <= _geo(12, 13, 14)
|
||||||
|
"###);
|
||||||
|
|
||||||
insta::assert_display_snapshot!(p("position <= _geoRadius(12, 13, 14)"), @r###"
|
insta::assert_display_snapshot!(p("position <= _geoRadius(12, 13, 14)"), @r###"
|
||||||
The `_geoRadius` filter is an operation and can't be used as a value.
|
The `_geoRadius` filter is an operation and can't be used as a value.
|
||||||
13:35 position <= _geoRadius(12, 13, 14)
|
13:35 position <= _geoRadius(12, 13, 14)
|
||||||
@ -780,7 +830,10 @@ impl<'a> std::fmt::Display for FilterCondition<'a> {
|
|||||||
FilterCondition::GeoLowerThan { point, radius } => {
|
FilterCondition::GeoLowerThan { point, radius } => {
|
||||||
write!(f, "_geoRadius({}, {}, {})", point[0], point[1], radius)
|
write!(f, "_geoRadius({}, {}, {})", point[0], point[1], radius)
|
||||||
}
|
}
|
||||||
FilterCondition::GeoBoundingBox { top_left_point, bottom_right_point } => {
|
FilterCondition::GeoBoundingBox {
|
||||||
|
top_right_point: top_left_point,
|
||||||
|
bottom_left_point: bottom_right_point,
|
||||||
|
} => {
|
||||||
write!(
|
write!(
|
||||||
f,
|
f,
|
||||||
"_geoBoundingBox([{}, {}], [{}, {}])",
|
"_geoBoundingBox([{}, {}], [{}, {}])",
|
||||||
|
@ -7,8 +7,8 @@ use nom::{InputIter, InputLength, InputTake, Slice};
|
|||||||
|
|
||||||
use crate::error::{ExpectedValueKind, NomErrorExt};
|
use crate::error::{ExpectedValueKind, NomErrorExt};
|
||||||
use crate::{
|
use crate::{
|
||||||
parse_geo_bounding_box, parse_geo_point, parse_geo_radius, Error, ErrorKind, IResult, Span,
|
parse_geo, parse_geo_bounding_box, parse_geo_distance, parse_geo_point, parse_geo_radius,
|
||||||
Token,
|
Error, ErrorKind, IResult, Span, Token,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// This function goes through all characters in the [Span] if it finds any escaped character (`\`).
|
/// This function goes through all characters in the [Span] if it finds any escaped character (`\`).
|
||||||
@ -88,11 +88,16 @@ pub fn parse_value(input: Span) -> IResult<Token> {
|
|||||||
// then, we want to check if the user is misusing a geo expression
|
// then, we want to check if the user is misusing a geo expression
|
||||||
// This expression can’t finish without error.
|
// This expression can’t finish without error.
|
||||||
// We want to return an error in case of failure.
|
// We want to return an error in case of failure.
|
||||||
if let Err(err) = parse_geo_point(input) {
|
let geo_reserved_parse_functions = [parse_geo_point, parse_geo_distance, parse_geo];
|
||||||
|
|
||||||
|
for parser in geo_reserved_parse_functions {
|
||||||
|
if let Err(err) = parser(input) {
|
||||||
if err.is_failure() {
|
if err.is_failure() {
|
||||||
return Err(err);
|
return Err(err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
match parse_geo_radius(input) {
|
match parse_geo_radius(input) {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
return Err(nom::Err::Failure(Error::new_from_kind(input, ErrorKind::MisusedGeoRadius)))
|
return Err(nom::Err::Failure(Error::new_from_kind(input, ErrorKind::MisusedGeoRadius)))
|
||||||
|
@ -675,9 +675,6 @@ impl IndexScheduler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 3. Snapshot every indexes
|
// 3. Snapshot every indexes
|
||||||
// TODO we are opening all of the indexes it can be too much we should unload all
|
|
||||||
// of the indexes we are trying to open. It would be even better to only unload
|
|
||||||
// the ones that were opened by us. Or maybe use a LRU in the index mapper.
|
|
||||||
for result in self.index_mapper.index_mapping.iter(&rtxn)? {
|
for result in self.index_mapper.index_mapping.iter(&rtxn)? {
|
||||||
let (name, uuid) = result?;
|
let (name, uuid) = result?;
|
||||||
let index = self.index_mapper.index(&rtxn, name)?;
|
let index = self.index_mapper.index(&rtxn, name)?;
|
||||||
@ -714,6 +711,14 @@ impl IndexScheduler {
|
|||||||
// 5.3 Change the permission to make the snapshot readonly
|
// 5.3 Change the permission to make the snapshot readonly
|
||||||
let mut permissions = file.metadata()?.permissions();
|
let mut permissions = file.metadata()?.permissions();
|
||||||
permissions.set_readonly(true);
|
permissions.set_readonly(true);
|
||||||
|
#[cfg(unix)]
|
||||||
|
{
|
||||||
|
use std::os::unix::fs::PermissionsExt;
|
||||||
|
#[allow(clippy::non_octal_unix_permissions)]
|
||||||
|
// rwxrwxrwx
|
||||||
|
permissions.set_mode(0b100100100);
|
||||||
|
}
|
||||||
|
|
||||||
file.set_permissions(permissions)?;
|
file.set_permissions(permissions)?;
|
||||||
|
|
||||||
for task in &mut tasks {
|
for task in &mut tasks {
|
||||||
@ -828,20 +833,38 @@ impl IndexScheduler {
|
|||||||
Ok(vec![task])
|
Ok(vec![task])
|
||||||
}
|
}
|
||||||
Batch::IndexOperation { op, must_create_index } => {
|
Batch::IndexOperation { op, must_create_index } => {
|
||||||
let index_uid = op.index_uid();
|
let index_uid = op.index_uid().to_string();
|
||||||
let index = if must_create_index {
|
let index = if must_create_index {
|
||||||
// create the index if it doesn't already exist
|
// create the index if it doesn't already exist
|
||||||
let wtxn = self.env.write_txn()?;
|
let wtxn = self.env.write_txn()?;
|
||||||
self.index_mapper.create_index(wtxn, index_uid, None)?
|
self.index_mapper.create_index(wtxn, &index_uid, None)?
|
||||||
} else {
|
} else {
|
||||||
let rtxn = self.env.read_txn()?;
|
let rtxn = self.env.read_txn()?;
|
||||||
self.index_mapper.index(&rtxn, index_uid)?
|
self.index_mapper.index(&rtxn, &index_uid)?
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut index_wtxn = index.write_txn()?;
|
let mut index_wtxn = index.write_txn()?;
|
||||||
let tasks = self.apply_index_operation(&mut index_wtxn, &index, op)?;
|
let tasks = self.apply_index_operation(&mut index_wtxn, &index, op)?;
|
||||||
index_wtxn.commit()?;
|
index_wtxn.commit()?;
|
||||||
|
|
||||||
|
// if the update processed successfully, we're going to store the new
|
||||||
|
// stats of the index. Since the tasks have already been processed and
|
||||||
|
// this is a non-critical operation. If it fails, we should not fail
|
||||||
|
// the entire batch.
|
||||||
|
let res = || -> Result<()> {
|
||||||
|
let index_rtxn = index.read_txn()?;
|
||||||
|
let stats = crate::index_mapper::IndexStats::new(&index, &index_rtxn)?;
|
||||||
|
let mut wtxn = self.env.write_txn()?;
|
||||||
|
self.index_mapper.store_stats_of(&mut wtxn, &index_uid, &stats)?;
|
||||||
|
wtxn.commit()?;
|
||||||
|
Ok(())
|
||||||
|
}();
|
||||||
|
|
||||||
|
match res {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(e) => error!("Could not write the stats of the index {}", e),
|
||||||
|
}
|
||||||
|
|
||||||
Ok(tasks)
|
Ok(tasks)
|
||||||
}
|
}
|
||||||
Batch::IndexCreation { index_uid, primary_key, task } => {
|
Batch::IndexCreation { index_uid, primary_key, task } => {
|
||||||
@ -872,9 +895,31 @@ impl IndexScheduler {
|
|||||||
)?;
|
)?;
|
||||||
index_wtxn.commit()?;
|
index_wtxn.commit()?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// drop rtxn before starting a new wtxn on the same db
|
||||||
|
rtxn.commit()?;
|
||||||
|
|
||||||
task.status = Status::Succeeded;
|
task.status = Status::Succeeded;
|
||||||
task.details = Some(Details::IndexInfo { primary_key });
|
task.details = Some(Details::IndexInfo { primary_key });
|
||||||
|
|
||||||
|
// if the update processed successfully, we're going to store the new
|
||||||
|
// stats of the index. Since the tasks have already been processed and
|
||||||
|
// this is a non-critical operation. If it fails, we should not fail
|
||||||
|
// the entire batch.
|
||||||
|
let res = || -> Result<()> {
|
||||||
|
let mut wtxn = self.env.write_txn()?;
|
||||||
|
let index_rtxn = index.read_txn()?;
|
||||||
|
let stats = crate::index_mapper::IndexStats::new(&index, &index_rtxn)?;
|
||||||
|
self.index_mapper.store_stats_of(&mut wtxn, &index_uid, &stats)?;
|
||||||
|
wtxn.commit()?;
|
||||||
|
Ok(())
|
||||||
|
}();
|
||||||
|
|
||||||
|
match res {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(e) => error!("Could not write the stats of the index {}", e),
|
||||||
|
}
|
||||||
|
|
||||||
Ok(vec![task])
|
Ok(vec![task])
|
||||||
}
|
}
|
||||||
Batch::IndexDeletion { index_uid, index_has_been_created, mut tasks } => {
|
Batch::IndexDeletion { index_uid, index_has_been_created, mut tasks } => {
|
||||||
|
@ -4,10 +4,11 @@ use std::time::Duration;
|
|||||||
use std::{fs, thread};
|
use std::{fs, thread};
|
||||||
|
|
||||||
use log::error;
|
use log::error;
|
||||||
use meilisearch_types::heed::types::Str;
|
use meilisearch_types::heed::types::{SerdeJson, Str};
|
||||||
use meilisearch_types::heed::{Database, Env, RoTxn, RwTxn};
|
use meilisearch_types::heed::{Database, Env, RoTxn, RwTxn};
|
||||||
use meilisearch_types::milli::update::IndexerConfig;
|
use meilisearch_types::milli::update::IndexerConfig;
|
||||||
use meilisearch_types::milli::Index;
|
use meilisearch_types::milli::{FieldDistribution, Index};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
use time::OffsetDateTime;
|
use time::OffsetDateTime;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
@ -19,6 +20,7 @@ use crate::{Error, Result};
|
|||||||
mod index_map;
|
mod index_map;
|
||||||
|
|
||||||
const INDEX_MAPPING: &str = "index-mapping";
|
const INDEX_MAPPING: &str = "index-mapping";
|
||||||
|
const INDEX_STATS: &str = "index-stats";
|
||||||
|
|
||||||
/// Structure managing meilisearch's indexes.
|
/// Structure managing meilisearch's indexes.
|
||||||
///
|
///
|
||||||
@ -52,6 +54,11 @@ pub struct IndexMapper {
|
|||||||
|
|
||||||
/// Map an index name with an index uuid currently available on disk.
|
/// Map an index name with an index uuid currently available on disk.
|
||||||
pub(crate) index_mapping: Database<Str, UuidCodec>,
|
pub(crate) index_mapping: Database<Str, UuidCodec>,
|
||||||
|
/// Map an index UUID with the cached stats associated to the index.
|
||||||
|
///
|
||||||
|
/// Using an UUID forces to use the index_mapping table to recover the index behind a name, ensuring
|
||||||
|
/// consistency wrt index swapping.
|
||||||
|
pub(crate) index_stats: Database<UuidCodec, SerdeJson<IndexStats>>,
|
||||||
|
|
||||||
/// Path to the folder where the LMDB environments of each index are.
|
/// Path to the folder where the LMDB environments of each index are.
|
||||||
base_path: PathBuf,
|
base_path: PathBuf,
|
||||||
@ -76,6 +83,39 @@ pub enum IndexStatus {
|
|||||||
Available(Index),
|
Available(Index),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The statistics that can be computed from an `Index` object.
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub struct IndexStats {
|
||||||
|
/// Number of documents in the index.
|
||||||
|
pub number_of_documents: u64,
|
||||||
|
/// Size of the index' DB, in bytes.
|
||||||
|
pub database_size: u64,
|
||||||
|
/// Association of every field name with the number of times it occurs in the documents.
|
||||||
|
pub field_distribution: FieldDistribution,
|
||||||
|
/// Creation date of the index.
|
||||||
|
pub created_at: OffsetDateTime,
|
||||||
|
/// Date of the last update of the index.
|
||||||
|
pub updated_at: OffsetDateTime,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IndexStats {
|
||||||
|
/// Compute the stats of an index
|
||||||
|
///
|
||||||
|
/// # Parameters
|
||||||
|
///
|
||||||
|
/// - rtxn: a RO transaction for the index, obtained from `Index::read_txn()`.
|
||||||
|
pub fn new(index: &Index, rtxn: &RoTxn) -> Result<Self> {
|
||||||
|
let database_size = index.on_disk_size()?;
|
||||||
|
Ok(IndexStats {
|
||||||
|
number_of_documents: index.number_of_documents(rtxn)?,
|
||||||
|
database_size,
|
||||||
|
field_distribution: index.field_distribution(rtxn)?,
|
||||||
|
created_at: index.created_at(rtxn)?,
|
||||||
|
updated_at: index.updated_at(rtxn)?,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl IndexMapper {
|
impl IndexMapper {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
env: &Env,
|
env: &Env,
|
||||||
@ -88,6 +128,7 @@ impl IndexMapper {
|
|||||||
Ok(Self {
|
Ok(Self {
|
||||||
index_map: Arc::new(RwLock::new(IndexMap::new(index_count))),
|
index_map: Arc::new(RwLock::new(IndexMap::new(index_count))),
|
||||||
index_mapping: env.create_database(Some(INDEX_MAPPING))?,
|
index_mapping: env.create_database(Some(INDEX_MAPPING))?,
|
||||||
|
index_stats: env.create_database(Some(INDEX_STATS))?,
|
||||||
base_path,
|
base_path,
|
||||||
index_base_map_size,
|
index_base_map_size,
|
||||||
index_growth_amount,
|
index_growth_amount,
|
||||||
@ -140,6 +181,9 @@ impl IndexMapper {
|
|||||||
.get(&wtxn, name)?
|
.get(&wtxn, name)?
|
||||||
.ok_or_else(|| Error::IndexNotFound(name.to_string()))?;
|
.ok_or_else(|| Error::IndexNotFound(name.to_string()))?;
|
||||||
|
|
||||||
|
// Not an error if the index had no stats in cache.
|
||||||
|
self.index_stats.delete(&mut wtxn, &uuid)?;
|
||||||
|
|
||||||
// Once we retrieved the UUID of the index we remove it from the mapping table.
|
// Once we retrieved the UUID of the index we remove it from the mapping table.
|
||||||
assert!(self.index_mapping.delete(&mut wtxn, name)?);
|
assert!(self.index_mapping.delete(&mut wtxn, name)?);
|
||||||
|
|
||||||
@ -360,6 +404,45 @@ impl IndexMapper {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The stats of an index.
|
||||||
|
///
|
||||||
|
/// If available in the cache, they are directly returned.
|
||||||
|
/// Otherwise, the `Index` is opened to compute the stats on the fly (the result is not cached).
|
||||||
|
/// The stats for an index are cached after each `Index` update.
|
||||||
|
pub fn stats_of(&self, rtxn: &RoTxn, index_uid: &str) -> Result<IndexStats> {
|
||||||
|
let uuid = self
|
||||||
|
.index_mapping
|
||||||
|
.get(rtxn, index_uid)?
|
||||||
|
.ok_or_else(|| Error::IndexNotFound(index_uid.to_string()))?;
|
||||||
|
|
||||||
|
match self.index_stats.get(rtxn, &uuid)? {
|
||||||
|
Some(stats) => Ok(stats),
|
||||||
|
None => {
|
||||||
|
let index = self.index(rtxn, index_uid)?;
|
||||||
|
let index_rtxn = index.read_txn()?;
|
||||||
|
IndexStats::new(&index, &index_rtxn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Stores the new stats for an index.
|
||||||
|
///
|
||||||
|
/// Expected usage is to compute the stats the index using `IndexStats::new`, the pass it to this function.
|
||||||
|
pub fn store_stats_of(
|
||||||
|
&self,
|
||||||
|
wtxn: &mut RwTxn,
|
||||||
|
index_uid: &str,
|
||||||
|
stats: &IndexStats,
|
||||||
|
) -> Result<()> {
|
||||||
|
let uuid = self
|
||||||
|
.index_mapping
|
||||||
|
.get(wtxn, index_uid)?
|
||||||
|
.ok_or_else(|| Error::IndexNotFound(index_uid.to_string()))?;
|
||||||
|
|
||||||
|
self.index_stats.put(wtxn, &uuid, stats)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub fn index_exists(&self, rtxn: &RoTxn, name: &str) -> Result<bool> {
|
pub fn index_exists(&self, rtxn: &RoTxn, name: &str) -> Result<bool> {
|
||||||
Ok(self.index_mapping.get(rtxn, name)?.is_some())
|
Ok(self.index_mapping.get(rtxn, name)?.is_some())
|
||||||
}
|
}
|
||||||
|
@ -254,6 +254,16 @@ pub fn snapshot_canceled_by(
|
|||||||
snap
|
snap
|
||||||
}
|
}
|
||||||
pub fn snapshot_index_mapper(rtxn: &RoTxn, mapper: &IndexMapper) -> String {
|
pub fn snapshot_index_mapper(rtxn: &RoTxn, mapper: &IndexMapper) -> String {
|
||||||
|
let mut s = String::new();
|
||||||
let names = mapper.index_names(rtxn).unwrap();
|
let names = mapper.index_names(rtxn).unwrap();
|
||||||
format!("{names:?}")
|
|
||||||
|
for name in names {
|
||||||
|
let stats = mapper.stats_of(rtxn, &name).unwrap();
|
||||||
|
s.push_str(&format!(
|
||||||
|
"{name}: {{ number_of_documents: {}, field_distribution: {:?} }}\n",
|
||||||
|
stats.number_of_documents, stats.field_distribution
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
s
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,7 @@ mod uuid_codec;
|
|||||||
pub type Result<T> = std::result::Result<T, Error>;
|
pub type Result<T> = std::result::Result<T, Error>;
|
||||||
pub type TaskId = u32;
|
pub type TaskId = u32;
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
use std::ops::{Bound, RangeBounds};
|
use std::ops::{Bound, RangeBounds};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::atomic::AtomicBool;
|
use std::sync::atomic::AtomicBool;
|
||||||
@ -43,11 +44,10 @@ pub use error::Error;
|
|||||||
use file_store::FileStore;
|
use file_store::FileStore;
|
||||||
use meilisearch_types::error::ResponseError;
|
use meilisearch_types::error::ResponseError;
|
||||||
use meilisearch_types::heed::types::{OwnedType, SerdeBincode, SerdeJson, Str};
|
use meilisearch_types::heed::types::{OwnedType, SerdeBincode, SerdeJson, Str};
|
||||||
use meilisearch_types::heed::{self, Database, Env, RoTxn};
|
use meilisearch_types::heed::{self, Database, Env, RoTxn, RwTxn};
|
||||||
use meilisearch_types::milli;
|
|
||||||
use meilisearch_types::milli::documents::DocumentsBatchBuilder;
|
use meilisearch_types::milli::documents::DocumentsBatchBuilder;
|
||||||
use meilisearch_types::milli::update::IndexerConfig;
|
use meilisearch_types::milli::update::IndexerConfig;
|
||||||
use meilisearch_types::milli::{CboRoaringBitmapCodec, Index, RoaringBitmapCodec, BEU32};
|
use meilisearch_types::milli::{self, CboRoaringBitmapCodec, Index, RoaringBitmapCodec, BEU32};
|
||||||
use meilisearch_types::tasks::{Kind, KindWithContent, Status, Task};
|
use meilisearch_types::tasks::{Kind, KindWithContent, Status, Task};
|
||||||
use roaring::RoaringBitmap;
|
use roaring::RoaringBitmap;
|
||||||
use synchronoise::SignalEvent;
|
use synchronoise::SignalEvent;
|
||||||
@ -429,6 +429,13 @@ impl IndexScheduler {
|
|||||||
Ok(this)
|
Ok(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return `Ok(())` if the index scheduler is able to access one of its database.
|
||||||
|
pub fn health(&self) -> Result<()> {
|
||||||
|
let rtxn = self.env.read_txn()?;
|
||||||
|
self.all_tasks.first(&rtxn)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn index_budget(
|
fn index_budget(
|
||||||
tasks_path: &Path,
|
tasks_path: &Path,
|
||||||
base_map_size: usize,
|
base_map_size: usize,
|
||||||
@ -566,7 +573,7 @@ impl IndexScheduler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Return the name of all indexes without opening them.
|
/// Return the name of all indexes without opening them.
|
||||||
pub fn index_names(self) -> Result<Vec<String>> {
|
pub fn index_names(&self) -> Result<Vec<String>> {
|
||||||
let rtxn = self.env.read_txn()?;
|
let rtxn = self.env.read_txn()?;
|
||||||
self.index_mapper.index_names(&rtxn)
|
self.index_mapper.index_names(&rtxn)
|
||||||
}
|
}
|
||||||
@ -883,115 +890,8 @@ impl IndexScheduler {
|
|||||||
|
|
||||||
/// Register a new task coming from a dump in the scheduler.
|
/// Register a new task coming from a dump in the scheduler.
|
||||||
/// By taking a mutable ref we're pretty sure no one will ever import a dump while actix is running.
|
/// By taking a mutable ref we're pretty sure no one will ever import a dump while actix is running.
|
||||||
pub fn register_dumped_task(
|
pub fn register_dumped_task(&mut self) -> Result<Dump> {
|
||||||
&mut self,
|
Dump::new(self)
|
||||||
task: TaskDump,
|
|
||||||
content_file: Option<Box<UpdateFile>>,
|
|
||||||
) -> Result<Task> {
|
|
||||||
// Currently we don't need to access the tasks queue while loading a dump thus I can block everything.
|
|
||||||
let mut wtxn = self.env.write_txn()?;
|
|
||||||
|
|
||||||
let content_uuid = match content_file {
|
|
||||||
Some(content_file) if task.status == Status::Enqueued => {
|
|
||||||
let (uuid, mut file) = self.create_update_file()?;
|
|
||||||
let mut builder = DocumentsBatchBuilder::new(file.as_file_mut());
|
|
||||||
for doc in content_file {
|
|
||||||
builder.append_json_object(&doc?)?;
|
|
||||||
}
|
|
||||||
builder.into_inner()?;
|
|
||||||
file.persist()?;
|
|
||||||
|
|
||||||
Some(uuid)
|
|
||||||
}
|
|
||||||
// If the task isn't `Enqueued` then just generate a recognisable `Uuid`
|
|
||||||
// in case we try to open it later.
|
|
||||||
_ if task.status != Status::Enqueued => Some(Uuid::nil()),
|
|
||||||
_ => None,
|
|
||||||
};
|
|
||||||
|
|
||||||
let task = Task {
|
|
||||||
uid: task.uid,
|
|
||||||
enqueued_at: task.enqueued_at,
|
|
||||||
started_at: task.started_at,
|
|
||||||
finished_at: task.finished_at,
|
|
||||||
error: task.error,
|
|
||||||
canceled_by: task.canceled_by,
|
|
||||||
details: task.details,
|
|
||||||
status: task.status,
|
|
||||||
kind: match task.kind {
|
|
||||||
KindDump::DocumentImport {
|
|
||||||
primary_key,
|
|
||||||
method,
|
|
||||||
documents_count,
|
|
||||||
allow_index_creation,
|
|
||||||
} => KindWithContent::DocumentAdditionOrUpdate {
|
|
||||||
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
|
||||||
primary_key,
|
|
||||||
method,
|
|
||||||
content_file: content_uuid.ok_or(Error::CorruptedDump)?,
|
|
||||||
documents_count,
|
|
||||||
allow_index_creation,
|
|
||||||
},
|
|
||||||
KindDump::DocumentDeletion { documents_ids } => KindWithContent::DocumentDeletion {
|
|
||||||
documents_ids,
|
|
||||||
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
|
||||||
},
|
|
||||||
KindDump::DocumentClear => KindWithContent::DocumentClear {
|
|
||||||
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
|
||||||
},
|
|
||||||
KindDump::Settings { settings, is_deletion, allow_index_creation } => {
|
|
||||||
KindWithContent::SettingsUpdate {
|
|
||||||
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
|
||||||
new_settings: settings,
|
|
||||||
is_deletion,
|
|
||||||
allow_index_creation,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
KindDump::IndexDeletion => KindWithContent::IndexDeletion {
|
|
||||||
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
|
||||||
},
|
|
||||||
KindDump::IndexCreation { primary_key } => KindWithContent::IndexCreation {
|
|
||||||
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
|
||||||
primary_key,
|
|
||||||
},
|
|
||||||
KindDump::IndexUpdate { primary_key } => KindWithContent::IndexUpdate {
|
|
||||||
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
|
||||||
primary_key,
|
|
||||||
},
|
|
||||||
KindDump::IndexSwap { swaps } => KindWithContent::IndexSwap { swaps },
|
|
||||||
KindDump::TaskCancelation { query, tasks } => {
|
|
||||||
KindWithContent::TaskCancelation { query, tasks }
|
|
||||||
}
|
|
||||||
KindDump::TasksDeletion { query, tasks } => {
|
|
||||||
KindWithContent::TaskDeletion { query, tasks }
|
|
||||||
}
|
|
||||||
KindDump::DumpCreation { keys, instance_uid } => {
|
|
||||||
KindWithContent::DumpCreation { keys, instance_uid }
|
|
||||||
}
|
|
||||||
KindDump::SnapshotCreation => KindWithContent::SnapshotCreation,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
self.all_tasks.put(&mut wtxn, &BEU32::new(task.uid), &task)?;
|
|
||||||
|
|
||||||
for index in task.indexes() {
|
|
||||||
self.update_index(&mut wtxn, index, |bitmap| {
|
|
||||||
bitmap.insert(task.uid);
|
|
||||||
})?;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.update_status(&mut wtxn, task.status, |bitmap| {
|
|
||||||
bitmap.insert(task.uid);
|
|
||||||
})?;
|
|
||||||
|
|
||||||
self.update_kind(&mut wtxn, task.kind.as_kind(), |bitmap| {
|
|
||||||
(bitmap.insert(task.uid));
|
|
||||||
})?;
|
|
||||||
|
|
||||||
wtxn.commit()?;
|
|
||||||
self.wake_up.signal();
|
|
||||||
|
|
||||||
Ok(task)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new index without any associated task.
|
/// Create a new index without any associated task.
|
||||||
@ -1186,6 +1086,14 @@ impl IndexScheduler {
|
|||||||
Ok(TickOutcome::TickAgain(processed_tasks))
|
Ok(TickOutcome::TickAgain(processed_tasks))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn index_stats(&self, index_uid: &str) -> Result<IndexStats> {
|
||||||
|
let is_indexing = self.is_index_processing(index_uid)?;
|
||||||
|
let rtxn = self.read_txn()?;
|
||||||
|
let index_stats = self.index_mapper.stats_of(&rtxn, index_uid)?;
|
||||||
|
|
||||||
|
Ok(IndexStats { is_indexing, inner_stats: index_stats })
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn delete_persisted_task_data(&self, task: &Task) -> Result<()> {
|
pub(crate) fn delete_persisted_task_data(&self, task: &Task) -> Result<()> {
|
||||||
match task.content_uuid() {
|
match task.content_uuid() {
|
||||||
Some(content_file) => self.delete_update_file(content_file),
|
Some(content_file) => self.delete_update_file(content_file),
|
||||||
@ -1218,6 +1126,184 @@ impl IndexScheduler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct Dump<'a> {
|
||||||
|
index_scheduler: &'a IndexScheduler,
|
||||||
|
wtxn: RwTxn<'a, 'a>,
|
||||||
|
|
||||||
|
indexes: HashMap<String, RoaringBitmap>,
|
||||||
|
statuses: HashMap<Status, RoaringBitmap>,
|
||||||
|
kinds: HashMap<Kind, RoaringBitmap>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Dump<'a> {
|
||||||
|
pub(crate) fn new(index_scheduler: &'a mut IndexScheduler) -> Result<Self> {
|
||||||
|
// While loading a dump no one should be able to access the scheduler thus I can block everything.
|
||||||
|
let wtxn = index_scheduler.env.write_txn()?;
|
||||||
|
|
||||||
|
Ok(Dump {
|
||||||
|
index_scheduler,
|
||||||
|
wtxn,
|
||||||
|
indexes: HashMap::new(),
|
||||||
|
statuses: HashMap::new(),
|
||||||
|
kinds: HashMap::new(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Register a new task coming from a dump in the scheduler.
|
||||||
|
/// By taking a mutable ref we're pretty sure no one will ever import a dump while actix is running.
|
||||||
|
pub fn register_dumped_task(
|
||||||
|
&mut self,
|
||||||
|
task: TaskDump,
|
||||||
|
content_file: Option<Box<UpdateFile>>,
|
||||||
|
) -> Result<Task> {
|
||||||
|
let content_uuid = match content_file {
|
||||||
|
Some(content_file) if task.status == Status::Enqueued => {
|
||||||
|
let (uuid, mut file) = self.index_scheduler.create_update_file()?;
|
||||||
|
let mut builder = DocumentsBatchBuilder::new(file.as_file_mut());
|
||||||
|
for doc in content_file {
|
||||||
|
builder.append_json_object(&doc?)?;
|
||||||
|
}
|
||||||
|
builder.into_inner()?;
|
||||||
|
file.persist()?;
|
||||||
|
|
||||||
|
Some(uuid)
|
||||||
|
}
|
||||||
|
// If the task isn't `Enqueued` then just generate a recognisable `Uuid`
|
||||||
|
// in case we try to open it later.
|
||||||
|
_ if task.status != Status::Enqueued => Some(Uuid::nil()),
|
||||||
|
_ => None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let task = Task {
|
||||||
|
uid: task.uid,
|
||||||
|
enqueued_at: task.enqueued_at,
|
||||||
|
started_at: task.started_at,
|
||||||
|
finished_at: task.finished_at,
|
||||||
|
error: task.error,
|
||||||
|
canceled_by: task.canceled_by,
|
||||||
|
details: task.details,
|
||||||
|
status: task.status,
|
||||||
|
kind: match task.kind {
|
||||||
|
KindDump::DocumentImport {
|
||||||
|
primary_key,
|
||||||
|
method,
|
||||||
|
documents_count,
|
||||||
|
allow_index_creation,
|
||||||
|
} => KindWithContent::DocumentAdditionOrUpdate {
|
||||||
|
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
||||||
|
primary_key,
|
||||||
|
method,
|
||||||
|
content_file: content_uuid.ok_or(Error::CorruptedDump)?,
|
||||||
|
documents_count,
|
||||||
|
allow_index_creation,
|
||||||
|
},
|
||||||
|
KindDump::DocumentDeletion { documents_ids } => KindWithContent::DocumentDeletion {
|
||||||
|
documents_ids,
|
||||||
|
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
||||||
|
},
|
||||||
|
KindDump::DocumentClear => KindWithContent::DocumentClear {
|
||||||
|
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
||||||
|
},
|
||||||
|
KindDump::Settings { settings, is_deletion, allow_index_creation } => {
|
||||||
|
KindWithContent::SettingsUpdate {
|
||||||
|
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
||||||
|
new_settings: settings,
|
||||||
|
is_deletion,
|
||||||
|
allow_index_creation,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
KindDump::IndexDeletion => KindWithContent::IndexDeletion {
|
||||||
|
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
||||||
|
},
|
||||||
|
KindDump::IndexCreation { primary_key } => KindWithContent::IndexCreation {
|
||||||
|
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
||||||
|
primary_key,
|
||||||
|
},
|
||||||
|
KindDump::IndexUpdate { primary_key } => KindWithContent::IndexUpdate {
|
||||||
|
index_uid: task.index_uid.ok_or(Error::CorruptedDump)?,
|
||||||
|
primary_key,
|
||||||
|
},
|
||||||
|
KindDump::IndexSwap { swaps } => KindWithContent::IndexSwap { swaps },
|
||||||
|
KindDump::TaskCancelation { query, tasks } => {
|
||||||
|
KindWithContent::TaskCancelation { query, tasks }
|
||||||
|
}
|
||||||
|
KindDump::TasksDeletion { query, tasks } => {
|
||||||
|
KindWithContent::TaskDeletion { query, tasks }
|
||||||
|
}
|
||||||
|
KindDump::DumpCreation { keys, instance_uid } => {
|
||||||
|
KindWithContent::DumpCreation { keys, instance_uid }
|
||||||
|
}
|
||||||
|
KindDump::SnapshotCreation => KindWithContent::SnapshotCreation,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
self.index_scheduler.all_tasks.put(&mut self.wtxn, &BEU32::new(task.uid), &task)?;
|
||||||
|
|
||||||
|
for index in task.indexes() {
|
||||||
|
match self.indexes.get_mut(index) {
|
||||||
|
Some(bitmap) => {
|
||||||
|
bitmap.insert(task.uid);
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
let mut bitmap = RoaringBitmap::new();
|
||||||
|
bitmap.insert(task.uid);
|
||||||
|
self.indexes.insert(index.to_string(), bitmap);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
utils::insert_task_datetime(
|
||||||
|
&mut self.wtxn,
|
||||||
|
self.index_scheduler.enqueued_at,
|
||||||
|
task.enqueued_at,
|
||||||
|
task.uid,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
// we can't override the started_at & finished_at, so we must only set it if the tasks is finished and won't change
|
||||||
|
if matches!(task.status, Status::Succeeded | Status::Failed | Status::Canceled) {
|
||||||
|
if let Some(started_at) = task.started_at {
|
||||||
|
utils::insert_task_datetime(
|
||||||
|
&mut self.wtxn,
|
||||||
|
self.index_scheduler.started_at,
|
||||||
|
started_at,
|
||||||
|
task.uid,
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
if let Some(finished_at) = task.finished_at {
|
||||||
|
utils::insert_task_datetime(
|
||||||
|
&mut self.wtxn,
|
||||||
|
self.index_scheduler.finished_at,
|
||||||
|
finished_at,
|
||||||
|
task.uid,
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.statuses.entry(task.status).or_insert(RoaringBitmap::new()).insert(task.uid);
|
||||||
|
self.kinds.entry(task.kind.as_kind()).or_insert(RoaringBitmap::new()).insert(task.uid);
|
||||||
|
|
||||||
|
Ok(task)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Commit all the changes and exit the importing dump state
|
||||||
|
pub fn finish(mut self) -> Result<()> {
|
||||||
|
for (index, bitmap) in self.indexes {
|
||||||
|
self.index_scheduler.index_tasks.put(&mut self.wtxn, &index, &bitmap)?;
|
||||||
|
}
|
||||||
|
for (status, bitmap) in self.statuses {
|
||||||
|
self.index_scheduler.put_status(&mut self.wtxn, status, &bitmap)?;
|
||||||
|
}
|
||||||
|
for (kind, bitmap) in self.kinds {
|
||||||
|
self.index_scheduler.put_kind(&mut self.wtxn, kind, &bitmap)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.wtxn.commit()?;
|
||||||
|
self.index_scheduler.wake_up.signal();
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// The outcome of calling the [`IndexScheduler::tick`] function.
|
/// The outcome of calling the [`IndexScheduler::tick`] function.
|
||||||
pub enum TickOutcome {
|
pub enum TickOutcome {
|
||||||
/// The scheduler should immediately attempt another `tick`.
|
/// The scheduler should immediately attempt another `tick`.
|
||||||
@ -1238,6 +1324,17 @@ struct IndexBudget {
|
|||||||
task_db_size: usize,
|
task_db_size: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The statistics that can be computed from an `Index` object and the scheduler.
|
||||||
|
///
|
||||||
|
/// Compared with `index_mapper::IndexStats`, it adds the scheduling status.
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct IndexStats {
|
||||||
|
/// Whether this index is currently performing indexation, according to the scheduler.
|
||||||
|
pub is_indexing: bool,
|
||||||
|
/// Internal stats computed from the index.
|
||||||
|
pub inner_stats: index_mapper::IndexStats,
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use std::io::{BufWriter, Seek, Write};
|
use std::io::{BufWriter, Seek, Write};
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
---
|
---
|
||||||
source: index-scheduler/src/lib.rs
|
source: index-scheduler/src/lib.rs
|
||||||
assertion_line: 1755
|
|
||||||
---
|
---
|
||||||
### Autobatching Enabled = true
|
### Autobatching Enabled = true
|
||||||
### Processing Tasks:
|
### Processing Tasks:
|
||||||
@ -23,7 +22,7 @@ canceled [0,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
1 [0,]
|
1 [0,]
|
||||||
|
@ -20,7 +20,7 @@ enqueued [0,1,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -25,7 +25,9 @@ catto [0,]
|
|||||||
wolfo [2,]
|
wolfo [2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["beavero", "catto"]
|
beavero: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
catto: { number_of_documents: 1, field_distribution: {"id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
---
|
---
|
||||||
source: index-scheduler/src/lib.rs
|
source: index-scheduler/src/lib.rs
|
||||||
assertion_line: 1859
|
|
||||||
---
|
---
|
||||||
### Autobatching Enabled = true
|
### Autobatching Enabled = true
|
||||||
### Processing Tasks:
|
### Processing Tasks:
|
||||||
@ -27,7 +26,9 @@ catto [0,]
|
|||||||
wolfo [2,]
|
wolfo [2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["beavero", "catto"]
|
beavero: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
catto: { number_of_documents: 1, field_distribution: {"id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
3 [1,2,]
|
3 [1,2,]
|
||||||
|
@ -23,7 +23,8 @@ catto [0,]
|
|||||||
wolfo [2,]
|
wolfo [2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["catto"]
|
catto: { number_of_documents: 1, field_distribution: {"id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -25,7 +25,8 @@ catto [0,]
|
|||||||
wolfo [2,]
|
wolfo [2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["catto"]
|
catto: { number_of_documents: 1, field_distribution: {"id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -20,7 +20,8 @@ enqueued [0,1,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["catto"]
|
catto: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
---
|
---
|
||||||
source: index-scheduler/src/lib.rs
|
source: index-scheduler/src/lib.rs
|
||||||
assertion_line: 1818
|
|
||||||
---
|
---
|
||||||
### Autobatching Enabled = true
|
### Autobatching Enabled = true
|
||||||
### Processing Tasks:
|
### Processing Tasks:
|
||||||
@ -23,7 +22,8 @@ canceled [0,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["catto"]
|
catto: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
1 [0,]
|
1 [0,]
|
||||||
|
@ -20,7 +20,7 @@ enqueued [0,1,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -21,7 +21,8 @@ succeeded [0,1,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["catto"]
|
catto: { number_of_documents: 1, field_distribution: {"id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
1 []
|
1 []
|
||||||
|
@ -19,7 +19,8 @@ succeeded [0,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["catto"]
|
catto: { number_of_documents: 1, field_distribution: {"id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -27,7 +27,10 @@ doggos [0,3,]
|
|||||||
girafos [2,5,]
|
girafos [2,5,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["cattos", "doggos", "girafos"]
|
cattos: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
doggos: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
girafos: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -19,7 +19,8 @@ succeeded [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["doggos"]
|
doggos: { number_of_documents: 1, field_distribution: {"doggo": 1, "id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -21,7 +21,8 @@ succeeded [0,1,]
|
|||||||
doggos [0,1,]
|
doggos [0,1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["doggos"]
|
doggos: { number_of_documents: 1, field_distribution: {"doggo": 1, "id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ enqueued [0,1,]
|
|||||||
doggos [0,1,]
|
doggos [0,1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -23,7 +23,8 @@ succeeded [0,]
|
|||||||
doggos [0,1,2,]
|
doggos [0,1,2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["doggos"]
|
doggos: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ succeeded [0,1,2,]
|
|||||||
doggos [0,1,2,]
|
doggos [0,1,2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ enqueued [0,1,]
|
|||||||
doggos [0,1,]
|
doggos [0,1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ enqueued [0,1,2,]
|
|||||||
doggos [0,1,2,]
|
doggos [0,1,2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ enqueued [0,1,]
|
|||||||
doggos [0,1,]
|
doggos [0,1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ succeeded [0,1,]
|
|||||||
doggos [0,1,]
|
doggos [0,1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ failed [0,]
|
|||||||
doggos [0,1,]
|
doggos [0,1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -22,7 +22,8 @@ failed [0,]
|
|||||||
doggos [0,1,]
|
doggos [0,1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["doggos"]
|
doggos: { number_of_documents: 3, field_distribution: {"catto": 1, "doggo": 2, "id": 3} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ enqueued [0,1,]
|
|||||||
doggos [0,1,]
|
doggos [0,1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ failed [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ failed [0,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,8 @@ enqueued [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["doggos"]
|
doggos: { number_of_documents: 1, field_distribution: {"doggo": 1, "id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,8 @@ enqueued [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["doggos"]
|
doggos: { number_of_documents: 1, field_distribution: {"doggo": 1, "id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -19,7 +19,8 @@ succeeded [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["doggos"]
|
doggos: { number_of_documents: 1, field_distribution: {"doggo": 1, "id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
index_a [0,]
|
index_a [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
index_a [0,]
|
index_a [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ index_a [0,]
|
|||||||
index_b [1,]
|
index_b [1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ index_a [0,2,]
|
|||||||
index_b [1,]
|
index_b [1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ failed [0,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
catto [0,]
|
catto [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -23,7 +23,8 @@ cattos [1,]
|
|||||||
doggos [0,2,]
|
doggos [0,2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["doggos"]
|
doggos: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -23,7 +23,9 @@ cattos [1,]
|
|||||||
doggos [0,2,]
|
doggos [0,2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["cattos", "doggos"]
|
cattos: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
doggos: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -23,7 +23,8 @@ cattos [1,]
|
|||||||
doggos [0,2,]
|
doggos [0,2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["cattos"]
|
cattos: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ cattos [1,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ cattos [1,]
|
|||||||
doggos [0,2,]
|
doggos [0,2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -23,7 +23,8 @@ succeeded [0,]
|
|||||||
doggos [0,1,2,3,]
|
doggos [0,1,2,3,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["doggos"]
|
doggos: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -23,7 +23,8 @@ succeeded [0,1,2,3,]
|
|||||||
doggos [0,1,2,3,]
|
doggos [0,1,2,3,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["doggos"]
|
doggos: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
doggos [0,]
|
doggos [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ enqueued [0,1,2,3,]
|
|||||||
doggos [0,1,2,3,]
|
doggos [0,1,2,3,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ enqueued [0,1,]
|
|||||||
doggos [0,1,]
|
doggos [0,1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ enqueued [0,1,2,]
|
|||||||
doggos [0,1,2,]
|
doggos [0,1,2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -23,7 +23,8 @@ succeeded [0,1,]
|
|||||||
doggos [0,1,2,3,]
|
doggos [0,1,2,3,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["doggos"]
|
doggos: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -23,7 +23,8 @@ succeeded [0,1,2,]
|
|||||||
doggos [0,1,2,3,]
|
doggos [0,1,2,3,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["doggos"]
|
doggos: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -26,7 +26,8 @@ catto [0,2,]
|
|||||||
doggo [1,2,]
|
doggo [1,2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["catto"]
|
catto: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
3 [1,2,]
|
3 [1,2,]
|
||||||
|
@ -23,7 +23,10 @@ doggo [0,]
|
|||||||
whalo [1,]
|
whalo [1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["catto", "doggo", "whalo"]
|
catto: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
doggo: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
whalo: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ enqueued [0,]
|
|||||||
doggo [0,]
|
doggo [0,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ doggo [0,]
|
|||||||
whalo [1,]
|
whalo [1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ doggo [0,]
|
|||||||
whalo [1,]
|
whalo [1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -24,7 +24,9 @@ doggo [1,]
|
|||||||
whalo [2,]
|
whalo [2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["catto", "doggo"]
|
catto: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
doggo: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ doggo [1,]
|
|||||||
whalo [2,]
|
whalo [2,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ doggo [1,2,]
|
|||||||
whalo [3,]
|
whalo [3,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ catto [0,1,2,]
|
|||||||
doggo [3,]
|
doggo [3,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -25,7 +25,8 @@ c [2,]
|
|||||||
d [3,]
|
d [3,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["a"]
|
a: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -25,7 +25,9 @@ c [2,]
|
|||||||
d [3,]
|
d [3,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["a", "b"]
|
a: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
b: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -25,7 +25,10 @@ c [2,]
|
|||||||
d [3,]
|
d [3,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["a", "b", "c"]
|
a: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
b: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
c: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -25,7 +25,11 @@ c [2,]
|
|||||||
d [3,]
|
d [3,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["a", "b", "c", "d"]
|
a: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
b: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
c: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
d: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -28,7 +28,11 @@ c [3,4,5,]
|
|||||||
d [2,4,]
|
d [2,4,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["a", "b", "c", "d"]
|
a: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
b: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
c: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
d: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -27,7 +27,11 @@ c [2,4,]
|
|||||||
d [3,4,]
|
d [3,4,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["a", "b", "c", "d"]
|
a: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
b: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
c: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
d: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -28,7 +28,11 @@ c [1,4,5,]
|
|||||||
d [2,4,]
|
d [2,4,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["a", "b", "c", "d"]
|
a: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
b: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
c: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
d: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -29,7 +29,11 @@ c [1,4,5,]
|
|||||||
d [2,4,]
|
d [2,4,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["a", "b", "c", "d"]
|
a: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
b: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
c: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
d: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -28,7 +28,11 @@ c [2,4,5,]
|
|||||||
d [3,4,]
|
d [3,4,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["a", "b", "c", "d"]
|
a: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
b: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
c: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
d: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -25,7 +25,11 @@ c [2,]
|
|||||||
d [3,]
|
d [3,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["a", "b", "c", "d"]
|
a: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
b: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
c: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
d: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -30,7 +30,11 @@ e [4,]
|
|||||||
f [4,]
|
f [4,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["a", "b", "c", "d"]
|
a: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
b: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
c: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
d: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -25,7 +25,11 @@ c [2,]
|
|||||||
d [3,]
|
d [3,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["a", "b", "c", "d"]
|
a: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
b: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
c: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
d: { number_of_documents: 0, field_distribution: {} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ catto [0,]
|
|||||||
doggo [1,]
|
doggo [1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -21,7 +21,8 @@ catto [0,]
|
|||||||
doggo [1,]
|
doggo [1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["catto"]
|
catto: { number_of_documents: 1, field_distribution: {"id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -22,7 +22,8 @@ succeeded [2,3,]
|
|||||||
doggo [1,]
|
doggo [1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["catto"]
|
catto: { number_of_documents: 1, field_distribution: {"id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -23,7 +23,8 @@ catto [0,]
|
|||||||
doggo [1,]
|
doggo [1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
["catto"]
|
catto: { number_of_documents: 1, field_distribution: {"id": 1} }
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ catto [0,]
|
|||||||
doggo [1,]
|
doggo [1,]
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Index Mapper:
|
### Index Mapper:
|
||||||
[]
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
### Canceled By:
|
### Canceled By:
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user