Skip to content

Commit 210dd63

Browse files
committed
enhance: support run analyzer (milvus-io#2622)
relate: milvus-io/milvus#39705 Signed-off-by: aoiasd <[email protected]>
1 parent f17b6a5 commit 210dd63

File tree

8 files changed

+165
-18
lines changed

8 files changed

+165
-18
lines changed

pymilvus/client/grpc_handler.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
from .prepare import Prepare
4646
from .search_reasult import SearchResult
4747
from .types import (
48+
AnalyzeResult,
4849
BulkInsertState,
4950
CompactionPlans,
5051
CompactionState,
@@ -2243,3 +2244,20 @@ def remove_privileges_from_group(
22432244
)
22442245
resp = self._stub.OperatePrivilegeGroup(req, wait_for_ready=True, timeout=timeout)
22452246
check_status(resp)
2247+
2248+
@retry_on_rpc_failure()
2249+
def run_analyzer(
2250+
self,
2251+
texts: Union[str, List[str]],
2252+
analyzer_params: Union[str, Dict],
2253+
timeout: Optional[float] = None,
2254+
**kwargs,
2255+
):
2256+
check_pass_param(timeout=timeout)
2257+
req = Prepare.run_analyzer(texts, analyzer_params)
2258+
resp = self._stub.RunAnalyzer(req, timeout=timeout)
2259+
check_status(resp.status)
2260+
2261+
if isinstance(texts, str):
2262+
return AnalyzeResult(resp.results[0])
2263+
return [AnalyzeResult(result) for result in resp.results]

pymilvus/client/prepare.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1724,3 +1724,18 @@ def operate_privilege_group_req(
17241724
privileges=[milvus_types.PrivilegeEntity(name=p) for p in privileges],
17251725
type=operate_privilege_group_type,
17261726
)
1727+
1728+
@classmethod
1729+
def run_analyzer(cls, texts: Union[str, List[str]], analyzer_params: Union[str, Dict]):
1730+
req = milvus_types.RunAnalyzerRequset()
1731+
if isinstance(texts, str):
1732+
req.placeholder.append(texts.encode("utf-8"))
1733+
else:
1734+
req.placeholder.extend([text.encode("utf-8") for text in texts])
1735+
1736+
if isinstance(analyzer_params, dict):
1737+
req.analyzer_params = ujson.dumps(analyzer_params)
1738+
else:
1739+
req.analyzer_params = analyzer_params
1740+
1741+
return req

pymilvus/client/types.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,3 +1081,13 @@ def to_dict(self) -> Dict[str, Any]:
10811081
result = {"name": self.name}
10821082
result.update(self.properties)
10831083
return result
1084+
1085+
1086+
class AnalyzeResult:
1087+
def __init__(self, info: milvus_types.AnalyzerResult) -> None:
1088+
self.tokens = info.tokens
1089+
1090+
def __str__(self) -> str:
1091+
return f"{{tokens: {self.tokens}}}"
1092+
1093+
__reper__ = __str__

pymilvus/grpc_gen/milvus_pb2.py

Lines changed: 25 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pymilvus/grpc_gen/milvus_pb2.pyi

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2219,3 +2219,47 @@ class ListImportsAuthPlaceholder(_message.Message):
22192219
db_name: str
22202220
collection_name: str
22212221
def __init__(self, db_name: _Optional[str] = ..., collection_name: _Optional[str] = ...) -> None: ...
2222+
2223+
class RunAnalyzerRequest(_message.Message):
2224+
__slots__ = ("base", "analyzer_params", "placeholder", "with_detail", "with_hash")
2225+
BASE_FIELD_NUMBER: _ClassVar[int]
2226+
ANALYZER_PARAMS_FIELD_NUMBER: _ClassVar[int]
2227+
PLACEHOLDER_FIELD_NUMBER: _ClassVar[int]
2228+
WITH_DETAIL_FIELD_NUMBER: _ClassVar[int]
2229+
WITH_HASH_FIELD_NUMBER: _ClassVar[int]
2230+
base: _common_pb2.MsgBase
2231+
analyzer_params: str
2232+
placeholder: _containers.RepeatedScalarFieldContainer[bytes]
2233+
with_detail: bool
2234+
with_hash: bool
2235+
def __init__(self, base: _Optional[_Union[_common_pb2.MsgBase, _Mapping]] = ..., analyzer_params: _Optional[str] = ..., placeholder: _Optional[_Iterable[bytes]] = ..., with_detail: bool = ..., with_hash: bool = ...) -> None: ...
2236+
2237+
class AnalyzerToken(_message.Message):
2238+
__slots__ = ("token", "start_offset", "end_offset", "position", "position_length", "hash")
2239+
TOKEN_FIELD_NUMBER: _ClassVar[int]
2240+
START_OFFSET_FIELD_NUMBER: _ClassVar[int]
2241+
END_OFFSET_FIELD_NUMBER: _ClassVar[int]
2242+
POSITION_FIELD_NUMBER: _ClassVar[int]
2243+
POSITION_LENGTH_FIELD_NUMBER: _ClassVar[int]
2244+
HASH_FIELD_NUMBER: _ClassVar[int]
2245+
token: str
2246+
start_offset: int
2247+
end_offset: int
2248+
position: int
2249+
position_length: int
2250+
hash: int
2251+
def __init__(self, token: _Optional[str] = ..., start_offset: _Optional[int] = ..., end_offset: _Optional[int] = ..., position: _Optional[int] = ..., position_length: _Optional[int] = ..., hash: _Optional[int] = ...) -> None: ...
2252+
2253+
class AnalyzerResult(_message.Message):
2254+
__slots__ = ("tokens",)
2255+
TOKENS_FIELD_NUMBER: _ClassVar[int]
2256+
tokens: _containers.RepeatedCompositeFieldContainer[AnalyzerToken]
2257+
def __init__(self, tokens: _Optional[_Iterable[_Union[AnalyzerToken, _Mapping]]] = ...) -> None: ...
2258+
2259+
class RunAnalyzerResponse(_message.Message):
2260+
__slots__ = ("status", "results")
2261+
STATUS_FIELD_NUMBER: _ClassVar[int]
2262+
RESULTS_FIELD_NUMBER: _ClassVar[int]
2263+
status: _common_pb2.Status
2264+
results: _containers.RepeatedCompositeFieldContainer[AnalyzerResult]
2265+
def __init__(self, status: _Optional[_Union[_common_pb2.Status, _Mapping]] = ..., results: _Optional[_Iterable[_Union[AnalyzerResult, _Mapping]]] = ...) -> None: ...

pymilvus/grpc_gen/milvus_pb2_grpc.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,11 @@ def __init__(self, channel):
486486
request_serializer=milvus__pb2.OperatePrivilegeGroupRequest.SerializeToString,
487487
response_deserializer=common__pb2.Status.FromString,
488488
)
489+
self.RunAnalyzer = channel.unary_unary(
490+
'/milvus.proto.milvus.MilvusService/RunAnalyzer',
491+
request_serializer=milvus__pb2.RunAnalyzerRequest.SerializeToString,
492+
response_deserializer=milvus__pb2.RunAnalyzerResponse.FromString,
493+
)
489494

490495

491496
class MilvusServiceServicer(object):
@@ -1062,6 +1067,12 @@ def OperatePrivilegeGroup(self, request, context):
10621067
context.set_details('Method not implemented!')
10631068
raise NotImplementedError('Method not implemented!')
10641069

1070+
def RunAnalyzer(self, request, context):
1071+
"""Missing associated documentation comment in .proto file."""
1072+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
1073+
context.set_details('Method not implemented!')
1074+
raise NotImplementedError('Method not implemented!')
1075+
10651076

10661077
def add_MilvusServiceServicer_to_server(servicer, server):
10671078
rpc_method_handlers = {
@@ -1535,6 +1546,11 @@ def add_MilvusServiceServicer_to_server(servicer, server):
15351546
request_deserializer=milvus__pb2.OperatePrivilegeGroupRequest.FromString,
15361547
response_serializer=common__pb2.Status.SerializeToString,
15371548
),
1549+
'RunAnalyzer': grpc.unary_unary_rpc_method_handler(
1550+
servicer.RunAnalyzer,
1551+
request_deserializer=milvus__pb2.RunAnalyzerRequest.FromString,
1552+
response_serializer=milvus__pb2.RunAnalyzerResponse.SerializeToString,
1553+
),
15381554
}
15391555
generic_handler = grpc.method_handlers_generic_handler(
15401556
'milvus.proto.milvus.MilvusService', rpc_method_handlers)
@@ -3143,6 +3159,23 @@ def OperatePrivilegeGroup(request,
31433159
options, channel_credentials,
31443160
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
31453161

3162+
@staticmethod
3163+
def RunAnalyzer(request,
3164+
target,
3165+
options=(),
3166+
channel_credentials=None,
3167+
call_credentials=None,
3168+
insecure=False,
3169+
compression=None,
3170+
wait_for_ready=None,
3171+
timeout=None,
3172+
metadata=None):
3173+
return grpc.experimental.unary_unary(request, target, '/milvus.proto.milvus.MilvusService/RunAnalyzer',
3174+
milvus__pb2.RunAnalyzerRequest.SerializeToString,
3175+
milvus__pb2.RunAnalyzerResponse.FromString,
3176+
options, channel_credentials,
3177+
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
3178+
31463179

31473180
class ProxyServiceStub(object):
31483181
"""Missing associated documentation comment in .proto file."""

pymilvus/milvus_client/milvus_client.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1716,3 +1716,22 @@ def describe_replica(
17161716
"""
17171717
conn = self._get_connection()
17181718
return conn.describe_replica(collection_name, timeout=timeout, **kwargs)
1719+
1720+
def run_analyzer(
1721+
self,
1722+
texts: Union[str, List[str]],
1723+
analyzer_params: Union[str, Dict, None] = None,
1724+
timeout: Optional[float] = None,
1725+
):
1726+
"""Run analyzer. Return result tokens of analysis.
1727+
Args:
1728+
text(``str``,``List[str]``): The input text (string or string list).
1729+
analyzer_params(``str``,``Dict``,``None``): The parameters of analyzer.
1730+
timeout(``float``, optional): The timeout value in seconds. Defaults to None.
1731+
Returns:
1732+
(``List[str]``,``List[List[str]]``): The result tokens of analysis.
1733+
"""
1734+
if analyzer_params is None:
1735+
analyzer_params = {}
1736+
1737+
return self._get_connection().run_analyzer(texts, analyzer_params, timeout=timeout)

0 commit comments

Comments
 (0)