From c3fcb0ba0232771a741770825e52c4109bdc9fda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mour=C3=A3o?= Date: Fri, 31 Jul 2026 15:58:58 +0100 Subject: [PATCH 1/3] Add cross-property BM25 And operator Exposes the OPERATOR_AND_CROSS search operator added in Weaviate 1.39.0 (backported to 1.37.15 and 1.38.8) as `BM25Operator.and_cross()`. Unlike `and_()`, a query token may be matched by any of the searched properties instead of having to occur within a single one. The gRPC construction for the bm25 and hybrid paths is folded into a shared `_BaseGRPC._bm25_operator_to_grpc()` so the version gate applies to query, generative-query and aggregation alike; sending the new enum to a server that predates it raises WeaviateUnsupportedFeatureError. `_ServerVersion.is_at_least_any()` is added to express minimums that were backported across several release branches. --- .github/workflows/main.yaml | 2 +- docs/changelog.rst | 6 + integration/test_collection.py | 78 +++++++++ integration/test_collection_hybrid.py | 52 ++++++ test/collection/test_bm25_operator.py | 155 ++++++++++++++++++ test/test_server_version.py | 28 ++++ weaviate/collections/classes/grpc.py | 21 +++ weaviate/collections/grpc/query.py | 10 +- weaviate/collections/grpc/shared.py | 41 ++++- weaviate/proto/v1/v4216/v1/base_search_pb2.py | 66 ++++---- .../proto/v1/v4216/v1/base_search_pb2.pyi | 2 + weaviate/proto/v1/v5261/v1/base_search_pb2.py | 66 ++++---- .../proto/v1/v5261/v1/base_search_pb2.pyi | 2 + weaviate/proto/v1/v6300/v1/base_search_pb2.py | 66 ++++---- .../proto/v1/v6300/v1/base_search_pb2.pyi | 2 + weaviate/util.py | 12 ++ 16 files changed, 492 insertions(+), 117 deletions(-) create mode 100644 test/collection/test_bm25_operator.py diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index d62caf8c2..62261040b 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -29,7 +29,7 @@ env: WEAVIATE_135: 1.35.18 WEAVIATE_136: 1.36.12 WEAVIATE_137: 1.37.5-e0fe0d5.amd64 - WEAVIATE_139: 1.39.0-rc.0-b41225e.amd64 + WEAVIATE_139: 1.39.0-rc.1-89299a5.amd64 jobs: lint-and-format: diff --git a/docs/changelog.rst b/docs/changelog.rst index 17427c0ef..4f43070d8 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -1,6 +1,12 @@ Changelog ========= +Version 4.23.0 +-------------- +This minor version includes: + - Support for new 1.39 features: + - Add support for the new cross-property ``And`` BM25 search operator through ``BM25Operator.and_cross()``, available on the ``bm25`` and ``hybrid`` query, generative-query, and aggregation methods. Unlike ``BM25Operator.and_()``, a query token may be matched by any of the searched properties instead of having to occur within a single one. All searched properties must share the same tokenization and analyzer settings. Requires Weaviate ``1.37.15``, ``1.38.8``, ``1.39.0`` or higher + Version 4.22.0 -------------- This minor version includes: diff --git a/integration/test_collection.py b/integration/test_collection.py index d2745112d..e13479c14 100644 --- a/integration/test_collection.py +++ b/integration/test_collection.py @@ -36,12 +36,17 @@ ) from weaviate.collections.classes.internal import Object, ReferenceToMulti, _CrossReference from weaviate.collections.classes.types import PhoneNumber, WeaviateProperties, _PhoneNumber +from weaviate.collections.grpc.shared import ( + _BM25_AND_CROSS_MIN_VERSIONS, + _BM25_AND_CROSS_MIN_VERSIONS_STR, +) from weaviate.exceptions import ( UnexpectedStatusCodeError, WeaviateInsertInvalidPropertyError, WeaviateInsertManyAllFailedError, WeaviateInvalidInputError, WeaviateQueryError, + WeaviateUnsupportedFeatureError, ) from weaviate.types import UUID, UUIDS @@ -1756,3 +1761,76 @@ def test_bm25_operators(collection_factory: CollectionFactory) -> None: assert len(objs.objects) == 4 assert objs.objects[0].uuid == uuid2 assert sorted(obj.uuid for obj in objs.objects[1:]) == sorted([uuid1, uuid3, uuid4]) + + +def test_bm25_operator_and_cross(collection_factory: CollectionFactory) -> None: + collection = collection_factory( + properties=[ + Property(name="title", data_type=DataType.TEXT), + Property(name="body", data_type=DataType.TEXT), + ], + vectorizer_config=Configure.Vectorizer.none(), + ) + + if not collection._connection._weaviate_version.is_at_least_any(*_BM25_AND_CROSS_MIN_VERSIONS): + pytest.skip(f"bm25 cross-property AND requires {_BM25_AND_CROSS_MIN_VERSIONS_STR}") + + # Only `split_across` needs cross-property matching: neither of its properties holds both tokens. + split_across = collection.data.insert({"title": "banana", "body": "split"}) + single_property = collection.data.insert({"title": "banana split", "body": "dessert"}) + partial = collection.data.insert({"title": "banana", "body": "bread"}) + + and_cross = collection.query.bm25("banana split", operator=wvc.query.BM25Operator.and_cross()) + assert sorted(obj.uuid for obj in and_cross.objects) == sorted([split_across, single_property]) + + or_ = collection.query.bm25( + "banana split", operator=wvc.query.BM25Operator.or_(minimum_match=1) + ) + assert sorted(obj.uuid for obj in or_.objects) == sorted( + [split_across, single_property, partial] + ) + + # Per-property AND is at most as permissive as cross-property AND. Which of the two it is + # depends on whether the server took the BlockMax or the legacy WAND path, so only the + # subset relation is asserted. + and_ = collection.query.bm25("banana split", operator=wvc.query.BM25Operator.and_()) + assert {obj.uuid for obj in and_.objects} <= {obj.uuid for obj in and_cross.objects} + + +def test_bm25_operator_and_cross_mismatched_tokenization( + collection_factory: CollectionFactory, +) -> None: + collection = collection_factory( + properties=[ + Property(name="title", data_type=DataType.TEXT, tokenization=Tokenization.WORD), + Property(name="body", data_type=DataType.TEXT, tokenization=Tokenization.FIELD), + ], + vectorizer_config=Configure.Vectorizer.none(), + ) + + if not collection._connection._weaviate_version.is_at_least_any(*_BM25_AND_CROSS_MIN_VERSIONS): + pytest.skip(f"bm25 cross-property AND requires {_BM25_AND_CROSS_MIN_VERSIONS_STR}") + + collection.data.insert({"title": "banana", "body": "split"}) + + with pytest.raises(WeaviateQueryError): + collection.query.bm25( + "banana split", + query_properties=["title", "body"], + operator=wvc.query.BM25Operator.and_cross(), + ) + + +def test_bm25_operator_and_cross_unsupported_version( + collection_factory: CollectionFactory, +) -> None: + collection = collection_factory( + properties=[Property(name="name", data_type=DataType.TEXT)], + vectorizer_config=Configure.Vectorizer.none(), + ) + + if collection._connection._weaviate_version.is_at_least_any(*_BM25_AND_CROSS_MIN_VERSIONS): + pytest.skip("server supports bm25 cross-property AND") + + with pytest.raises(WeaviateUnsupportedFeatureError): + collection.query.bm25("banana split", operator=wvc.query.BM25Operator.and_cross()) diff --git a/integration/test_collection_hybrid.py b/integration/test_collection_hybrid.py index 696cf5b43..9c62c1233 100644 --- a/integration/test_collection_hybrid.py +++ b/integration/test_collection_hybrid.py @@ -21,6 +21,10 @@ _HybridNearVector, ) from weaviate.collections.classes.internal import Object +from weaviate.collections.grpc.shared import ( + _BM25_AND_CROSS_MIN_VERSIONS, + _BM25_AND_CROSS_MIN_VERSIONS_STR, +) from weaviate.exceptions import ( WeaviateUnsupportedFeatureError, ) @@ -528,3 +532,51 @@ def test_hybrid_bm25_operators(collection_factory: CollectionFactory) -> None: assert len(objs.objects) == 4 assert objs.objects[0].uuid == uuid2 assert sorted(obj.uuid for obj in objs.objects[1:]) == sorted([uuid1, uuid3, uuid4]) + + +def test_hybrid_bm25_operator_and_cross(collection_factory: CollectionFactory) -> None: + collection = collection_factory( + properties=[ + Property(name="title", data_type=DataType.TEXT), + Property(name="body", data_type=DataType.TEXT), + ], + vectorizer_config=Configure.Vectorizer.none(), + ) + + if not collection._connection._weaviate_version.is_at_least_any(*_BM25_AND_CROSS_MIN_VERSIONS): + pytest.skip(f"bm25 cross-property AND requires {_BM25_AND_CROSS_MIN_VERSIONS_STR}") + + # Only `split_across` needs cross-property matching: neither of its properties holds both tokens. + split_across = collection.data.insert({"title": "banana", "body": "split"}, vector=[1, 0, 0, 0]) + single_property = collection.data.insert( + {"title": "banana split", "body": "dessert"}, vector=[0, 1, 0, 0] + ) + collection.data.insert({"title": "banana", "body": "bread"}, vector=[0, 0, 1, 0]) + + objs = collection.query.hybrid( + "banana split", + vector=None, + alpha=0.0, + bm25_operator=wvc.query.BM25Operator.and_cross(), + ) + assert sorted(obj.uuid for obj in objs.objects) == sorted([split_across, single_property]) + + +def test_hybrid_bm25_operator_and_cross_unsupported_version( + collection_factory: CollectionFactory, +) -> None: + collection = collection_factory( + properties=[Property(name="name", data_type=DataType.TEXT)], + vectorizer_config=Configure.Vectorizer.none(), + ) + + if collection._connection._weaviate_version.is_at_least_any(*_BM25_AND_CROSS_MIN_VERSIONS): + pytest.skip("server supports bm25 cross-property AND") + + with pytest.raises(WeaviateUnsupportedFeatureError): + collection.query.hybrid( + "banana split", + vector=None, + alpha=0.0, + bm25_operator=wvc.query.BM25Operator.and_cross(), + ) diff --git a/test/collection/test_bm25_operator.py b/test/collection/test_bm25_operator.py new file mode 100644 index 000000000..8fee41d20 --- /dev/null +++ b/test/collection/test_bm25_operator.py @@ -0,0 +1,155 @@ +"""Unit tests: BM25 search operators are wired into the gRPC request and version-gated. + +``BM25Operator.and_cross()`` maps to the ``OPERATOR_AND_CROSS`` enum added in Weaviate 1.39.0 and +backported to 1.38.8 and 1.37.15, so the client must reject it on servers outside those ranges +rather than send an enum value the server will not understand. +""" + +from typing import Optional + +import pytest + +from weaviate.classes.query import BM25Operator +from weaviate.collections.classes.grpc import BM25OperatorOptions +from weaviate.collections.grpc.aggregate import _AggregateGRPC +from weaviate.collections.grpc.query import _QueryGRPC +from weaviate.exceptions import WeaviateUnsupportedFeatureError +from weaviate.proto.v1 import base_search_pb2 +from weaviate.util import _ServerVersion + +_SUPPORTED = ["1.37.15", "1.38.8", "1.39.0", "1.40.0"] +_UNSUPPORTED = ["1.36.9", "1.37.14", "1.38.0", "1.38.7"] + + +def _query(version: str = "1.39.0") -> _QueryGRPC: + return _QueryGRPC( + weaviate_version=_ServerVersion.from_string(version), + name="Dummy", + tenant=None, + consistency_level=None, + validate_arguments=True, + uses_125_api=True, + uses_127_api=True, + ) + + +def _aggregate(version: str = "1.39.0") -> _AggregateGRPC: + return _AggregateGRPC( + weaviate_version=_ServerVersion.from_string(version), + name="Dummy", + tenant=None, + consistency_level=None, + validate_arguments=True, + ) + + +def _aggregate_hybrid( + builder: _AggregateGRPC, operator: Optional[BM25OperatorOptions] +) -> base_search_pb2.Hybrid: + return builder.hybrid( + query="banana two", + alpha=0.0, + vector=None, + properties=None, + target_vector=None, + bm25_operator=operator, + aggregations=[], + filters=None, + group_by=None, + limit=None, + object_limit=None, + objects_count=False, + ).hybrid + + +@pytest.mark.parametrize( + "operator,expected,minimum_or_tokens_match", + [ + (BM25Operator.and_(), base_search_pb2.SearchOperatorOptions.OPERATOR_AND, 0), + (BM25Operator.or_(minimum_match=2), base_search_pb2.SearchOperatorOptions.OPERATOR_OR, 2), + ( + BM25Operator.and_cross(), + base_search_pb2.SearchOperatorOptions.OPERATOR_AND_CROSS, + 0, + ), + ], +) +def test_bm25_operator_wired_into_request( + operator: BM25OperatorOptions, + expected: "base_search_pb2.SearchOperatorOptions.Operator", + minimum_or_tokens_match: int, +) -> None: + search_operator = ( + _query().bm25(query="banana two", operator=operator).bm25_search.search_operator + ) + assert search_operator.operator == expected + assert search_operator.minimum_or_tokens_match == minimum_or_tokens_match + + +@pytest.mark.parametrize( + "operator,expected", + [ + (BM25Operator.and_(), base_search_pb2.SearchOperatorOptions.OPERATOR_AND), + (BM25Operator.or_(minimum_match=2), base_search_pb2.SearchOperatorOptions.OPERATOR_OR), + (BM25Operator.and_cross(), base_search_pb2.SearchOperatorOptions.OPERATOR_AND_CROSS), + ], +) +def test_hybrid_bm25_operator_wired_into_request( + operator: BM25OperatorOptions, expected: "base_search_pb2.SearchOperatorOptions.Operator" +) -> None: + req = _query().hybrid(query="banana two", alpha=0.0, bm25_operator=operator) + assert req.hybrid_search.bm25_search_operator.operator == expected + + +def test_no_operator_leaves_search_operator_unset() -> None: + assert not _query().bm25(query="banana two").bm25_search.HasField("search_operator") + req = _query().hybrid(query="banana two", alpha=0.0) + assert not req.hybrid_search.HasField("bm25_search_operator") + + +@pytest.mark.parametrize("version", _SUPPORTED) +def test_and_cross_allowed_on_supported_versions(version: str) -> None: + req = _query(version).bm25(query="banana two", operator=BM25Operator.and_cross()) + assert ( + req.bm25_search.search_operator.operator + == base_search_pb2.SearchOperatorOptions.OPERATOR_AND_CROSS + ) + + +@pytest.mark.parametrize("version", _UNSUPPORTED) +def test_and_cross_rejected_on_unsupported_versions(version: str) -> None: + with pytest.raises(WeaviateUnsupportedFeatureError) as e: + _query(version).bm25(query="banana two", operator=BM25Operator.and_cross()) + assert "1.37.15 or 1.38.8 or 1.39.0" in str(e.value) + assert version in str(e.value) + + +@pytest.mark.parametrize("version", _UNSUPPORTED) +def test_hybrid_and_cross_rejected_on_unsupported_versions(version: str) -> None: + with pytest.raises(WeaviateUnsupportedFeatureError): + _query(version).hybrid( + query="banana two", alpha=0.0, bm25_operator=BM25Operator.and_cross() + ) + + +@pytest.mark.parametrize("version", _UNSUPPORTED) +def test_aggregate_hybrid_and_cross_rejected_on_unsupported_versions(version: str) -> None: + with pytest.raises(WeaviateUnsupportedFeatureError): + _aggregate_hybrid(_aggregate(version), BM25Operator.and_cross()) + + +def test_aggregate_hybrid_and_cross_allowed_on_supported_version() -> None: + hybrid = _aggregate_hybrid(_aggregate("1.39.0"), BM25Operator.and_cross()) + assert ( + hybrid.bm25_search_operator.operator + == base_search_pb2.SearchOperatorOptions.OPERATOR_AND_CROSS + ) + + +@pytest.mark.parametrize("version", _UNSUPPORTED) +@pytest.mark.parametrize("operator", [BM25Operator.and_(), BM25Operator.or_(minimum_match=1), None]) +def test_other_operators_unaffected_by_gate( + version: str, operator: Optional[BM25OperatorOptions] +) -> None: + _query(version).bm25(query="banana two", operator=operator) + _query(version).hybrid(query="banana two", alpha=0.0, bm25_operator=operator) diff --git a/test/test_server_version.py b/test/test_server_version.py index 1cf5e6097..20ae0b9cc 100644 --- a/test/test_server_version.py +++ b/test/test_server_version.py @@ -60,6 +60,34 @@ def test_server_version_is_at_least(is_valid: bool) -> None: assert is_valid +@pytest.mark.parametrize( + "version,expected", + [ + ("1.36.9", False), + ("1.37.14", False), + ("1.37.15", True), + ("1.37.99", True), + ("1.38.0", False), + ("1.38.7", False), + ("1.38.8", True), + ("1.38.20", True), + ("1.39.0", True), + ("1.40.0", True), + ("2.0.0", True), + ], +) +def test_server_version_is_at_least_any(version: str, expected: bool) -> None: + assert ( + _ServerVersion.from_string(version).is_at_least_any((1, 37, 15), (1, 38, 8), (1, 39, 0)) + is expected + ) + + +def test_server_version_is_at_least_any_single_minimum() -> None: + assert _ServerVersion(1, 39, 0).is_at_least_any((1, 39, 0)) + assert not _ServerVersion(1, 38, 99).is_at_least_any((1, 39, 0)) + + def test_server_version_magic_methods() -> None: # Test __eq__ assert _ServerVersion(1, 2, 3) == _ServerVersion(1, 2, 3) diff --git a/weaviate/collections/classes/grpc.py b/weaviate/collections/classes/grpc.py index f5c8fe772..5cba315f7 100644 --- a/weaviate/collections/classes/grpc.py +++ b/weaviate/collections/classes/grpc.py @@ -672,6 +672,13 @@ class BM25OperatorAnd(BM25OperatorOptions): operator = base_search_pb2.SearchOperatorOptions.OPERATOR_AND +@dataclass +class BM25OperatorAndCross(BM25OperatorOptions): + """Define the cross-property 'And' operator for keyword queries.""" + + operator = base_search_pb2.SearchOperatorOptions.OPERATOR_AND_CROSS + + class BM25OperatorFactory: """Define how the BM25 query's token matching should be performed.""" @@ -697,6 +704,20 @@ def and_() -> BM25OperatorOptions: """ return BM25OperatorAnd() + @staticmethod + def and_cross() -> BM25OperatorOptions: + """Use the cross-property 'And' operator for keyword queries, where all query tokens must match across the searched properties combined. + + Unlike `and_()`, which requires every token to occur within a single property, a token may be + matched by any of the searched properties, as long as each token is matched by at least one. + + All searched properties must share the same tokenization and analyzer settings; the server + rejects the query otherwise. + + Requires Weaviate `1.37.15`, `1.38.8`, `1.39.0` or higher. + """ + return BM25OperatorAndCross() + OneDimensionalVectorType = Sequence[NUMBER] """Represents a one-dimensional vector, e.g. one produced by the `Configure.Vectors.text2vec_jinaai()` module""" diff --git a/weaviate/collections/grpc/query.py b/weaviate/collections/grpc/query.py index 46593da10..281da6e2d 100644 --- a/weaviate/collections/grpc/query.py +++ b/weaviate/collections/grpc/query.py @@ -24,7 +24,6 @@ REFERENCE, REFERENCES, BM25OperatorOptions, - BM25OperatorOr, HybridFusion, HybridVectorType, Move, @@ -243,14 +242,7 @@ def bm25( base_search_pb2.BM25( query=query, properties=properties if properties is not None else [], - search_operator=base_search_pb2.SearchOperatorOptions( - operator=operator.operator, - minimum_or_tokens_match=operator.minimum_should_match - if isinstance(operator, BM25OperatorOr) - else None, - ) - if operator is not None - else None, + search_operator=self._bm25_operator_to_grpc(operator), ) if query is not None else None diff --git a/weaviate/collections/grpc/shared.py b/weaviate/collections/grpc/shared.py index 51e2a65c7..3b39a611b 100644 --- a/weaviate/collections/grpc/shared.py +++ b/weaviate/collections/grpc/shared.py @@ -18,6 +18,7 @@ from weaviate.collections.classes.config import ConsistencyLevel from weaviate.collections.classes.grpc import ( MMR, + BM25OperatorAndCross, BM25OperatorOptions, BM25OperatorOr, HybridFusion, @@ -35,6 +36,7 @@ ) from weaviate.exceptions import ( WeaviateInvalidInputError, + WeaviateUnsupportedFeatureError, ) from weaviate.proto.v1 import base_pb2, base_search_pb2 from weaviate.types import NUMBER, UUID @@ -49,6 +51,12 @@ UINT32_LEN = 4 UINT64_LEN = 8 +# Cross-property AND was backported to the 1.37 and 1.38 branches after landing in 1.39. +_BM25_AND_CROSS_MIN_VERSIONS = ((1, 37, 15), (1, 38, 8), (1, 39, 0)) +_BM25_AND_CROSS_MIN_VERSIONS_STR = " or ".join( + f"{major}.{minor}.{patch}" for major, minor, patch in _BM25_AND_CROSS_MIN_VERSIONS +) + class _BaseGRPC: def __init__( @@ -76,6 +84,30 @@ def _get_consistency_level( assert consistency_level.value == ConsistencyLevel.ALL return base_pb2.ConsistencyLevel.CONSISTENCY_LEVEL_ALL + def _bm25_operator_to_grpc( + self, bm25_operator: Optional[BM25OperatorOptions] + ) -> Optional["base_search_pb2.SearchOperatorOptions"]: + if bm25_operator is None: + return None + + if isinstance( + bm25_operator, BM25OperatorAndCross + ) and not self._weaviate_version.is_at_least_any(*_BM25_AND_CROSS_MIN_VERSIONS): + raise WeaviateUnsupportedFeatureError( + "BM25Operator.and_cross()", + str(self._weaviate_version), + _BM25_AND_CROSS_MIN_VERSIONS_STR, + ) + + return base_search_pb2.SearchOperatorOptions( + operator=bm25_operator.operator, + minimum_or_tokens_match=( + bm25_operator.minimum_should_match + if isinstance(bm25_operator, BM25OperatorOr) + else None + ), + ) + def _recompute_target_vector_to_grpc( self, target_vector: Optional[TargetVectorJoinType], @@ -741,14 +773,7 @@ def _parse_hybrid( vector_distance=distance, vectors=vectors, selection=self._diversity_selection_to_grpc(diversity_selection), - bm25_search_operator=base_search_pb2.SearchOperatorOptions( - operator=bm25_operator.operator, - minimum_or_tokens_match=bm25_operator.minimum_should_match - if isinstance(bm25_operator, BM25OperatorOr) - else None, - ) - if bm25_operator is not None - else None, + bm25_search_operator=self._bm25_operator_to_grpc(bm25_operator), ) if query is not None or vector is not None else None diff --git a/weaviate/proto/v1/v4216/v1/base_search_pb2.py b/weaviate/proto/v1/v4216/v1/base_search_pb2.py index aa4fdf57d..460ed4fd0 100644 --- a/weaviate/proto/v1/v4216/v1/base_search_pb2.py +++ b/weaviate/proto/v1/v4216/v1/base_search_pb2.py @@ -14,7 +14,7 @@ from weaviate.proto.v1.v4216.v1 import base_pb2 as v1_dot_base__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14v1/base_search.proto\x12\x0bweaviate.v1\x1a\rv1/base.proto\"2\n\x10WeightsForTarget\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0e\n\x06weight\x18\x02 \x01(\x02\"\x98\x01\n\x07Targets\x12\x16\n\x0etarget_vectors\x18\x01 \x03(\t\x12\x33\n\x0b\x63ombination\x18\x02 \x01(\x0e\x32\x1e.weaviate.v1.CombinationMethod\x12:\n\x13weights_for_targets\x18\x04 \x03(\x0b\x32\x1d.weaviate.v1.WeightsForTargetJ\x04\x08\x03\x10\x04\"`\n\x0fVectorForTarget\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x0cvector_bytes\x18\x02 \x01(\x0c\x42\x02\x18\x01\x12%\n\x07vectors\x18\x03 \x03(\x0b\x32\x14.weaviate.v1.Vectors\"\x8a\x01\n\tSelection\x12)\n\x03mmr\x18\x01 \x01(\x0b\x32\x1a.weaviate.v1.Selection.MMRH\x00\x1a\x45\n\x03MMR\x12\x12\n\x05limit\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07\x62\x61lance\x18\x02 \x01(\x02H\x01\x88\x01\x01\x42\x08\n\x06_limitB\n\n\x08_balanceB\x0b\n\tselection\"\xe1\x01\n\x15SearchOperatorOptions\x12=\n\x08operator\x18\x01 \x01(\x0e\x32+.weaviate.v1.SearchOperatorOptions.Operator\x12$\n\x17minimum_or_tokens_match\x18\x02 \x01(\x05H\x00\x88\x01\x01\"G\n\x08Operator\x12\x18\n\x14OPERATOR_UNSPECIFIED\x10\x00\x12\x0f\n\x0bOPERATOR_OR\x10\x01\x12\x10\n\x0cOPERATOR_AND\x10\x02\x42\x1a\n\x18_minimum_or_tokens_match\"\xd5\x05\n\x06Hybrid\x12\r\n\x05query\x18\x01 \x01(\t\x12\x12\n\nproperties\x18\x02 \x03(\t\x12\x12\n\x06vector\x18\x03 \x03(\x02\x42\x02\x18\x01\x12\x11\n\x05\x61lpha\x18\x04 \x01(\x02\x42\x02\x18\x01\x12\x33\n\x0b\x66usion_type\x18\x05 \x01(\x0e\x32\x1e.weaviate.v1.Hybrid.FusionType\x12\x18\n\x0cvector_bytes\x18\x06 \x01(\x0c\x42\x02\x18\x01\x12\x1a\n\x0etarget_vectors\x18\x07 \x03(\tB\x02\x18\x01\x12.\n\tnear_text\x18\x08 \x01(\x0b\x32\x1b.weaviate.v1.NearTextSearch\x12,\n\x0bnear_vector\x18\t \x01(\x0b\x32\x17.weaviate.v1.NearVector\x12%\n\x07targets\x18\n \x01(\x0b\x32\x14.weaviate.v1.Targets\x12\x45\n\x14\x62m25_search_operator\x18\x0b \x01(\x0b\x32\".weaviate.v1.SearchOperatorOptionsH\x01\x88\x01\x01\x12\x18\n\x0b\x61lpha_param\x18\x0c \x01(\x02H\x02\x88\x01\x01\x12\x17\n\x0fuse_alpha_param\x18\r \x01(\x08\x12.\n\tselection\x18\x0e \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x03\x88\x01\x01\x12\x19\n\x0fvector_distance\x18\x14 \x01(\x02H\x00\x12%\n\x07vectors\x18\x15 \x03(\x0b\x32\x14.weaviate.v1.Vectors\"a\n\nFusionType\x12\x1b\n\x17\x46USION_TYPE_UNSPECIFIED\x10\x00\x12\x16\n\x12\x46USION_TYPE_RANKED\x10\x01\x12\x1e\n\x1a\x46USION_TYPE_RELATIVE_SCORE\x10\x02\x42\x0b\n\tthresholdB\x17\n\x15_bm25_search_operatorB\x0e\n\x0c_alpha_paramB\x0c\n\n_selection\"\xeb\x03\n\nNearVector\x12\x12\n\x06vector\x18\x01 \x03(\x02\x42\x02\x18\x01\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x18\n\x0cvector_bytes\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12\x1a\n\x0etarget_vectors\x18\x05 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x06 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12K\n\x11vector_per_target\x18\x07 \x03(\x0b\x32,.weaviate.v1.NearVector.VectorPerTargetEntryB\x02\x18\x01\x12\x38\n\x12vector_for_targets\x18\x08 \x03(\x0b\x32\x1c.weaviate.v1.VectorForTarget\x12%\n\x07vectors\x18\t \x03(\x0b\x32\x14.weaviate.v1.Vectors\x12.\n\tselection\x18\n \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x1a\x36\n\x14VectorPerTargetEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xe3\x01\n\nNearObject\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xae\x03\n\x0eNearTextSearch\x12\r\n\x05query\x18\x01 \x03(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x36\n\x07move_to\x18\x04 \x01(\x0b\x32 .weaviate.v1.NearTextSearch.MoveH\x02\x88\x01\x01\x12\x38\n\tmove_away\x18\x05 \x01(\x0b\x32 .weaviate.v1.NearTextSearch.MoveH\x03\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x06 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x07 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x08 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x04\x88\x01\x01\x1a\x36\n\x04Move\x12\r\n\x05\x66orce\x18\x01 \x01(\x02\x12\x10\n\x08\x63oncepts\x18\x02 \x03(\t\x12\r\n\x05uuids\x18\x03 \x03(\tB\x0c\n\n_certaintyB\x0b\n\t_distanceB\n\n\x08_move_toB\x0c\n\n_move_awayB\x0c\n\n_selection\"\xeb\x01\n\x0fNearImageSearch\x12\r\n\x05image\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearAudioSearch\x12\r\n\x05\x61udio\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearVideoSearch\x12\r\n\x05video\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearDepthSearch\x12\r\n\x05\x64\x65pth\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xef\x01\n\x11NearThermalSearch\x12\x0f\n\x07thermal\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xe7\x01\n\rNearIMUSearch\x12\x0b\n\x03imu\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\x7f\n\x04\x42M25\x12\r\n\x05query\x18\x01 \x01(\t\x12\x12\n\nproperties\x18\x02 \x03(\t\x12@\n\x0fsearch_operator\x18\x03 \x01(\x0b\x32\".weaviate.v1.SearchOperatorOptionsH\x00\x88\x01\x01\x42\x12\n\x10_search_operator*\xee\x01\n\x11\x43ombinationMethod\x12\"\n\x1e\x43OMBINATION_METHOD_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x43OMBINATION_METHOD_TYPE_SUM\x10\x01\x12\x1f\n\x1b\x43OMBINATION_METHOD_TYPE_MIN\x10\x02\x12#\n\x1f\x43OMBINATION_METHOD_TYPE_AVERAGE\x10\x03\x12*\n&COMBINATION_METHOD_TYPE_RELATIVE_SCORE\x10\x04\x12\"\n\x1e\x43OMBINATION_METHOD_TYPE_MANUAL\x10\x05\x42t\n#io.weaviate.client.grpc.protocol.v1B\x17WeaviateProtoBaseSearchZ4github.com/weaviate/weaviate/grpc/generated;protocolb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14v1/base_search.proto\x12\x0bweaviate.v1\x1a\rv1/base.proto\"2\n\x10WeightsForTarget\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0e\n\x06weight\x18\x02 \x01(\x02\"\x98\x01\n\x07Targets\x12\x16\n\x0etarget_vectors\x18\x01 \x03(\t\x12\x33\n\x0b\x63ombination\x18\x02 \x01(\x0e\x32\x1e.weaviate.v1.CombinationMethod\x12:\n\x13weights_for_targets\x18\x04 \x03(\x0b\x32\x1d.weaviate.v1.WeightsForTargetJ\x04\x08\x03\x10\x04\"`\n\x0fVectorForTarget\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x0cvector_bytes\x18\x02 \x01(\x0c\x42\x02\x18\x01\x12%\n\x07vectors\x18\x03 \x03(\x0b\x32\x14.weaviate.v1.Vectors\"\x8a\x01\n\tSelection\x12)\n\x03mmr\x18\x01 \x01(\x0b\x32\x1a.weaviate.v1.Selection.MMRH\x00\x1a\x45\n\x03MMR\x12\x12\n\x05limit\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07\x62\x61lance\x18\x02 \x01(\x02H\x01\x88\x01\x01\x42\x08\n\x06_limitB\n\n\x08_balanceB\x0b\n\tselection\"\xf9\x01\n\x15SearchOperatorOptions\x12=\n\x08operator\x18\x01 \x01(\x0e\x32+.weaviate.v1.SearchOperatorOptions.Operator\x12$\n\x17minimum_or_tokens_match\x18\x02 \x01(\x05H\x00\x88\x01\x01\"_\n\x08Operator\x12\x18\n\x14OPERATOR_UNSPECIFIED\x10\x00\x12\x0f\n\x0bOPERATOR_OR\x10\x01\x12\x10\n\x0cOPERATOR_AND\x10\x02\x12\x16\n\x12OPERATOR_AND_CROSS\x10\x03\x42\x1a\n\x18_minimum_or_tokens_match\"\xd5\x05\n\x06Hybrid\x12\r\n\x05query\x18\x01 \x01(\t\x12\x12\n\nproperties\x18\x02 \x03(\t\x12\x12\n\x06vector\x18\x03 \x03(\x02\x42\x02\x18\x01\x12\x11\n\x05\x61lpha\x18\x04 \x01(\x02\x42\x02\x18\x01\x12\x33\n\x0b\x66usion_type\x18\x05 \x01(\x0e\x32\x1e.weaviate.v1.Hybrid.FusionType\x12\x18\n\x0cvector_bytes\x18\x06 \x01(\x0c\x42\x02\x18\x01\x12\x1a\n\x0etarget_vectors\x18\x07 \x03(\tB\x02\x18\x01\x12.\n\tnear_text\x18\x08 \x01(\x0b\x32\x1b.weaviate.v1.NearTextSearch\x12,\n\x0bnear_vector\x18\t \x01(\x0b\x32\x17.weaviate.v1.NearVector\x12%\n\x07targets\x18\n \x01(\x0b\x32\x14.weaviate.v1.Targets\x12\x45\n\x14\x62m25_search_operator\x18\x0b \x01(\x0b\x32\".weaviate.v1.SearchOperatorOptionsH\x01\x88\x01\x01\x12\x18\n\x0b\x61lpha_param\x18\x0c \x01(\x02H\x02\x88\x01\x01\x12\x17\n\x0fuse_alpha_param\x18\r \x01(\x08\x12.\n\tselection\x18\x0e \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x03\x88\x01\x01\x12\x19\n\x0fvector_distance\x18\x14 \x01(\x02H\x00\x12%\n\x07vectors\x18\x15 \x03(\x0b\x32\x14.weaviate.v1.Vectors\"a\n\nFusionType\x12\x1b\n\x17\x46USION_TYPE_UNSPECIFIED\x10\x00\x12\x16\n\x12\x46USION_TYPE_RANKED\x10\x01\x12\x1e\n\x1a\x46USION_TYPE_RELATIVE_SCORE\x10\x02\x42\x0b\n\tthresholdB\x17\n\x15_bm25_search_operatorB\x0e\n\x0c_alpha_paramB\x0c\n\n_selection\"\xeb\x03\n\nNearVector\x12\x12\n\x06vector\x18\x01 \x03(\x02\x42\x02\x18\x01\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x18\n\x0cvector_bytes\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12\x1a\n\x0etarget_vectors\x18\x05 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x06 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12K\n\x11vector_per_target\x18\x07 \x03(\x0b\x32,.weaviate.v1.NearVector.VectorPerTargetEntryB\x02\x18\x01\x12\x38\n\x12vector_for_targets\x18\x08 \x03(\x0b\x32\x1c.weaviate.v1.VectorForTarget\x12%\n\x07vectors\x18\t \x03(\x0b\x32\x14.weaviate.v1.Vectors\x12.\n\tselection\x18\n \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x1a\x36\n\x14VectorPerTargetEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xe3\x01\n\nNearObject\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xae\x03\n\x0eNearTextSearch\x12\r\n\x05query\x18\x01 \x03(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x36\n\x07move_to\x18\x04 \x01(\x0b\x32 .weaviate.v1.NearTextSearch.MoveH\x02\x88\x01\x01\x12\x38\n\tmove_away\x18\x05 \x01(\x0b\x32 .weaviate.v1.NearTextSearch.MoveH\x03\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x06 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x07 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x08 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x04\x88\x01\x01\x1a\x36\n\x04Move\x12\r\n\x05\x66orce\x18\x01 \x01(\x02\x12\x10\n\x08\x63oncepts\x18\x02 \x03(\t\x12\r\n\x05uuids\x18\x03 \x03(\tB\x0c\n\n_certaintyB\x0b\n\t_distanceB\n\n\x08_move_toB\x0c\n\n_move_awayB\x0c\n\n_selection\"\xeb\x01\n\x0fNearImageSearch\x12\r\n\x05image\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearAudioSearch\x12\r\n\x05\x61udio\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearVideoSearch\x12\r\n\x05video\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearDepthSearch\x12\r\n\x05\x64\x65pth\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xef\x01\n\x11NearThermalSearch\x12\x0f\n\x07thermal\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xe7\x01\n\rNearIMUSearch\x12\x0b\n\x03imu\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\x7f\n\x04\x42M25\x12\r\n\x05query\x18\x01 \x01(\t\x12\x12\n\nproperties\x18\x02 \x03(\t\x12@\n\x0fsearch_operator\x18\x03 \x01(\x0b\x32\".weaviate.v1.SearchOperatorOptionsH\x00\x88\x01\x01\x42\x12\n\x10_search_operator*\xee\x01\n\x11\x43ombinationMethod\x12\"\n\x1e\x43OMBINATION_METHOD_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x43OMBINATION_METHOD_TYPE_SUM\x10\x01\x12\x1f\n\x1b\x43OMBINATION_METHOD_TYPE_MIN\x10\x02\x12#\n\x1f\x43OMBINATION_METHOD_TYPE_AVERAGE\x10\x03\x12*\n&COMBINATION_METHOD_TYPE_RELATIVE_SCORE\x10\x04\x12\"\n\x1e\x43OMBINATION_METHOD_TYPE_MANUAL\x10\x05\x42t\n#io.weaviate.client.grpc.protocol.v1B\x17WeaviateProtoBaseSearchZ4github.com/weaviate/weaviate/grpc/generated;protocolb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -58,8 +58,8 @@ _NEARTHERMALSEARCH.fields_by_name['target_vectors']._serialized_options = b'\030\001' _NEARIMUSEARCH.fields_by_name['target_vectors']._options = None _NEARIMUSEARCH.fields_by_name['target_vectors']._serialized_options = b'\030\001' - _globals['_COMBINATIONMETHOD']._serialized_start=4169 - _globals['_COMBINATIONMETHOD']._serialized_end=4407 + _globals['_COMBINATIONMETHOD']._serialized_start=4193 + _globals['_COMBINATIONMETHOD']._serialized_end=4431 _globals['_WEIGHTSFORTARGET']._serialized_start=52 _globals['_WEIGHTSFORTARGET']._serialized_end=102 _globals['_TARGETS']._serialized_start=105 @@ -71,35 +71,35 @@ _globals['_SELECTION_MMR']._serialized_start=414 _globals['_SELECTION_MMR']._serialized_end=483 _globals['_SEARCHOPERATOROPTIONS']._serialized_start=499 - _globals['_SEARCHOPERATOROPTIONS']._serialized_end=724 + _globals['_SEARCHOPERATOROPTIONS']._serialized_end=748 _globals['_SEARCHOPERATOROPTIONS_OPERATOR']._serialized_start=625 - _globals['_SEARCHOPERATOROPTIONS_OPERATOR']._serialized_end=696 - _globals['_HYBRID']._serialized_start=727 - _globals['_HYBRID']._serialized_end=1452 - _globals['_HYBRID_FUSIONTYPE']._serialized_start=1287 - _globals['_HYBRID_FUSIONTYPE']._serialized_end=1384 - _globals['_NEARVECTOR']._serialized_start=1455 - _globals['_NEARVECTOR']._serialized_end=1946 - _globals['_NEARVECTOR_VECTORPERTARGETENTRY']._serialized_start=1851 - _globals['_NEARVECTOR_VECTORPERTARGETENTRY']._serialized_end=1905 - _globals['_NEAROBJECT']._serialized_start=1949 - _globals['_NEAROBJECT']._serialized_end=2176 - _globals['_NEARTEXTSEARCH']._serialized_start=2179 - _globals['_NEARTEXTSEARCH']._serialized_end=2609 - _globals['_NEARTEXTSEARCH_MOVE']._serialized_start=2488 - _globals['_NEARTEXTSEARCH_MOVE']._serialized_end=2542 - _globals['_NEARIMAGESEARCH']._serialized_start=2612 - _globals['_NEARIMAGESEARCH']._serialized_end=2847 - _globals['_NEARAUDIOSEARCH']._serialized_start=2850 - _globals['_NEARAUDIOSEARCH']._serialized_end=3085 - _globals['_NEARVIDEOSEARCH']._serialized_start=3088 - _globals['_NEARVIDEOSEARCH']._serialized_end=3323 - _globals['_NEARDEPTHSEARCH']._serialized_start=3326 - _globals['_NEARDEPTHSEARCH']._serialized_end=3561 - _globals['_NEARTHERMALSEARCH']._serialized_start=3564 - _globals['_NEARTHERMALSEARCH']._serialized_end=3803 - _globals['_NEARIMUSEARCH']._serialized_start=3806 - _globals['_NEARIMUSEARCH']._serialized_end=4037 - _globals['_BM25']._serialized_start=4039 - _globals['_BM25']._serialized_end=4166 + _globals['_SEARCHOPERATOROPTIONS_OPERATOR']._serialized_end=720 + _globals['_HYBRID']._serialized_start=751 + _globals['_HYBRID']._serialized_end=1476 + _globals['_HYBRID_FUSIONTYPE']._serialized_start=1311 + _globals['_HYBRID_FUSIONTYPE']._serialized_end=1408 + _globals['_NEARVECTOR']._serialized_start=1479 + _globals['_NEARVECTOR']._serialized_end=1970 + _globals['_NEARVECTOR_VECTORPERTARGETENTRY']._serialized_start=1875 + _globals['_NEARVECTOR_VECTORPERTARGETENTRY']._serialized_end=1929 + _globals['_NEAROBJECT']._serialized_start=1973 + _globals['_NEAROBJECT']._serialized_end=2200 + _globals['_NEARTEXTSEARCH']._serialized_start=2203 + _globals['_NEARTEXTSEARCH']._serialized_end=2633 + _globals['_NEARTEXTSEARCH_MOVE']._serialized_start=2512 + _globals['_NEARTEXTSEARCH_MOVE']._serialized_end=2566 + _globals['_NEARIMAGESEARCH']._serialized_start=2636 + _globals['_NEARIMAGESEARCH']._serialized_end=2871 + _globals['_NEARAUDIOSEARCH']._serialized_start=2874 + _globals['_NEARAUDIOSEARCH']._serialized_end=3109 + _globals['_NEARVIDEOSEARCH']._serialized_start=3112 + _globals['_NEARVIDEOSEARCH']._serialized_end=3347 + _globals['_NEARDEPTHSEARCH']._serialized_start=3350 + _globals['_NEARDEPTHSEARCH']._serialized_end=3585 + _globals['_NEARTHERMALSEARCH']._serialized_start=3588 + _globals['_NEARTHERMALSEARCH']._serialized_end=3827 + _globals['_NEARIMUSEARCH']._serialized_start=3830 + _globals['_NEARIMUSEARCH']._serialized_end=4061 + _globals['_BM25']._serialized_start=4063 + _globals['_BM25']._serialized_end=4190 # @@protoc_insertion_point(module_scope) diff --git a/weaviate/proto/v1/v4216/v1/base_search_pb2.pyi b/weaviate/proto/v1/v4216/v1/base_search_pb2.pyi index b94597ecb..649a07832 100644 --- a/weaviate/proto/v1/v4216/v1/base_search_pb2.pyi +++ b/weaviate/proto/v1/v4216/v1/base_search_pb2.pyi @@ -70,9 +70,11 @@ class SearchOperatorOptions(_message.Message): OPERATOR_UNSPECIFIED: _ClassVar[SearchOperatorOptions.Operator] OPERATOR_OR: _ClassVar[SearchOperatorOptions.Operator] OPERATOR_AND: _ClassVar[SearchOperatorOptions.Operator] + OPERATOR_AND_CROSS: _ClassVar[SearchOperatorOptions.Operator] OPERATOR_UNSPECIFIED: SearchOperatorOptions.Operator OPERATOR_OR: SearchOperatorOptions.Operator OPERATOR_AND: SearchOperatorOptions.Operator + OPERATOR_AND_CROSS: SearchOperatorOptions.Operator OPERATOR_FIELD_NUMBER: _ClassVar[int] MINIMUM_OR_TOKENS_MATCH_FIELD_NUMBER: _ClassVar[int] operator: SearchOperatorOptions.Operator diff --git a/weaviate/proto/v1/v5261/v1/base_search_pb2.py b/weaviate/proto/v1/v5261/v1/base_search_pb2.py index c5b9beaae..cc2952d99 100644 --- a/weaviate/proto/v1/v5261/v1/base_search_pb2.py +++ b/weaviate/proto/v1/v5261/v1/base_search_pb2.py @@ -15,7 +15,7 @@ from weaviate.proto.v1.v5261.v1 import base_pb2 as v1_dot_base__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14v1/base_search.proto\x12\x0bweaviate.v1\x1a\rv1/base.proto\"2\n\x10WeightsForTarget\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0e\n\x06weight\x18\x02 \x01(\x02\"\x98\x01\n\x07Targets\x12\x16\n\x0etarget_vectors\x18\x01 \x03(\t\x12\x33\n\x0b\x63ombination\x18\x02 \x01(\x0e\x32\x1e.weaviate.v1.CombinationMethod\x12:\n\x13weights_for_targets\x18\x04 \x03(\x0b\x32\x1d.weaviate.v1.WeightsForTargetJ\x04\x08\x03\x10\x04\"`\n\x0fVectorForTarget\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x0cvector_bytes\x18\x02 \x01(\x0c\x42\x02\x18\x01\x12%\n\x07vectors\x18\x03 \x03(\x0b\x32\x14.weaviate.v1.Vectors\"\x8a\x01\n\tSelection\x12)\n\x03mmr\x18\x01 \x01(\x0b\x32\x1a.weaviate.v1.Selection.MMRH\x00\x1a\x45\n\x03MMR\x12\x12\n\x05limit\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07\x62\x61lance\x18\x02 \x01(\x02H\x01\x88\x01\x01\x42\x08\n\x06_limitB\n\n\x08_balanceB\x0b\n\tselection\"\xe1\x01\n\x15SearchOperatorOptions\x12=\n\x08operator\x18\x01 \x01(\x0e\x32+.weaviate.v1.SearchOperatorOptions.Operator\x12$\n\x17minimum_or_tokens_match\x18\x02 \x01(\x05H\x00\x88\x01\x01\"G\n\x08Operator\x12\x18\n\x14OPERATOR_UNSPECIFIED\x10\x00\x12\x0f\n\x0bOPERATOR_OR\x10\x01\x12\x10\n\x0cOPERATOR_AND\x10\x02\x42\x1a\n\x18_minimum_or_tokens_match\"\xd5\x05\n\x06Hybrid\x12\r\n\x05query\x18\x01 \x01(\t\x12\x12\n\nproperties\x18\x02 \x03(\t\x12\x12\n\x06vector\x18\x03 \x03(\x02\x42\x02\x18\x01\x12\x11\n\x05\x61lpha\x18\x04 \x01(\x02\x42\x02\x18\x01\x12\x33\n\x0b\x66usion_type\x18\x05 \x01(\x0e\x32\x1e.weaviate.v1.Hybrid.FusionType\x12\x18\n\x0cvector_bytes\x18\x06 \x01(\x0c\x42\x02\x18\x01\x12\x1a\n\x0etarget_vectors\x18\x07 \x03(\tB\x02\x18\x01\x12.\n\tnear_text\x18\x08 \x01(\x0b\x32\x1b.weaviate.v1.NearTextSearch\x12,\n\x0bnear_vector\x18\t \x01(\x0b\x32\x17.weaviate.v1.NearVector\x12%\n\x07targets\x18\n \x01(\x0b\x32\x14.weaviate.v1.Targets\x12\x45\n\x14\x62m25_search_operator\x18\x0b \x01(\x0b\x32\".weaviate.v1.SearchOperatorOptionsH\x01\x88\x01\x01\x12\x18\n\x0b\x61lpha_param\x18\x0c \x01(\x02H\x02\x88\x01\x01\x12\x17\n\x0fuse_alpha_param\x18\r \x01(\x08\x12.\n\tselection\x18\x0e \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x03\x88\x01\x01\x12\x19\n\x0fvector_distance\x18\x14 \x01(\x02H\x00\x12%\n\x07vectors\x18\x15 \x03(\x0b\x32\x14.weaviate.v1.Vectors\"a\n\nFusionType\x12\x1b\n\x17\x46USION_TYPE_UNSPECIFIED\x10\x00\x12\x16\n\x12\x46USION_TYPE_RANKED\x10\x01\x12\x1e\n\x1a\x46USION_TYPE_RELATIVE_SCORE\x10\x02\x42\x0b\n\tthresholdB\x17\n\x15_bm25_search_operatorB\x0e\n\x0c_alpha_paramB\x0c\n\n_selection\"\xeb\x03\n\nNearVector\x12\x12\n\x06vector\x18\x01 \x03(\x02\x42\x02\x18\x01\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x18\n\x0cvector_bytes\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12\x1a\n\x0etarget_vectors\x18\x05 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x06 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12K\n\x11vector_per_target\x18\x07 \x03(\x0b\x32,.weaviate.v1.NearVector.VectorPerTargetEntryB\x02\x18\x01\x12\x38\n\x12vector_for_targets\x18\x08 \x03(\x0b\x32\x1c.weaviate.v1.VectorForTarget\x12%\n\x07vectors\x18\t \x03(\x0b\x32\x14.weaviate.v1.Vectors\x12.\n\tselection\x18\n \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x1a\x36\n\x14VectorPerTargetEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xe3\x01\n\nNearObject\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xae\x03\n\x0eNearTextSearch\x12\r\n\x05query\x18\x01 \x03(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x36\n\x07move_to\x18\x04 \x01(\x0b\x32 .weaviate.v1.NearTextSearch.MoveH\x02\x88\x01\x01\x12\x38\n\tmove_away\x18\x05 \x01(\x0b\x32 .weaviate.v1.NearTextSearch.MoveH\x03\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x06 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x07 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x08 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x04\x88\x01\x01\x1a\x36\n\x04Move\x12\r\n\x05\x66orce\x18\x01 \x01(\x02\x12\x10\n\x08\x63oncepts\x18\x02 \x03(\t\x12\r\n\x05uuids\x18\x03 \x03(\tB\x0c\n\n_certaintyB\x0b\n\t_distanceB\n\n\x08_move_toB\x0c\n\n_move_awayB\x0c\n\n_selection\"\xeb\x01\n\x0fNearImageSearch\x12\r\n\x05image\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearAudioSearch\x12\r\n\x05\x61udio\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearVideoSearch\x12\r\n\x05video\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearDepthSearch\x12\r\n\x05\x64\x65pth\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xef\x01\n\x11NearThermalSearch\x12\x0f\n\x07thermal\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xe7\x01\n\rNearIMUSearch\x12\x0b\n\x03imu\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\x7f\n\x04\x42M25\x12\r\n\x05query\x18\x01 \x01(\t\x12\x12\n\nproperties\x18\x02 \x03(\t\x12@\n\x0fsearch_operator\x18\x03 \x01(\x0b\x32\".weaviate.v1.SearchOperatorOptionsH\x00\x88\x01\x01\x42\x12\n\x10_search_operator*\xee\x01\n\x11\x43ombinationMethod\x12\"\n\x1e\x43OMBINATION_METHOD_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x43OMBINATION_METHOD_TYPE_SUM\x10\x01\x12\x1f\n\x1b\x43OMBINATION_METHOD_TYPE_MIN\x10\x02\x12#\n\x1f\x43OMBINATION_METHOD_TYPE_AVERAGE\x10\x03\x12*\n&COMBINATION_METHOD_TYPE_RELATIVE_SCORE\x10\x04\x12\"\n\x1e\x43OMBINATION_METHOD_TYPE_MANUAL\x10\x05\x42t\n#io.weaviate.client.grpc.protocol.v1B\x17WeaviateProtoBaseSearchZ4github.com/weaviate/weaviate/grpc/generated;protocolb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14v1/base_search.proto\x12\x0bweaviate.v1\x1a\rv1/base.proto\"2\n\x10WeightsForTarget\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0e\n\x06weight\x18\x02 \x01(\x02\"\x98\x01\n\x07Targets\x12\x16\n\x0etarget_vectors\x18\x01 \x03(\t\x12\x33\n\x0b\x63ombination\x18\x02 \x01(\x0e\x32\x1e.weaviate.v1.CombinationMethod\x12:\n\x13weights_for_targets\x18\x04 \x03(\x0b\x32\x1d.weaviate.v1.WeightsForTargetJ\x04\x08\x03\x10\x04\"`\n\x0fVectorForTarget\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x0cvector_bytes\x18\x02 \x01(\x0c\x42\x02\x18\x01\x12%\n\x07vectors\x18\x03 \x03(\x0b\x32\x14.weaviate.v1.Vectors\"\x8a\x01\n\tSelection\x12)\n\x03mmr\x18\x01 \x01(\x0b\x32\x1a.weaviate.v1.Selection.MMRH\x00\x1a\x45\n\x03MMR\x12\x12\n\x05limit\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07\x62\x61lance\x18\x02 \x01(\x02H\x01\x88\x01\x01\x42\x08\n\x06_limitB\n\n\x08_balanceB\x0b\n\tselection\"\xf9\x01\n\x15SearchOperatorOptions\x12=\n\x08operator\x18\x01 \x01(\x0e\x32+.weaviate.v1.SearchOperatorOptions.Operator\x12$\n\x17minimum_or_tokens_match\x18\x02 \x01(\x05H\x00\x88\x01\x01\"_\n\x08Operator\x12\x18\n\x14OPERATOR_UNSPECIFIED\x10\x00\x12\x0f\n\x0bOPERATOR_OR\x10\x01\x12\x10\n\x0cOPERATOR_AND\x10\x02\x12\x16\n\x12OPERATOR_AND_CROSS\x10\x03\x42\x1a\n\x18_minimum_or_tokens_match\"\xd5\x05\n\x06Hybrid\x12\r\n\x05query\x18\x01 \x01(\t\x12\x12\n\nproperties\x18\x02 \x03(\t\x12\x12\n\x06vector\x18\x03 \x03(\x02\x42\x02\x18\x01\x12\x11\n\x05\x61lpha\x18\x04 \x01(\x02\x42\x02\x18\x01\x12\x33\n\x0b\x66usion_type\x18\x05 \x01(\x0e\x32\x1e.weaviate.v1.Hybrid.FusionType\x12\x18\n\x0cvector_bytes\x18\x06 \x01(\x0c\x42\x02\x18\x01\x12\x1a\n\x0etarget_vectors\x18\x07 \x03(\tB\x02\x18\x01\x12.\n\tnear_text\x18\x08 \x01(\x0b\x32\x1b.weaviate.v1.NearTextSearch\x12,\n\x0bnear_vector\x18\t \x01(\x0b\x32\x17.weaviate.v1.NearVector\x12%\n\x07targets\x18\n \x01(\x0b\x32\x14.weaviate.v1.Targets\x12\x45\n\x14\x62m25_search_operator\x18\x0b \x01(\x0b\x32\".weaviate.v1.SearchOperatorOptionsH\x01\x88\x01\x01\x12\x18\n\x0b\x61lpha_param\x18\x0c \x01(\x02H\x02\x88\x01\x01\x12\x17\n\x0fuse_alpha_param\x18\r \x01(\x08\x12.\n\tselection\x18\x0e \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x03\x88\x01\x01\x12\x19\n\x0fvector_distance\x18\x14 \x01(\x02H\x00\x12%\n\x07vectors\x18\x15 \x03(\x0b\x32\x14.weaviate.v1.Vectors\"a\n\nFusionType\x12\x1b\n\x17\x46USION_TYPE_UNSPECIFIED\x10\x00\x12\x16\n\x12\x46USION_TYPE_RANKED\x10\x01\x12\x1e\n\x1a\x46USION_TYPE_RELATIVE_SCORE\x10\x02\x42\x0b\n\tthresholdB\x17\n\x15_bm25_search_operatorB\x0e\n\x0c_alpha_paramB\x0c\n\n_selection\"\xeb\x03\n\nNearVector\x12\x12\n\x06vector\x18\x01 \x03(\x02\x42\x02\x18\x01\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x18\n\x0cvector_bytes\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12\x1a\n\x0etarget_vectors\x18\x05 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x06 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12K\n\x11vector_per_target\x18\x07 \x03(\x0b\x32,.weaviate.v1.NearVector.VectorPerTargetEntryB\x02\x18\x01\x12\x38\n\x12vector_for_targets\x18\x08 \x03(\x0b\x32\x1c.weaviate.v1.VectorForTarget\x12%\n\x07vectors\x18\t \x03(\x0b\x32\x14.weaviate.v1.Vectors\x12.\n\tselection\x18\n \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x1a\x36\n\x14VectorPerTargetEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xe3\x01\n\nNearObject\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xae\x03\n\x0eNearTextSearch\x12\r\n\x05query\x18\x01 \x03(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x36\n\x07move_to\x18\x04 \x01(\x0b\x32 .weaviate.v1.NearTextSearch.MoveH\x02\x88\x01\x01\x12\x38\n\tmove_away\x18\x05 \x01(\x0b\x32 .weaviate.v1.NearTextSearch.MoveH\x03\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x06 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x07 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x08 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x04\x88\x01\x01\x1a\x36\n\x04Move\x12\r\n\x05\x66orce\x18\x01 \x01(\x02\x12\x10\n\x08\x63oncepts\x18\x02 \x03(\t\x12\r\n\x05uuids\x18\x03 \x03(\tB\x0c\n\n_certaintyB\x0b\n\t_distanceB\n\n\x08_move_toB\x0c\n\n_move_awayB\x0c\n\n_selection\"\xeb\x01\n\x0fNearImageSearch\x12\r\n\x05image\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearAudioSearch\x12\r\n\x05\x61udio\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearVideoSearch\x12\r\n\x05video\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearDepthSearch\x12\r\n\x05\x64\x65pth\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xef\x01\n\x11NearThermalSearch\x12\x0f\n\x07thermal\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xe7\x01\n\rNearIMUSearch\x12\x0b\n\x03imu\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\x7f\n\x04\x42M25\x12\r\n\x05query\x18\x01 \x01(\t\x12\x12\n\nproperties\x18\x02 \x03(\t\x12@\n\x0fsearch_operator\x18\x03 \x01(\x0b\x32\".weaviate.v1.SearchOperatorOptionsH\x00\x88\x01\x01\x42\x12\n\x10_search_operator*\xee\x01\n\x11\x43ombinationMethod\x12\"\n\x1e\x43OMBINATION_METHOD_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x43OMBINATION_METHOD_TYPE_SUM\x10\x01\x12\x1f\n\x1b\x43OMBINATION_METHOD_TYPE_MIN\x10\x02\x12#\n\x1f\x43OMBINATION_METHOD_TYPE_AVERAGE\x10\x03\x12*\n&COMBINATION_METHOD_TYPE_RELATIVE_SCORE\x10\x04\x12\"\n\x1e\x43OMBINATION_METHOD_TYPE_MANUAL\x10\x05\x42t\n#io.weaviate.client.grpc.protocol.v1B\x17WeaviateProtoBaseSearchZ4github.com/weaviate/weaviate/grpc/generated;protocolb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -59,8 +59,8 @@ _globals['_NEARTHERMALSEARCH'].fields_by_name['target_vectors']._serialized_options = b'\030\001' _globals['_NEARIMUSEARCH'].fields_by_name['target_vectors']._loaded_options = None _globals['_NEARIMUSEARCH'].fields_by_name['target_vectors']._serialized_options = b'\030\001' - _globals['_COMBINATIONMETHOD']._serialized_start=4169 - _globals['_COMBINATIONMETHOD']._serialized_end=4407 + _globals['_COMBINATIONMETHOD']._serialized_start=4193 + _globals['_COMBINATIONMETHOD']._serialized_end=4431 _globals['_WEIGHTSFORTARGET']._serialized_start=52 _globals['_WEIGHTSFORTARGET']._serialized_end=102 _globals['_TARGETS']._serialized_start=105 @@ -72,35 +72,35 @@ _globals['_SELECTION_MMR']._serialized_start=414 _globals['_SELECTION_MMR']._serialized_end=483 _globals['_SEARCHOPERATOROPTIONS']._serialized_start=499 - _globals['_SEARCHOPERATOROPTIONS']._serialized_end=724 + _globals['_SEARCHOPERATOROPTIONS']._serialized_end=748 _globals['_SEARCHOPERATOROPTIONS_OPERATOR']._serialized_start=625 - _globals['_SEARCHOPERATOROPTIONS_OPERATOR']._serialized_end=696 - _globals['_HYBRID']._serialized_start=727 - _globals['_HYBRID']._serialized_end=1452 - _globals['_HYBRID_FUSIONTYPE']._serialized_start=1287 - _globals['_HYBRID_FUSIONTYPE']._serialized_end=1384 - _globals['_NEARVECTOR']._serialized_start=1455 - _globals['_NEARVECTOR']._serialized_end=1946 - _globals['_NEARVECTOR_VECTORPERTARGETENTRY']._serialized_start=1851 - _globals['_NEARVECTOR_VECTORPERTARGETENTRY']._serialized_end=1905 - _globals['_NEAROBJECT']._serialized_start=1949 - _globals['_NEAROBJECT']._serialized_end=2176 - _globals['_NEARTEXTSEARCH']._serialized_start=2179 - _globals['_NEARTEXTSEARCH']._serialized_end=2609 - _globals['_NEARTEXTSEARCH_MOVE']._serialized_start=2488 - _globals['_NEARTEXTSEARCH_MOVE']._serialized_end=2542 - _globals['_NEARIMAGESEARCH']._serialized_start=2612 - _globals['_NEARIMAGESEARCH']._serialized_end=2847 - _globals['_NEARAUDIOSEARCH']._serialized_start=2850 - _globals['_NEARAUDIOSEARCH']._serialized_end=3085 - _globals['_NEARVIDEOSEARCH']._serialized_start=3088 - _globals['_NEARVIDEOSEARCH']._serialized_end=3323 - _globals['_NEARDEPTHSEARCH']._serialized_start=3326 - _globals['_NEARDEPTHSEARCH']._serialized_end=3561 - _globals['_NEARTHERMALSEARCH']._serialized_start=3564 - _globals['_NEARTHERMALSEARCH']._serialized_end=3803 - _globals['_NEARIMUSEARCH']._serialized_start=3806 - _globals['_NEARIMUSEARCH']._serialized_end=4037 - _globals['_BM25']._serialized_start=4039 - _globals['_BM25']._serialized_end=4166 + _globals['_SEARCHOPERATOROPTIONS_OPERATOR']._serialized_end=720 + _globals['_HYBRID']._serialized_start=751 + _globals['_HYBRID']._serialized_end=1476 + _globals['_HYBRID_FUSIONTYPE']._serialized_start=1311 + _globals['_HYBRID_FUSIONTYPE']._serialized_end=1408 + _globals['_NEARVECTOR']._serialized_start=1479 + _globals['_NEARVECTOR']._serialized_end=1970 + _globals['_NEARVECTOR_VECTORPERTARGETENTRY']._serialized_start=1875 + _globals['_NEARVECTOR_VECTORPERTARGETENTRY']._serialized_end=1929 + _globals['_NEAROBJECT']._serialized_start=1973 + _globals['_NEAROBJECT']._serialized_end=2200 + _globals['_NEARTEXTSEARCH']._serialized_start=2203 + _globals['_NEARTEXTSEARCH']._serialized_end=2633 + _globals['_NEARTEXTSEARCH_MOVE']._serialized_start=2512 + _globals['_NEARTEXTSEARCH_MOVE']._serialized_end=2566 + _globals['_NEARIMAGESEARCH']._serialized_start=2636 + _globals['_NEARIMAGESEARCH']._serialized_end=2871 + _globals['_NEARAUDIOSEARCH']._serialized_start=2874 + _globals['_NEARAUDIOSEARCH']._serialized_end=3109 + _globals['_NEARVIDEOSEARCH']._serialized_start=3112 + _globals['_NEARVIDEOSEARCH']._serialized_end=3347 + _globals['_NEARDEPTHSEARCH']._serialized_start=3350 + _globals['_NEARDEPTHSEARCH']._serialized_end=3585 + _globals['_NEARTHERMALSEARCH']._serialized_start=3588 + _globals['_NEARTHERMALSEARCH']._serialized_end=3827 + _globals['_NEARIMUSEARCH']._serialized_start=3830 + _globals['_NEARIMUSEARCH']._serialized_end=4061 + _globals['_BM25']._serialized_start=4063 + _globals['_BM25']._serialized_end=4190 # @@protoc_insertion_point(module_scope) diff --git a/weaviate/proto/v1/v5261/v1/base_search_pb2.pyi b/weaviate/proto/v1/v5261/v1/base_search_pb2.pyi index 5c8c05546..f5211b433 100644 --- a/weaviate/proto/v1/v5261/v1/base_search_pb2.pyi +++ b/weaviate/proto/v1/v5261/v1/base_search_pb2.pyi @@ -70,9 +70,11 @@ class SearchOperatorOptions(_message.Message): OPERATOR_UNSPECIFIED: _ClassVar[SearchOperatorOptions.Operator] OPERATOR_OR: _ClassVar[SearchOperatorOptions.Operator] OPERATOR_AND: _ClassVar[SearchOperatorOptions.Operator] + OPERATOR_AND_CROSS: _ClassVar[SearchOperatorOptions.Operator] OPERATOR_UNSPECIFIED: SearchOperatorOptions.Operator OPERATOR_OR: SearchOperatorOptions.Operator OPERATOR_AND: SearchOperatorOptions.Operator + OPERATOR_AND_CROSS: SearchOperatorOptions.Operator OPERATOR_FIELD_NUMBER: _ClassVar[int] MINIMUM_OR_TOKENS_MATCH_FIELD_NUMBER: _ClassVar[int] operator: SearchOperatorOptions.Operator diff --git a/weaviate/proto/v1/v6300/v1/base_search_pb2.py b/weaviate/proto/v1/v6300/v1/base_search_pb2.py index c46a0d974..006f340e8 100644 --- a/weaviate/proto/v1/v6300/v1/base_search_pb2.py +++ b/weaviate/proto/v1/v6300/v1/base_search_pb2.py @@ -25,7 +25,7 @@ from weaviate.proto.v1.v6300.v1 import base_pb2 as v1_dot_base__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14v1/base_search.proto\x12\x0bweaviate.v1\x1a\rv1/base.proto\"2\n\x10WeightsForTarget\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0e\n\x06weight\x18\x02 \x01(\x02\"\x98\x01\n\x07Targets\x12\x16\n\x0etarget_vectors\x18\x01 \x03(\t\x12\x33\n\x0b\x63ombination\x18\x02 \x01(\x0e\x32\x1e.weaviate.v1.CombinationMethod\x12:\n\x13weights_for_targets\x18\x04 \x03(\x0b\x32\x1d.weaviate.v1.WeightsForTargetJ\x04\x08\x03\x10\x04\"`\n\x0fVectorForTarget\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x0cvector_bytes\x18\x02 \x01(\x0c\x42\x02\x18\x01\x12%\n\x07vectors\x18\x03 \x03(\x0b\x32\x14.weaviate.v1.Vectors\"\x8a\x01\n\tSelection\x12)\n\x03mmr\x18\x01 \x01(\x0b\x32\x1a.weaviate.v1.Selection.MMRH\x00\x1a\x45\n\x03MMR\x12\x12\n\x05limit\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07\x62\x61lance\x18\x02 \x01(\x02H\x01\x88\x01\x01\x42\x08\n\x06_limitB\n\n\x08_balanceB\x0b\n\tselection\"\xe1\x01\n\x15SearchOperatorOptions\x12=\n\x08operator\x18\x01 \x01(\x0e\x32+.weaviate.v1.SearchOperatorOptions.Operator\x12$\n\x17minimum_or_tokens_match\x18\x02 \x01(\x05H\x00\x88\x01\x01\"G\n\x08Operator\x12\x18\n\x14OPERATOR_UNSPECIFIED\x10\x00\x12\x0f\n\x0bOPERATOR_OR\x10\x01\x12\x10\n\x0cOPERATOR_AND\x10\x02\x42\x1a\n\x18_minimum_or_tokens_match\"\xd5\x05\n\x06Hybrid\x12\r\n\x05query\x18\x01 \x01(\t\x12\x12\n\nproperties\x18\x02 \x03(\t\x12\x12\n\x06vector\x18\x03 \x03(\x02\x42\x02\x18\x01\x12\x11\n\x05\x61lpha\x18\x04 \x01(\x02\x42\x02\x18\x01\x12\x33\n\x0b\x66usion_type\x18\x05 \x01(\x0e\x32\x1e.weaviate.v1.Hybrid.FusionType\x12\x18\n\x0cvector_bytes\x18\x06 \x01(\x0c\x42\x02\x18\x01\x12\x1a\n\x0etarget_vectors\x18\x07 \x03(\tB\x02\x18\x01\x12.\n\tnear_text\x18\x08 \x01(\x0b\x32\x1b.weaviate.v1.NearTextSearch\x12,\n\x0bnear_vector\x18\t \x01(\x0b\x32\x17.weaviate.v1.NearVector\x12%\n\x07targets\x18\n \x01(\x0b\x32\x14.weaviate.v1.Targets\x12\x45\n\x14\x62m25_search_operator\x18\x0b \x01(\x0b\x32\".weaviate.v1.SearchOperatorOptionsH\x01\x88\x01\x01\x12\x18\n\x0b\x61lpha_param\x18\x0c \x01(\x02H\x02\x88\x01\x01\x12\x17\n\x0fuse_alpha_param\x18\r \x01(\x08\x12.\n\tselection\x18\x0e \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x03\x88\x01\x01\x12\x19\n\x0fvector_distance\x18\x14 \x01(\x02H\x00\x12%\n\x07vectors\x18\x15 \x03(\x0b\x32\x14.weaviate.v1.Vectors\"a\n\nFusionType\x12\x1b\n\x17\x46USION_TYPE_UNSPECIFIED\x10\x00\x12\x16\n\x12\x46USION_TYPE_RANKED\x10\x01\x12\x1e\n\x1a\x46USION_TYPE_RELATIVE_SCORE\x10\x02\x42\x0b\n\tthresholdB\x17\n\x15_bm25_search_operatorB\x0e\n\x0c_alpha_paramB\x0c\n\n_selection\"\xeb\x03\n\nNearVector\x12\x12\n\x06vector\x18\x01 \x03(\x02\x42\x02\x18\x01\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x18\n\x0cvector_bytes\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12\x1a\n\x0etarget_vectors\x18\x05 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x06 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12K\n\x11vector_per_target\x18\x07 \x03(\x0b\x32,.weaviate.v1.NearVector.VectorPerTargetEntryB\x02\x18\x01\x12\x38\n\x12vector_for_targets\x18\x08 \x03(\x0b\x32\x1c.weaviate.v1.VectorForTarget\x12%\n\x07vectors\x18\t \x03(\x0b\x32\x14.weaviate.v1.Vectors\x12.\n\tselection\x18\n \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x1a\x36\n\x14VectorPerTargetEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xe3\x01\n\nNearObject\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xae\x03\n\x0eNearTextSearch\x12\r\n\x05query\x18\x01 \x03(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x36\n\x07move_to\x18\x04 \x01(\x0b\x32 .weaviate.v1.NearTextSearch.MoveH\x02\x88\x01\x01\x12\x38\n\tmove_away\x18\x05 \x01(\x0b\x32 .weaviate.v1.NearTextSearch.MoveH\x03\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x06 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x07 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x08 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x04\x88\x01\x01\x1a\x36\n\x04Move\x12\r\n\x05\x66orce\x18\x01 \x01(\x02\x12\x10\n\x08\x63oncepts\x18\x02 \x03(\t\x12\r\n\x05uuids\x18\x03 \x03(\tB\x0c\n\n_certaintyB\x0b\n\t_distanceB\n\n\x08_move_toB\x0c\n\n_move_awayB\x0c\n\n_selection\"\xeb\x01\n\x0fNearImageSearch\x12\r\n\x05image\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearAudioSearch\x12\r\n\x05\x61udio\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearVideoSearch\x12\r\n\x05video\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearDepthSearch\x12\r\n\x05\x64\x65pth\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xef\x01\n\x11NearThermalSearch\x12\x0f\n\x07thermal\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xe7\x01\n\rNearIMUSearch\x12\x0b\n\x03imu\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\x7f\n\x04\x42M25\x12\r\n\x05query\x18\x01 \x01(\t\x12\x12\n\nproperties\x18\x02 \x03(\t\x12@\n\x0fsearch_operator\x18\x03 \x01(\x0b\x32\".weaviate.v1.SearchOperatorOptionsH\x00\x88\x01\x01\x42\x12\n\x10_search_operator*\xee\x01\n\x11\x43ombinationMethod\x12\"\n\x1e\x43OMBINATION_METHOD_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x43OMBINATION_METHOD_TYPE_SUM\x10\x01\x12\x1f\n\x1b\x43OMBINATION_METHOD_TYPE_MIN\x10\x02\x12#\n\x1f\x43OMBINATION_METHOD_TYPE_AVERAGE\x10\x03\x12*\n&COMBINATION_METHOD_TYPE_RELATIVE_SCORE\x10\x04\x12\"\n\x1e\x43OMBINATION_METHOD_TYPE_MANUAL\x10\x05\x42t\n#io.weaviate.client.grpc.protocol.v1B\x17WeaviateProtoBaseSearchZ4github.com/weaviate/weaviate/grpc/generated;protocolb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14v1/base_search.proto\x12\x0bweaviate.v1\x1a\rv1/base.proto\"2\n\x10WeightsForTarget\x12\x0e\n\x06target\x18\x01 \x01(\t\x12\x0e\n\x06weight\x18\x02 \x01(\x02\"\x98\x01\n\x07Targets\x12\x16\n\x0etarget_vectors\x18\x01 \x03(\t\x12\x33\n\x0b\x63ombination\x18\x02 \x01(\x0e\x32\x1e.weaviate.v1.CombinationMethod\x12:\n\x13weights_for_targets\x18\x04 \x03(\x0b\x32\x1d.weaviate.v1.WeightsForTargetJ\x04\x08\x03\x10\x04\"`\n\x0fVectorForTarget\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x0cvector_bytes\x18\x02 \x01(\x0c\x42\x02\x18\x01\x12%\n\x07vectors\x18\x03 \x03(\x0b\x32\x14.weaviate.v1.Vectors\"\x8a\x01\n\tSelection\x12)\n\x03mmr\x18\x01 \x01(\x0b\x32\x1a.weaviate.v1.Selection.MMRH\x00\x1a\x45\n\x03MMR\x12\x12\n\x05limit\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07\x62\x61lance\x18\x02 \x01(\x02H\x01\x88\x01\x01\x42\x08\n\x06_limitB\n\n\x08_balanceB\x0b\n\tselection\"\xf9\x01\n\x15SearchOperatorOptions\x12=\n\x08operator\x18\x01 \x01(\x0e\x32+.weaviate.v1.SearchOperatorOptions.Operator\x12$\n\x17minimum_or_tokens_match\x18\x02 \x01(\x05H\x00\x88\x01\x01\"_\n\x08Operator\x12\x18\n\x14OPERATOR_UNSPECIFIED\x10\x00\x12\x0f\n\x0bOPERATOR_OR\x10\x01\x12\x10\n\x0cOPERATOR_AND\x10\x02\x12\x16\n\x12OPERATOR_AND_CROSS\x10\x03\x42\x1a\n\x18_minimum_or_tokens_match\"\xd5\x05\n\x06Hybrid\x12\r\n\x05query\x18\x01 \x01(\t\x12\x12\n\nproperties\x18\x02 \x03(\t\x12\x12\n\x06vector\x18\x03 \x03(\x02\x42\x02\x18\x01\x12\x11\n\x05\x61lpha\x18\x04 \x01(\x02\x42\x02\x18\x01\x12\x33\n\x0b\x66usion_type\x18\x05 \x01(\x0e\x32\x1e.weaviate.v1.Hybrid.FusionType\x12\x18\n\x0cvector_bytes\x18\x06 \x01(\x0c\x42\x02\x18\x01\x12\x1a\n\x0etarget_vectors\x18\x07 \x03(\tB\x02\x18\x01\x12.\n\tnear_text\x18\x08 \x01(\x0b\x32\x1b.weaviate.v1.NearTextSearch\x12,\n\x0bnear_vector\x18\t \x01(\x0b\x32\x17.weaviate.v1.NearVector\x12%\n\x07targets\x18\n \x01(\x0b\x32\x14.weaviate.v1.Targets\x12\x45\n\x14\x62m25_search_operator\x18\x0b \x01(\x0b\x32\".weaviate.v1.SearchOperatorOptionsH\x01\x88\x01\x01\x12\x18\n\x0b\x61lpha_param\x18\x0c \x01(\x02H\x02\x88\x01\x01\x12\x17\n\x0fuse_alpha_param\x18\r \x01(\x08\x12.\n\tselection\x18\x0e \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x03\x88\x01\x01\x12\x19\n\x0fvector_distance\x18\x14 \x01(\x02H\x00\x12%\n\x07vectors\x18\x15 \x03(\x0b\x32\x14.weaviate.v1.Vectors\"a\n\nFusionType\x12\x1b\n\x17\x46USION_TYPE_UNSPECIFIED\x10\x00\x12\x16\n\x12\x46USION_TYPE_RANKED\x10\x01\x12\x1e\n\x1a\x46USION_TYPE_RELATIVE_SCORE\x10\x02\x42\x0b\n\tthresholdB\x17\n\x15_bm25_search_operatorB\x0e\n\x0c_alpha_paramB\x0c\n\n_selection\"\xeb\x03\n\nNearVector\x12\x12\n\x06vector\x18\x01 \x03(\x02\x42\x02\x18\x01\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x18\n\x0cvector_bytes\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12\x1a\n\x0etarget_vectors\x18\x05 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x06 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12K\n\x11vector_per_target\x18\x07 \x03(\x0b\x32,.weaviate.v1.NearVector.VectorPerTargetEntryB\x02\x18\x01\x12\x38\n\x12vector_for_targets\x18\x08 \x03(\x0b\x32\x1c.weaviate.v1.VectorForTarget\x12%\n\x07vectors\x18\t \x03(\x0b\x32\x14.weaviate.v1.Vectors\x12.\n\tselection\x18\n \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x1a\x36\n\x14VectorPerTargetEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xe3\x01\n\nNearObject\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xae\x03\n\x0eNearTextSearch\x12\r\n\x05query\x18\x01 \x03(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x36\n\x07move_to\x18\x04 \x01(\x0b\x32 .weaviate.v1.NearTextSearch.MoveH\x02\x88\x01\x01\x12\x38\n\tmove_away\x18\x05 \x01(\x0b\x32 .weaviate.v1.NearTextSearch.MoveH\x03\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x06 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x07 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x08 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x04\x88\x01\x01\x1a\x36\n\x04Move\x12\r\n\x05\x66orce\x18\x01 \x01(\x02\x12\x10\n\x08\x63oncepts\x18\x02 \x03(\t\x12\r\n\x05uuids\x18\x03 \x03(\tB\x0c\n\n_certaintyB\x0b\n\t_distanceB\n\n\x08_move_toB\x0c\n\n_move_awayB\x0c\n\n_selection\"\xeb\x01\n\x0fNearImageSearch\x12\r\n\x05image\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearAudioSearch\x12\r\n\x05\x61udio\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearVideoSearch\x12\r\n\x05video\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xeb\x01\n\x0fNearDepthSearch\x12\r\n\x05\x64\x65pth\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xef\x01\n\x11NearThermalSearch\x12\x0f\n\x07thermal\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\xe7\x01\n\rNearIMUSearch\x12\x0b\n\x03imu\x18\x01 \x01(\t\x12\x16\n\tcertainty\x18\x02 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x03 \x01(\x01H\x01\x88\x01\x01\x12\x1a\n\x0etarget_vectors\x18\x04 \x03(\tB\x02\x18\x01\x12%\n\x07targets\x18\x05 \x01(\x0b\x32\x14.weaviate.v1.Targets\x12.\n\tselection\x18\x06 \x01(\x0b\x32\x16.weaviate.v1.SelectionH\x02\x88\x01\x01\x42\x0c\n\n_certaintyB\x0b\n\t_distanceB\x0c\n\n_selection\"\x7f\n\x04\x42M25\x12\r\n\x05query\x18\x01 \x01(\t\x12\x12\n\nproperties\x18\x02 \x03(\t\x12@\n\x0fsearch_operator\x18\x03 \x01(\x0b\x32\".weaviate.v1.SearchOperatorOptionsH\x00\x88\x01\x01\x42\x12\n\x10_search_operator*\xee\x01\n\x11\x43ombinationMethod\x12\"\n\x1e\x43OMBINATION_METHOD_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x43OMBINATION_METHOD_TYPE_SUM\x10\x01\x12\x1f\n\x1b\x43OMBINATION_METHOD_TYPE_MIN\x10\x02\x12#\n\x1f\x43OMBINATION_METHOD_TYPE_AVERAGE\x10\x03\x12*\n&COMBINATION_METHOD_TYPE_RELATIVE_SCORE\x10\x04\x12\"\n\x1e\x43OMBINATION_METHOD_TYPE_MANUAL\x10\x05\x42t\n#io.weaviate.client.grpc.protocol.v1B\x17WeaviateProtoBaseSearchZ4github.com/weaviate/weaviate/grpc/generated;protocolb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -69,8 +69,8 @@ _globals['_NEARTHERMALSEARCH'].fields_by_name['target_vectors']._serialized_options = b'\030\001' _globals['_NEARIMUSEARCH'].fields_by_name['target_vectors']._loaded_options = None _globals['_NEARIMUSEARCH'].fields_by_name['target_vectors']._serialized_options = b'\030\001' - _globals['_COMBINATIONMETHOD']._serialized_start=4169 - _globals['_COMBINATIONMETHOD']._serialized_end=4407 + _globals['_COMBINATIONMETHOD']._serialized_start=4193 + _globals['_COMBINATIONMETHOD']._serialized_end=4431 _globals['_WEIGHTSFORTARGET']._serialized_start=52 _globals['_WEIGHTSFORTARGET']._serialized_end=102 _globals['_TARGETS']._serialized_start=105 @@ -82,35 +82,35 @@ _globals['_SELECTION_MMR']._serialized_start=414 _globals['_SELECTION_MMR']._serialized_end=483 _globals['_SEARCHOPERATOROPTIONS']._serialized_start=499 - _globals['_SEARCHOPERATOROPTIONS']._serialized_end=724 + _globals['_SEARCHOPERATOROPTIONS']._serialized_end=748 _globals['_SEARCHOPERATOROPTIONS_OPERATOR']._serialized_start=625 - _globals['_SEARCHOPERATOROPTIONS_OPERATOR']._serialized_end=696 - _globals['_HYBRID']._serialized_start=727 - _globals['_HYBRID']._serialized_end=1452 - _globals['_HYBRID_FUSIONTYPE']._serialized_start=1287 - _globals['_HYBRID_FUSIONTYPE']._serialized_end=1384 - _globals['_NEARVECTOR']._serialized_start=1455 - _globals['_NEARVECTOR']._serialized_end=1946 - _globals['_NEARVECTOR_VECTORPERTARGETENTRY']._serialized_start=1851 - _globals['_NEARVECTOR_VECTORPERTARGETENTRY']._serialized_end=1905 - _globals['_NEAROBJECT']._serialized_start=1949 - _globals['_NEAROBJECT']._serialized_end=2176 - _globals['_NEARTEXTSEARCH']._serialized_start=2179 - _globals['_NEARTEXTSEARCH']._serialized_end=2609 - _globals['_NEARTEXTSEARCH_MOVE']._serialized_start=2488 - _globals['_NEARTEXTSEARCH_MOVE']._serialized_end=2542 - _globals['_NEARIMAGESEARCH']._serialized_start=2612 - _globals['_NEARIMAGESEARCH']._serialized_end=2847 - _globals['_NEARAUDIOSEARCH']._serialized_start=2850 - _globals['_NEARAUDIOSEARCH']._serialized_end=3085 - _globals['_NEARVIDEOSEARCH']._serialized_start=3088 - _globals['_NEARVIDEOSEARCH']._serialized_end=3323 - _globals['_NEARDEPTHSEARCH']._serialized_start=3326 - _globals['_NEARDEPTHSEARCH']._serialized_end=3561 - _globals['_NEARTHERMALSEARCH']._serialized_start=3564 - _globals['_NEARTHERMALSEARCH']._serialized_end=3803 - _globals['_NEARIMUSEARCH']._serialized_start=3806 - _globals['_NEARIMUSEARCH']._serialized_end=4037 - _globals['_BM25']._serialized_start=4039 - _globals['_BM25']._serialized_end=4166 + _globals['_SEARCHOPERATOROPTIONS_OPERATOR']._serialized_end=720 + _globals['_HYBRID']._serialized_start=751 + _globals['_HYBRID']._serialized_end=1476 + _globals['_HYBRID_FUSIONTYPE']._serialized_start=1311 + _globals['_HYBRID_FUSIONTYPE']._serialized_end=1408 + _globals['_NEARVECTOR']._serialized_start=1479 + _globals['_NEARVECTOR']._serialized_end=1970 + _globals['_NEARVECTOR_VECTORPERTARGETENTRY']._serialized_start=1875 + _globals['_NEARVECTOR_VECTORPERTARGETENTRY']._serialized_end=1929 + _globals['_NEAROBJECT']._serialized_start=1973 + _globals['_NEAROBJECT']._serialized_end=2200 + _globals['_NEARTEXTSEARCH']._serialized_start=2203 + _globals['_NEARTEXTSEARCH']._serialized_end=2633 + _globals['_NEARTEXTSEARCH_MOVE']._serialized_start=2512 + _globals['_NEARTEXTSEARCH_MOVE']._serialized_end=2566 + _globals['_NEARIMAGESEARCH']._serialized_start=2636 + _globals['_NEARIMAGESEARCH']._serialized_end=2871 + _globals['_NEARAUDIOSEARCH']._serialized_start=2874 + _globals['_NEARAUDIOSEARCH']._serialized_end=3109 + _globals['_NEARVIDEOSEARCH']._serialized_start=3112 + _globals['_NEARVIDEOSEARCH']._serialized_end=3347 + _globals['_NEARDEPTHSEARCH']._serialized_start=3350 + _globals['_NEARDEPTHSEARCH']._serialized_end=3585 + _globals['_NEARTHERMALSEARCH']._serialized_start=3588 + _globals['_NEARTHERMALSEARCH']._serialized_end=3827 + _globals['_NEARIMUSEARCH']._serialized_start=3830 + _globals['_NEARIMUSEARCH']._serialized_end=4061 + _globals['_BM25']._serialized_start=4063 + _globals['_BM25']._serialized_end=4190 # @@protoc_insertion_point(module_scope) diff --git a/weaviate/proto/v1/v6300/v1/base_search_pb2.pyi b/weaviate/proto/v1/v6300/v1/base_search_pb2.pyi index d96fe4c22..07c6f33d2 100644 --- a/weaviate/proto/v1/v6300/v1/base_search_pb2.pyi +++ b/weaviate/proto/v1/v6300/v1/base_search_pb2.pyi @@ -71,9 +71,11 @@ class SearchOperatorOptions(_message.Message): OPERATOR_UNSPECIFIED: _ClassVar[SearchOperatorOptions.Operator] OPERATOR_OR: _ClassVar[SearchOperatorOptions.Operator] OPERATOR_AND: _ClassVar[SearchOperatorOptions.Operator] + OPERATOR_AND_CROSS: _ClassVar[SearchOperatorOptions.Operator] OPERATOR_UNSPECIFIED: SearchOperatorOptions.Operator OPERATOR_OR: SearchOperatorOptions.Operator OPERATOR_AND: SearchOperatorOptions.Operator + OPERATOR_AND_CROSS: SearchOperatorOptions.Operator OPERATOR_FIELD_NUMBER: _ClassVar[int] MINIMUM_OR_TOKENS_MATCH_FIELD_NUMBER: _ClassVar[int] operator: SearchOperatorOptions.Operator diff --git a/weaviate/util.py b/weaviate/util.py index a5b35e6aa..f20ef3ad4 100644 --- a/weaviate/util.py +++ b/weaviate/util.py @@ -607,6 +607,18 @@ def from_string(cls, version: str) -> "_ServerVersion": f"Unable to parse a version from the input string: {initial}. Is it in the format '(v)x.y.z' (e.g. 'v1.18.2' or '1.18.0')?" ) + def is_at_least_any(self, *minimums: Tuple[int, int, int]) -> bool: + """Check a feature that was backported to several release branches. + + Each entry is the first version on its own minor branch to carry the feature, given in + ascending order. A server is supported if it is at least the minimum of the newest listed + branch that is not newer than itself. + """ + for major, minor, patch in reversed(minimums): + if (self.major, self.minor) >= (major, minor): + return self >= _ServerVersion(major, minor, patch) + return False + def check_is_at_least_1_25_0(self, feature: str) -> None: if not self >= _ServerVersion(1, 25, 0): raise WeaviateUnsupportedFeatureError(feature, str(self), "1.25.0") From cc0b53c9727f9be2d38475ae4346c065e342d3dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mour=C3=A3o?= Date: Mon, 3 Aug 2026 09:13:23 +0100 Subject: [PATCH 2/3] Trim tests and drop changelog entry after review - Changelog is written at version creation, so the entry is removed. - Mismatched-tokenization integration test dropped: the server validates that. - Unsupported-version integration tests dropped for bm25 and hybrid: the version gate is already covered by unit tests. - Hybrid cross-property integration test dropped: it exercises the same server path as the bm25 one, and the request wiring is unit tested. - Unit tests cut to the two behaviours that are actually new: and_cross maps to OPERATOR_AND_CROSS on the bm25 and hybrid requests, and older servers are rejected. --- docs/changelog.rst | 6 -- integration/test_collection.py | 61 +----------- integration/test_collection_hybrid.py | 52 ---------- test/collection/test_bm25_operator.py | 138 ++------------------------ test/test_server_version.py | 9 -- weaviate/util.py | 7 +- 6 files changed, 17 insertions(+), 256 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 4f43070d8..17427c0ef 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -1,12 +1,6 @@ Changelog ========= -Version 4.23.0 --------------- -This minor version includes: - - Support for new 1.39 features: - - Add support for the new cross-property ``And`` BM25 search operator through ``BM25Operator.and_cross()``, available on the ``bm25`` and ``hybrid`` query, generative-query, and aggregation methods. Unlike ``BM25Operator.and_()``, a query token may be matched by any of the searched properties instead of having to occur within a single one. All searched properties must share the same tokenization and analyzer settings. Requires Weaviate ``1.37.15``, ``1.38.8``, ``1.39.0`` or higher - Version 4.22.0 -------------- This minor version includes: diff --git a/integration/test_collection.py b/integration/test_collection.py index e13479c14..f4016f930 100644 --- a/integration/test_collection.py +++ b/integration/test_collection.py @@ -46,7 +46,6 @@ WeaviateInsertManyAllFailedError, WeaviateInvalidInputError, WeaviateQueryError, - WeaviateUnsupportedFeatureError, ) from weaviate.types import UUID, UUIDS @@ -1775,62 +1774,10 @@ def test_bm25_operator_and_cross(collection_factory: CollectionFactory) -> None: if not collection._connection._weaviate_version.is_at_least_any(*_BM25_AND_CROSS_MIN_VERSIONS): pytest.skip(f"bm25 cross-property AND requires {_BM25_AND_CROSS_MIN_VERSIONS_STR}") - # Only `split_across` needs cross-property matching: neither of its properties holds both tokens. + # Neither of `split_across`'s properties holds both tokens, so only cross-property AND matches it. split_across = collection.data.insert({"title": "banana", "body": "split"}) single_property = collection.data.insert({"title": "banana split", "body": "dessert"}) - partial = collection.data.insert({"title": "banana", "body": "bread"}) + collection.data.insert({"title": "banana", "body": "bread"}) - and_cross = collection.query.bm25("banana split", operator=wvc.query.BM25Operator.and_cross()) - assert sorted(obj.uuid for obj in and_cross.objects) == sorted([split_across, single_property]) - - or_ = collection.query.bm25( - "banana split", operator=wvc.query.BM25Operator.or_(minimum_match=1) - ) - assert sorted(obj.uuid for obj in or_.objects) == sorted( - [split_across, single_property, partial] - ) - - # Per-property AND is at most as permissive as cross-property AND. Which of the two it is - # depends on whether the server took the BlockMax or the legacy WAND path, so only the - # subset relation is asserted. - and_ = collection.query.bm25("banana split", operator=wvc.query.BM25Operator.and_()) - assert {obj.uuid for obj in and_.objects} <= {obj.uuid for obj in and_cross.objects} - - -def test_bm25_operator_and_cross_mismatched_tokenization( - collection_factory: CollectionFactory, -) -> None: - collection = collection_factory( - properties=[ - Property(name="title", data_type=DataType.TEXT, tokenization=Tokenization.WORD), - Property(name="body", data_type=DataType.TEXT, tokenization=Tokenization.FIELD), - ], - vectorizer_config=Configure.Vectorizer.none(), - ) - - if not collection._connection._weaviate_version.is_at_least_any(*_BM25_AND_CROSS_MIN_VERSIONS): - pytest.skip(f"bm25 cross-property AND requires {_BM25_AND_CROSS_MIN_VERSIONS_STR}") - - collection.data.insert({"title": "banana", "body": "split"}) - - with pytest.raises(WeaviateQueryError): - collection.query.bm25( - "banana split", - query_properties=["title", "body"], - operator=wvc.query.BM25Operator.and_cross(), - ) - - -def test_bm25_operator_and_cross_unsupported_version( - collection_factory: CollectionFactory, -) -> None: - collection = collection_factory( - properties=[Property(name="name", data_type=DataType.TEXT)], - vectorizer_config=Configure.Vectorizer.none(), - ) - - if collection._connection._weaviate_version.is_at_least_any(*_BM25_AND_CROSS_MIN_VERSIONS): - pytest.skip("server supports bm25 cross-property AND") - - with pytest.raises(WeaviateUnsupportedFeatureError): - collection.query.bm25("banana split", operator=wvc.query.BM25Operator.and_cross()) + objs = collection.query.bm25("banana split", operator=wvc.query.BM25Operator.and_cross()) + assert sorted(obj.uuid for obj in objs.objects) == sorted([split_across, single_property]) diff --git a/integration/test_collection_hybrid.py b/integration/test_collection_hybrid.py index 9c62c1233..696cf5b43 100644 --- a/integration/test_collection_hybrid.py +++ b/integration/test_collection_hybrid.py @@ -21,10 +21,6 @@ _HybridNearVector, ) from weaviate.collections.classes.internal import Object -from weaviate.collections.grpc.shared import ( - _BM25_AND_CROSS_MIN_VERSIONS, - _BM25_AND_CROSS_MIN_VERSIONS_STR, -) from weaviate.exceptions import ( WeaviateUnsupportedFeatureError, ) @@ -532,51 +528,3 @@ def test_hybrid_bm25_operators(collection_factory: CollectionFactory) -> None: assert len(objs.objects) == 4 assert objs.objects[0].uuid == uuid2 assert sorted(obj.uuid for obj in objs.objects[1:]) == sorted([uuid1, uuid3, uuid4]) - - -def test_hybrid_bm25_operator_and_cross(collection_factory: CollectionFactory) -> None: - collection = collection_factory( - properties=[ - Property(name="title", data_type=DataType.TEXT), - Property(name="body", data_type=DataType.TEXT), - ], - vectorizer_config=Configure.Vectorizer.none(), - ) - - if not collection._connection._weaviate_version.is_at_least_any(*_BM25_AND_CROSS_MIN_VERSIONS): - pytest.skip(f"bm25 cross-property AND requires {_BM25_AND_CROSS_MIN_VERSIONS_STR}") - - # Only `split_across` needs cross-property matching: neither of its properties holds both tokens. - split_across = collection.data.insert({"title": "banana", "body": "split"}, vector=[1, 0, 0, 0]) - single_property = collection.data.insert( - {"title": "banana split", "body": "dessert"}, vector=[0, 1, 0, 0] - ) - collection.data.insert({"title": "banana", "body": "bread"}, vector=[0, 0, 1, 0]) - - objs = collection.query.hybrid( - "banana split", - vector=None, - alpha=0.0, - bm25_operator=wvc.query.BM25Operator.and_cross(), - ) - assert sorted(obj.uuid for obj in objs.objects) == sorted([split_across, single_property]) - - -def test_hybrid_bm25_operator_and_cross_unsupported_version( - collection_factory: CollectionFactory, -) -> None: - collection = collection_factory( - properties=[Property(name="name", data_type=DataType.TEXT)], - vectorizer_config=Configure.Vectorizer.none(), - ) - - if collection._connection._weaviate_version.is_at_least_any(*_BM25_AND_CROSS_MIN_VERSIONS): - pytest.skip("server supports bm25 cross-property AND") - - with pytest.raises(WeaviateUnsupportedFeatureError): - collection.query.hybrid( - "banana split", - vector=None, - alpha=0.0, - bm25_operator=wvc.query.BM25Operator.and_cross(), - ) diff --git a/test/collection/test_bm25_operator.py b/test/collection/test_bm25_operator.py index 8fee41d20..9fa188b22 100644 --- a/test/collection/test_bm25_operator.py +++ b/test/collection/test_bm25_operator.py @@ -1,27 +1,15 @@ -"""Unit tests: BM25 search operators are wired into the gRPC request and version-gated. - -``BM25Operator.and_cross()`` maps to the ``OPERATOR_AND_CROSS`` enum added in Weaviate 1.39.0 and -backported to 1.38.8 and 1.37.15, so the client must reject it on servers outside those ranges -rather than send an enum value the server will not understand. -""" - -from typing import Optional - import pytest from weaviate.classes.query import BM25Operator -from weaviate.collections.classes.grpc import BM25OperatorOptions -from weaviate.collections.grpc.aggregate import _AggregateGRPC from weaviate.collections.grpc.query import _QueryGRPC from weaviate.exceptions import WeaviateUnsupportedFeatureError from weaviate.proto.v1 import base_search_pb2 from weaviate.util import _ServerVersion -_SUPPORTED = ["1.37.15", "1.38.8", "1.39.0", "1.40.0"] -_UNSUPPORTED = ["1.36.9", "1.37.14", "1.38.0", "1.38.7"] +_AND_CROSS = base_search_pb2.SearchOperatorOptions.OPERATOR_AND_CROSS -def _query(version: str = "1.39.0") -> _QueryGRPC: +def _builder(version: str = "1.39.0") -> _QueryGRPC: return _QueryGRPC( weaviate_version=_ServerVersion.from_string(version), name="Dummy", @@ -33,123 +21,17 @@ def _query(version: str = "1.39.0") -> _QueryGRPC: ) -def _aggregate(version: str = "1.39.0") -> _AggregateGRPC: - return _AggregateGRPC( - weaviate_version=_ServerVersion.from_string(version), - name="Dummy", - tenant=None, - consistency_level=None, - validate_arguments=True, - ) - - -def _aggregate_hybrid( - builder: _AggregateGRPC, operator: Optional[BM25OperatorOptions] -) -> base_search_pb2.Hybrid: - return builder.hybrid( - query="banana two", - alpha=0.0, - vector=None, - properties=None, - target_vector=None, - bm25_operator=operator, - aggregations=[], - filters=None, - group_by=None, - limit=None, - object_limit=None, - objects_count=False, - ).hybrid - +def test_and_cross_wired_into_request() -> None: + bm25 = _builder().bm25(query="banana split", operator=BM25Operator.and_cross()) + assert bm25.bm25_search.search_operator.operator == _AND_CROSS -@pytest.mark.parametrize( - "operator,expected,minimum_or_tokens_match", - [ - (BM25Operator.and_(), base_search_pb2.SearchOperatorOptions.OPERATOR_AND, 0), - (BM25Operator.or_(minimum_match=2), base_search_pb2.SearchOperatorOptions.OPERATOR_OR, 2), - ( - BM25Operator.and_cross(), - base_search_pb2.SearchOperatorOptions.OPERATOR_AND_CROSS, - 0, - ), - ], -) -def test_bm25_operator_wired_into_request( - operator: BM25OperatorOptions, - expected: "base_search_pb2.SearchOperatorOptions.Operator", - minimum_or_tokens_match: int, -) -> None: - search_operator = ( - _query().bm25(query="banana two", operator=operator).bm25_search.search_operator + hybrid = _builder().hybrid( + query="banana split", alpha=0.0, bm25_operator=BM25Operator.and_cross() ) - assert search_operator.operator == expected - assert search_operator.minimum_or_tokens_match == minimum_or_tokens_match - - -@pytest.mark.parametrize( - "operator,expected", - [ - (BM25Operator.and_(), base_search_pb2.SearchOperatorOptions.OPERATOR_AND), - (BM25Operator.or_(minimum_match=2), base_search_pb2.SearchOperatorOptions.OPERATOR_OR), - (BM25Operator.and_cross(), base_search_pb2.SearchOperatorOptions.OPERATOR_AND_CROSS), - ], -) -def test_hybrid_bm25_operator_wired_into_request( - operator: BM25OperatorOptions, expected: "base_search_pb2.SearchOperatorOptions.Operator" -) -> None: - req = _query().hybrid(query="banana two", alpha=0.0, bm25_operator=operator) - assert req.hybrid_search.bm25_search_operator.operator == expected - + assert hybrid.hybrid_search.bm25_search_operator.operator == _AND_CROSS -def test_no_operator_leaves_search_operator_unset() -> None: - assert not _query().bm25(query="banana two").bm25_search.HasField("search_operator") - req = _query().hybrid(query="banana two", alpha=0.0) - assert not req.hybrid_search.HasField("bm25_search_operator") - -@pytest.mark.parametrize("version", _SUPPORTED) -def test_and_cross_allowed_on_supported_versions(version: str) -> None: - req = _query(version).bm25(query="banana two", operator=BM25Operator.and_cross()) - assert ( - req.bm25_search.search_operator.operator - == base_search_pb2.SearchOperatorOptions.OPERATOR_AND_CROSS - ) - - -@pytest.mark.parametrize("version", _UNSUPPORTED) +@pytest.mark.parametrize("version", ["1.37.14", "1.38.7"]) def test_and_cross_rejected_on_unsupported_versions(version: str) -> None: - with pytest.raises(WeaviateUnsupportedFeatureError) as e: - _query(version).bm25(query="banana two", operator=BM25Operator.and_cross()) - assert "1.37.15 or 1.38.8 or 1.39.0" in str(e.value) - assert version in str(e.value) - - -@pytest.mark.parametrize("version", _UNSUPPORTED) -def test_hybrid_and_cross_rejected_on_unsupported_versions(version: str) -> None: - with pytest.raises(WeaviateUnsupportedFeatureError): - _query(version).hybrid( - query="banana two", alpha=0.0, bm25_operator=BM25Operator.and_cross() - ) - - -@pytest.mark.parametrize("version", _UNSUPPORTED) -def test_aggregate_hybrid_and_cross_rejected_on_unsupported_versions(version: str) -> None: with pytest.raises(WeaviateUnsupportedFeatureError): - _aggregate_hybrid(_aggregate(version), BM25Operator.and_cross()) - - -def test_aggregate_hybrid_and_cross_allowed_on_supported_version() -> None: - hybrid = _aggregate_hybrid(_aggregate("1.39.0"), BM25Operator.and_cross()) - assert ( - hybrid.bm25_search_operator.operator - == base_search_pb2.SearchOperatorOptions.OPERATOR_AND_CROSS - ) - - -@pytest.mark.parametrize("version", _UNSUPPORTED) -@pytest.mark.parametrize("operator", [BM25Operator.and_(), BM25Operator.or_(minimum_match=1), None]) -def test_other_operators_unaffected_by_gate( - version: str, operator: Optional[BM25OperatorOptions] -) -> None: - _query(version).bm25(query="banana two", operator=operator) - _query(version).hybrid(query="banana two", alpha=0.0, bm25_operator=operator) + _builder(version).bm25(query="banana split", operator=BM25Operator.and_cross()) diff --git a/test/test_server_version.py b/test/test_server_version.py index 20ae0b9cc..ab7ed54a1 100644 --- a/test/test_server_version.py +++ b/test/test_server_version.py @@ -66,14 +66,10 @@ def test_server_version_is_at_least(is_valid: bool) -> None: ("1.36.9", False), ("1.37.14", False), ("1.37.15", True), - ("1.37.99", True), - ("1.38.0", False), ("1.38.7", False), ("1.38.8", True), - ("1.38.20", True), ("1.39.0", True), ("1.40.0", True), - ("2.0.0", True), ], ) def test_server_version_is_at_least_any(version: str, expected: bool) -> None: @@ -83,11 +79,6 @@ def test_server_version_is_at_least_any(version: str, expected: bool) -> None: ) -def test_server_version_is_at_least_any_single_minimum() -> None: - assert _ServerVersion(1, 39, 0).is_at_least_any((1, 39, 0)) - assert not _ServerVersion(1, 38, 99).is_at_least_any((1, 39, 0)) - - def test_server_version_magic_methods() -> None: # Test __eq__ assert _ServerVersion(1, 2, 3) == _ServerVersion(1, 2, 3) diff --git a/weaviate/util.py b/weaviate/util.py index f20ef3ad4..0da8c2905 100644 --- a/weaviate/util.py +++ b/weaviate/util.py @@ -608,11 +608,10 @@ def from_string(cls, version: str) -> "_ServerVersion": ) def is_at_least_any(self, *minimums: Tuple[int, int, int]) -> bool: - """Check a feature that was backported to several release branches. + """Check a minimum that was backported to several release branches. - Each entry is the first version on its own minor branch to carry the feature, given in - ascending order. A server is supported if it is at least the minimum of the newest listed - branch that is not newer than itself. + Each entry is the first version on its own minor branch to carry the feature, in ascending + order; the server is checked against the newest branch that is not newer than itself. """ for major, minor, patch in reversed(minimums): if (self.major, self.minor) >= (major, minor): From 62b08c2662e43ef320e2bfd4271275c506a9c1ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mour=C3=A3o?= Date: Mon, 3 Aug 2026 09:56:47 +0100 Subject: [PATCH 3/3] Export BM25OperatorAndCross from weaviate.outputs.query Its two siblings, BM25OperatorAnd and BM25OperatorOr, are already exported, so isinstance checks and type annotations against the new operator have to reach into the private module without this. --- weaviate/outputs/query.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/weaviate/outputs/query.py b/weaviate/outputs/query.py index 1113c5e4a..e4fca0e7f 100644 --- a/weaviate/outputs/query.py +++ b/weaviate/outputs/query.py @@ -9,6 +9,7 @@ from weaviate.collections.classes.grpc import ( MMR, BM25OperatorAnd, + BM25OperatorAndCross, BM25OperatorOr, ListOfVectorsQuery, NearVectorInputType, @@ -62,6 +63,7 @@ "GenerativeSearchReturnType", "GeoCoordinate", "BM25OperatorAnd", + "BM25OperatorAndCross", "BM25OperatorOr", "ListOfVectorsQuery", "MMR",