nucliadb 6.4.0.post4146__py3-none-any.whl → 6.4.0.post4161__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nucliadb/search/search/find_merge.py +42 -7
- nucliadb/search/search/query_parser/models.py +10 -0
- nucliadb/search/search/query_parser/parsers/find.py +14 -1
- nucliadb/search/search/query_parser/parsers/graph.py +5 -5
- nucliadb/search/search/query_parser/parsers/unit_retrieval.py +14 -5
- nucliadb/search/search/rank_fusion.py +31 -39
- nucliadb/writer/resource/basic.py +1 -0
- {nucliadb-6.4.0.post4146.dist-info → nucliadb-6.4.0.post4161.dist-info}/METADATA +6 -6
- {nucliadb-6.4.0.post4146.dist-info → nucliadb-6.4.0.post4161.dist-info}/RECORD +12 -12
- {nucliadb-6.4.0.post4146.dist-info → nucliadb-6.4.0.post4161.dist-info}/WHEEL +1 -1
- {nucliadb-6.4.0.post4146.dist-info → nucliadb-6.4.0.post4161.dist-info}/entry_points.txt +0 -0
- {nucliadb-6.4.0.post4146.dist-info → nucliadb-6.4.0.post4161.dist-info}/top_level.txt +0 -0
@@ -68,6 +68,9 @@ FIND_FETCH_OPS_DISTRIBUTION = metrics.Histogram(
|
|
68
68
|
buckets=[1, 5, 10, 20, 30, 40, 50, 60, 80, 100, 200],
|
69
69
|
)
|
70
70
|
|
71
|
+
# Constant score given to all graph results until we implement graph scoring
|
72
|
+
FAKE_GRAPH_SCORE = 1.0
|
73
|
+
|
71
74
|
|
72
75
|
@merge_observer.wrap({"type": "find_merge"})
|
73
76
|
async def build_find_response(
|
@@ -103,14 +106,9 @@ async def build_find_response(
|
|
103
106
|
search_response.vector.documents,
|
104
107
|
)
|
105
108
|
)
|
109
|
+
graph_results = graph_results_to_text_block_matches(search_response.graph)
|
106
110
|
|
107
|
-
merged_text_blocks
|
108
|
-
if len(keyword_results) == 0:
|
109
|
-
merged_text_blocks = semantic_results
|
110
|
-
elif len(semantic_results) == 0:
|
111
|
-
merged_text_blocks = keyword_results
|
112
|
-
else:
|
113
|
-
merged_text_blocks = rank_fusion_algorithm.fuse(keyword_results, semantic_results)
|
111
|
+
merged_text_blocks = rank_fusion_algorithm.fuse(keyword_results, semantic_results, graph_results)
|
114
112
|
|
115
113
|
# cut
|
116
114
|
# we assume pagination + predict reranker is forbidden and has been already
|
@@ -336,6 +334,43 @@ def semantic_results_to_text_block_matches(items: Iterable[DocumentScored]) -> l
|
|
336
334
|
return text_blocks
|
337
335
|
|
338
336
|
|
337
|
+
def graph_results_to_text_block_matches(item: GraphSearchResponse) -> list[TextBlockMatch]:
|
338
|
+
matches = []
|
339
|
+
for path in item.graph:
|
340
|
+
metadata = path.metadata
|
341
|
+
|
342
|
+
if not metadata.paragraph_id:
|
343
|
+
continue
|
344
|
+
|
345
|
+
paragraph_id = ParagraphId.from_string(metadata.paragraph_id)
|
346
|
+
matches.append(
|
347
|
+
TextBlockMatch(
|
348
|
+
paragraph_id=paragraph_id,
|
349
|
+
score=FAKE_GRAPH_SCORE,
|
350
|
+
score_type=SCORE_TYPE.RELATION_RELEVANCE,
|
351
|
+
order=0, # NOTE: this will be filled later
|
352
|
+
text="", # NOTE: this will be filled later too
|
353
|
+
position=TextPosition(
|
354
|
+
page_number=0,
|
355
|
+
index=0,
|
356
|
+
start=paragraph_id.paragraph_start,
|
357
|
+
end=paragraph_id.paragraph_end,
|
358
|
+
start_seconds=[],
|
359
|
+
end_seconds=[],
|
360
|
+
),
|
361
|
+
# XXX: we should split labels
|
362
|
+
field_labels=[],
|
363
|
+
paragraph_labels=[],
|
364
|
+
fuzzy_search=False, # TODO: this depends on the query, should we populate it?
|
365
|
+
is_a_table=False,
|
366
|
+
representation_file="",
|
367
|
+
page_with_visual=False,
|
368
|
+
)
|
369
|
+
)
|
370
|
+
|
371
|
+
return matches
|
372
|
+
|
373
|
+
|
339
374
|
@merge_observer.wrap({"type": "hydrate_and_rerank"})
|
340
375
|
async def hydrate_and_rerank(
|
341
376
|
text_blocks: Iterable[TextBlockMatch],
|
@@ -26,6 +26,7 @@ from pydantic import BaseModel, ConfigDict, Field
|
|
26
26
|
|
27
27
|
from nucliadb.search.search.query_parser.fetcher import Fetcher
|
28
28
|
from nucliadb_models import search as search_models
|
29
|
+
from nucliadb_models.graph.requests import GraphPathQuery
|
29
30
|
from nucliadb_protos import utils_pb2
|
30
31
|
|
31
32
|
### Retrieval
|
@@ -61,11 +62,16 @@ class RelationQuery(BaseModel):
|
|
61
62
|
deleted_entities: dict[str, list[str]]
|
62
63
|
|
63
64
|
|
65
|
+
class GraphQuery(BaseModel):
|
66
|
+
query: GraphPathQuery
|
67
|
+
|
68
|
+
|
64
69
|
class Query(BaseModel):
|
65
70
|
fulltext: Optional[FulltextQuery] = None
|
66
71
|
keyword: Optional[KeywordQuery] = None
|
67
72
|
semantic: Optional[SemanticQuery] = None
|
68
73
|
relation: Optional[RelationQuery] = None
|
74
|
+
graph: Optional[GraphQuery] = None
|
69
75
|
|
70
76
|
|
71
77
|
# filters
|
@@ -180,3 +186,7 @@ class CatalogQuery(BaseModel):
|
|
180
186
|
# Right now, we don't need a more generic model for graph queries, we can
|
181
187
|
# directly use the protobuffer directly
|
182
188
|
GraphRetrieval = nodereader_pb2.GraphSearchRequest
|
189
|
+
|
190
|
+
|
191
|
+
# We need this to avoid issues with pydantic and generic types defined in another module
|
192
|
+
GraphQuery.model_rebuild()
|
@@ -31,6 +31,7 @@ from nucliadb.search.search.query_parser.fetcher import Fetcher
|
|
31
31
|
from nucliadb.search.search.query_parser.filter_expression import parse_expression
|
32
32
|
from nucliadb.search.search.query_parser.models import (
|
33
33
|
Filters,
|
34
|
+
GraphQuery,
|
34
35
|
NoopReranker,
|
35
36
|
ParsedQuery,
|
36
37
|
PredictReranker,
|
@@ -112,7 +113,8 @@ class _FindParser:
|
|
112
113
|
if search_models.FindOptions.RELATIONS in self.item.features:
|
113
114
|
self._query.relation = await self._parse_relation_query()
|
114
115
|
|
115
|
-
|
116
|
+
if search_models.FindOptions.GRAPH in self.item.features:
|
117
|
+
self._query.graph = await self._parse_graph_query()
|
116
118
|
|
117
119
|
filters = await self._parse_filters()
|
118
120
|
|
@@ -151,6 +153,7 @@ class _FindParser:
|
|
151
153
|
and (
|
152
154
|
search_models.FindOptions.SEMANTIC in self.item.features
|
153
155
|
or search_models.FindOptions.RELATIONS in self.item.features
|
156
|
+
or search_models.FindOptions.GRAPH in self.item.features
|
154
157
|
)
|
155
158
|
):
|
156
159
|
raise InvalidQueryError(
|
@@ -162,6 +165,9 @@ class _FindParser:
|
|
162
165
|
if should_disable_vector_search(self.item):
|
163
166
|
self.item.features.remove(search_models.FindOptions.SEMANTIC)
|
164
167
|
|
168
|
+
if self.item.graph_query and search_models.FindOptions.GRAPH not in self.item.features:
|
169
|
+
raise InvalidQueryError("graph_query", "Using a graph query requires enabling graph feature")
|
170
|
+
|
165
171
|
async def _parse_relation_query(self) -> RelationQuery:
|
166
172
|
detected_entities = await self._get_detected_entities()
|
167
173
|
|
@@ -176,6 +182,13 @@ class _FindParser:
|
|
176
182
|
deleted_entities=deleted_entities,
|
177
183
|
)
|
178
184
|
|
185
|
+
async def _parse_graph_query(self) -> GraphQuery:
|
186
|
+
if self.item.graph_query is None:
|
187
|
+
raise InvalidQueryError(
|
188
|
+
"graph_query", "Graph query must be provided when using graph search"
|
189
|
+
)
|
190
|
+
return GraphQuery(query=self.item.graph_query)
|
191
|
+
|
179
192
|
async def _get_detected_entities(self) -> list[utils_pb2.RelationNode]:
|
180
193
|
"""Get entities from request, either automatically detected or
|
181
194
|
explicitly set by the user."""
|
@@ -33,7 +33,7 @@ from nucliadb_protos import utils_pb2
|
|
33
33
|
|
34
34
|
async def parse_graph_search(kbid: str, item: graph_requests.GraphSearchRequest) -> GraphRetrieval:
|
35
35
|
pb = await _parse_common(kbid, item)
|
36
|
-
pb.query.path.CopyFrom(
|
36
|
+
pb.query.path.CopyFrom(parse_path_query(item.query))
|
37
37
|
pb.kind = nodereader_pb2.GraphSearchRequest.QueryKind.PATH
|
38
38
|
return pb
|
39
39
|
|
@@ -111,19 +111,19 @@ def _parse_security(kbid: str, item: AnyGraphRequest) -> Optional[utils_pb2.Secu
|
|
111
111
|
return None
|
112
112
|
|
113
113
|
|
114
|
-
def
|
114
|
+
def parse_path_query(expr: graph_requests.GraphPathQuery) -> nodereader_pb2.GraphQuery.PathQuery:
|
115
115
|
pb = nodereader_pb2.GraphQuery.PathQuery()
|
116
116
|
|
117
117
|
if isinstance(expr, graph_requests.And):
|
118
118
|
for op in expr.operands:
|
119
|
-
pb.bool_and.operands.append(
|
119
|
+
pb.bool_and.operands.append(parse_path_query(op))
|
120
120
|
|
121
121
|
elif isinstance(expr, graph_requests.Or):
|
122
122
|
for op in expr.operands:
|
123
|
-
pb.bool_or.operands.append(
|
123
|
+
pb.bool_or.operands.append(parse_path_query(op))
|
124
124
|
|
125
125
|
elif isinstance(expr, graph_requests.Not):
|
126
|
-
pb.bool_not.CopyFrom(
|
126
|
+
pb.bool_not.CopyFrom(parse_path_query(expr.operand))
|
127
127
|
|
128
128
|
elif isinstance(expr, graph_requests.GraphPath):
|
129
129
|
if expr.source is not None:
|
@@ -27,6 +27,7 @@ from nucliadb.search.search.metrics import node_features, query_parser_observer
|
|
27
27
|
from nucliadb.search.search.query import apply_entities_filter, get_sort_field_proto
|
28
28
|
from nucliadb.search.search.query_parser.filter_expression import add_and_expression
|
29
29
|
from nucliadb.search.search.query_parser.models import ParsedQuery, PredictReranker, UnitRetrieval
|
30
|
+
from nucliadb.search.search.query_parser.parsers.graph import parse_path_query
|
30
31
|
from nucliadb_models.labels import LABEL_HIDDEN, translate_system_to_alias_label
|
31
32
|
from nucliadb_models.search import SortOrderMap
|
32
33
|
from nucliadb_protos import utils_pb2
|
@@ -71,11 +72,12 @@ class _Converter:
|
|
71
72
|
self._apply_text_queries()
|
72
73
|
self._apply_semantic_query()
|
73
74
|
self._apply_relation_query()
|
75
|
+
self._apply_graph_query()
|
74
76
|
self._apply_filters()
|
75
77
|
self._apply_top_k()
|
76
78
|
return self.req
|
77
79
|
|
78
|
-
def _apply_text_queries(self):
|
80
|
+
def _apply_text_queries(self) -> None:
|
79
81
|
text_query = self.retrieval.query.keyword or self.retrieval.query.fulltext
|
80
82
|
if text_query is None:
|
81
83
|
return
|
@@ -105,7 +107,7 @@ class _Converter:
|
|
105
107
|
self.req.order.sort_by = sort_field
|
106
108
|
self.req.order.type = SortOrderMap[text_query.sort] # type: ignore
|
107
109
|
|
108
|
-
def _apply_semantic_query(self):
|
110
|
+
def _apply_semantic_query(self) -> None:
|
109
111
|
if self.retrieval.query.semantic is None:
|
110
112
|
return
|
111
113
|
|
@@ -118,7 +120,7 @@ class _Converter:
|
|
118
120
|
self.req.vectorset = self.retrieval.query.semantic.vectorset
|
119
121
|
self.req.vector.extend(query_vector)
|
120
122
|
|
121
|
-
def _apply_relation_query(self):
|
123
|
+
def _apply_relation_query(self) -> None:
|
122
124
|
"""Relation queries are the legacy way to query the knowledge graph.
|
123
125
|
Given a set of entry points and some subtypes and entities to exclude
|
124
126
|
from search, it'd find the distance 1 neighbours (BFS)."""
|
@@ -203,7 +205,14 @@ class _Converter:
|
|
203
205
|
else:
|
204
206
|
self.req.graph_search.query.path.bool_and.operands.extend(subqueries)
|
205
207
|
|
206
|
-
def
|
208
|
+
def _apply_graph_query(self) -> None:
|
209
|
+
if self.retrieval.query.graph is None:
|
210
|
+
return
|
211
|
+
|
212
|
+
q = parse_path_query(self.retrieval.query.graph.query)
|
213
|
+
self.req.graph_search.query.path.CopyFrom(q)
|
214
|
+
|
215
|
+
def _apply_filters(self) -> None:
|
207
216
|
self.req.with_duplicates = self.retrieval.filters.with_duplicates
|
208
217
|
|
209
218
|
self.req.faceted.labels.extend(
|
@@ -239,7 +248,7 @@ class _Converter:
|
|
239
248
|
|
240
249
|
add_and_expression(self.req.field_filter, expr)
|
241
250
|
|
242
|
-
def _apply_top_k(self):
|
251
|
+
def _apply_top_k(self) -> None:
|
243
252
|
"""Adjust requested page size depending on rank fusion and reranking
|
244
253
|
algorithms.
|
245
254
|
|
@@ -19,7 +19,6 @@
|
|
19
19
|
#
|
20
20
|
import logging
|
21
21
|
from abc import ABC, abstractmethod
|
22
|
-
from typing import Iterable
|
23
22
|
|
24
23
|
from nucliadb.common.external_index_providers.base import TextBlockMatch
|
25
24
|
from nucliadb.common.ids import ParagraphId
|
@@ -62,50 +61,40 @@ class RankFusionAlgorithm(ABC):
|
|
62
61
|
return self._window
|
63
62
|
|
64
63
|
def fuse(
|
65
|
-
self,
|
64
|
+
self,
|
65
|
+
keyword: list[TextBlockMatch],
|
66
|
+
semantic: list[TextBlockMatch],
|
67
|
+
graph: list[TextBlockMatch],
|
66
68
|
) -> list[TextBlockMatch]:
|
67
69
|
"""Fuse keyword and semantic results and return a list with the merged
|
68
70
|
results.
|
69
71
|
|
70
|
-
|
71
|
-
merged = self._fuse(keyword, semantic)
|
72
|
-
return merged
|
73
|
-
|
74
|
-
@abstractmethod
|
75
|
-
def _fuse(
|
76
|
-
self, keyword: Iterable[TextBlockMatch], semantic: Iterable[TextBlockMatch]
|
77
|
-
) -> list[TextBlockMatch]: ...
|
78
|
-
|
79
|
-
|
80
|
-
class LegacyRankFusion(RankFusionAlgorithm):
|
81
|
-
"""Legacy algorithm that given results from keyword and semantic search,
|
82
|
-
mixes them in the following way:
|
83
|
-
- 1st result from keyword search
|
84
|
-
- 2nd result from semantic search
|
85
|
-
- 2 keyword results and 1 semantic (and repeat)
|
86
|
-
|
87
|
-
"""
|
88
|
-
|
89
|
-
@rank_fusion_observer.wrap({"type": "legacy"})
|
90
|
-
def _fuse(
|
91
|
-
self, keyword: Iterable[TextBlockMatch], semantic: Iterable[TextBlockMatch]
|
92
|
-
) -> list[TextBlockMatch]:
|
93
|
-
merged: list[TextBlockMatch] = []
|
72
|
+
If only one retriever is provided, rank fusion will be skipped.
|
94
73
|
|
74
|
+
"""
|
95
75
|
# sort results by it's score before merging them
|
96
76
|
keyword = [k for k in sorted(keyword, key=lambda r: r.score, reverse=True)]
|
97
77
|
semantic = [s for s in sorted(semantic, key=lambda r: r.score, reverse=True)]
|
78
|
+
graph = [g for g in graph]
|
98
79
|
|
99
|
-
for
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
merged.insert(nextpos, s)
|
105
|
-
nextpos += 3
|
106
|
-
|
80
|
+
retrievals_with_results = [x for x in (keyword, semantic, graph) if len(x) > 0]
|
81
|
+
if len(retrievals_with_results) == 1:
|
82
|
+
return retrievals_with_results[0]
|
83
|
+
else:
|
84
|
+
merged = self._fuse(keyword, semantic, graph)
|
107
85
|
return merged
|
108
86
|
|
87
|
+
@abstractmethod
|
88
|
+
def _fuse(
|
89
|
+
self,
|
90
|
+
keyword: list[TextBlockMatch],
|
91
|
+
semantic: list[TextBlockMatch],
|
92
|
+
graph: list[TextBlockMatch],
|
93
|
+
) -> list[TextBlockMatch]:
|
94
|
+
"""Rank fusion implementation. All arguments are assumed to be ordered
|
95
|
+
by decreasing score."""
|
96
|
+
...
|
97
|
+
|
109
98
|
|
110
99
|
class ReciprocalRankFusion(RankFusionAlgorithm):
|
111
100
|
"""Rank-based rank fusion algorithm. Discounts the weight of documents
|
@@ -132,6 +121,7 @@ class ReciprocalRankFusion(RankFusionAlgorithm):
|
|
132
121
|
window: int,
|
133
122
|
keyword_weight: float = 1.0,
|
134
123
|
semantic_weight: float = 1.0,
|
124
|
+
graph_weight: float = 1.0,
|
135
125
|
):
|
136
126
|
super().__init__(window)
|
137
127
|
# Constant used in RRF, studies agree on 60 as a good default value
|
@@ -141,21 +131,22 @@ class ReciprocalRankFusion(RankFusionAlgorithm):
|
|
141
131
|
self._k = k
|
142
132
|
self._keyword_boost = keyword_weight
|
143
133
|
self._semantic_boost = semantic_weight
|
134
|
+
self._graph_boost = graph_weight
|
144
135
|
|
145
136
|
@rank_fusion_observer.wrap({"type": "reciprocal_rank_fusion"})
|
146
137
|
def _fuse(
|
147
|
-
self,
|
138
|
+
self,
|
139
|
+
keyword: list[TextBlockMatch],
|
140
|
+
semantic: list[TextBlockMatch],
|
141
|
+
graph: list[TextBlockMatch],
|
148
142
|
) -> list[TextBlockMatch]:
|
149
143
|
scores: dict[ParagraphId, tuple[float, SCORE_TYPE]] = {}
|
150
144
|
match_positions: dict[ParagraphId, list[tuple[int, int]]] = {}
|
151
145
|
|
152
|
-
# sort results by it's score before merging them
|
153
|
-
keyword = [k for k in sorted(keyword, key=lambda r: r.score, reverse=True)]
|
154
|
-
semantic = [s for s in sorted(semantic, key=lambda r: r.score, reverse=True)]
|
155
|
-
|
156
146
|
rankings = [
|
157
147
|
(keyword, self._keyword_boost),
|
158
148
|
(semantic, self._semantic_boost),
|
149
|
+
(graph, self._graph_boost),
|
159
150
|
]
|
160
151
|
for r, (ranking, boost) in enumerate(rankings):
|
161
152
|
for i, result in enumerate(ranking):
|
@@ -195,6 +186,7 @@ def get_rank_fusion(rank_fusion: parser_models.RankFusion) -> RankFusionAlgorith
|
|
195
186
|
window=window,
|
196
187
|
keyword_weight=rank_fusion.boosting.keyword,
|
197
188
|
semantic_weight=rank_fusion.boosting.semantic,
|
189
|
+
graph_weight=rank_fusion.boosting.graph,
|
198
190
|
)
|
199
191
|
|
200
192
|
else:
|
@@ -159,6 +159,7 @@ def parse_basic_modify(bm: BrokerMessage, item: ComingResourcePayload, toprocess
|
|
159
159
|
source=relation_node_from,
|
160
160
|
to=relation_node_to,
|
161
161
|
relation_label=relation.label or "",
|
162
|
+
# XXX: we are not propagating metadata, is this intended?
|
162
163
|
)
|
163
164
|
)
|
164
165
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: nucliadb
|
3
|
-
Version: 6.4.0.
|
3
|
+
Version: 6.4.0.post4161
|
4
4
|
Summary: NucliaDB
|
5
5
|
Author-email: Nuclia <nucliadb@nuclia.com>
|
6
6
|
License: AGPL
|
@@ -20,11 +20,11 @@ Classifier: Programming Language :: Python :: 3.12
|
|
20
20
|
Classifier: Programming Language :: Python :: 3 :: Only
|
21
21
|
Requires-Python: <4,>=3.9
|
22
22
|
Description-Content-Type: text/markdown
|
23
|
-
Requires-Dist: nucliadb-telemetry[all]>=6.4.0.
|
24
|
-
Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.4.0.
|
25
|
-
Requires-Dist: nucliadb-protos>=6.4.0.
|
26
|
-
Requires-Dist: nucliadb-models>=6.4.0.
|
27
|
-
Requires-Dist: nidx-protos>=6.4.0.
|
23
|
+
Requires-Dist: nucliadb-telemetry[all]>=6.4.0.post4161
|
24
|
+
Requires-Dist: nucliadb-utils[cache,fastapi,storages]>=6.4.0.post4161
|
25
|
+
Requires-Dist: nucliadb-protos>=6.4.0.post4161
|
26
|
+
Requires-Dist: nucliadb-models>=6.4.0.post4161
|
27
|
+
Requires-Dist: nidx-protos>=6.4.0.post4161
|
28
28
|
Requires-Dist: nucliadb-admin-assets>=1.0.0.post1224
|
29
29
|
Requires-Dist: nuclia-models>=0.24.2
|
30
30
|
Requires-Dist: uvicorn[standard]
|
@@ -234,7 +234,7 @@ nucliadb/search/search/exceptions.py,sha256=klGLgAGGrXcSGix_W6418ZBMqDchAIGjN77o
|
|
234
234
|
nucliadb/search/search/fetch.py,sha256=eiljOKim-4OOEZn-3fyVZSYxztCH156BXYdqlIwVdN4,6181
|
235
235
|
nucliadb/search/search/filters.py,sha256=1MkHlJjAQqoRCj7e5cEzK2HvBxGLE17I_omsjiklbtw,6476
|
236
236
|
nucliadb/search/search/find.py,sha256=WTc_0HdbaU0Mwkmlf9s4pCmTuU0hz1jetBjIpNLXEEM,7982
|
237
|
-
nucliadb/search/search/find_merge.py,sha256=
|
237
|
+
nucliadb/search/search/find_merge.py,sha256=2NtVZlR61MnTZl7mkzqcpIOPUU8hGWPrrP7ATeubt7w,19677
|
238
238
|
nucliadb/search/search/graph_merge.py,sha256=y5V7X-BhjHsKDXE69tzQLIIKGm4XuaFrZXw0odcHVNM,3402
|
239
239
|
nucliadb/search/search/graph_strategy.py,sha256=JsV-i9PGhekCAzmGpqeueQIitJb7fWCihIwUf76Q3pU,32912
|
240
240
|
nucliadb/search/search/hydrator.py,sha256=-R37gCrGxkyaiHQalnTWHNG_FCx11Zucd7qA1vQCxuw,6985
|
@@ -245,7 +245,7 @@ nucliadb/search/search/paragraphs.py,sha256=pNAEiYqJGGUVcEf7xf-PFMVqz0PX4Qb-WNG-
|
|
245
245
|
nucliadb/search/search/pgcatalog.py,sha256=s_J98fsX_RuFXwpejpkGqG-tD9ELuzz4YQ6U3ew5h2g,9313
|
246
246
|
nucliadb/search/search/predict_proxy.py,sha256=IFI3v_ODz2_UU1XZnyaD391fE7-2C0npSmj_HmDvzS4,3123
|
247
247
|
nucliadb/search/search/query.py,sha256=-gvKsyGmKYpsoEVzKkq3HJUMcs_3LD3TYUueOcJsTec,11511
|
248
|
-
nucliadb/search/search/rank_fusion.py,sha256=
|
248
|
+
nucliadb/search/search/rank_fusion.py,sha256=8Bq3AHfHgytp7UIhJQgbnXrchrjlCQbgf8PhLQkWBPY,6718
|
249
249
|
nucliadb/search/search/rerankers.py,sha256=PvhExUb8zZYghiFHRgGotw6h6bU--Rft09wE8arvtAw,7424
|
250
250
|
nucliadb/search/search/shards.py,sha256=mc5DK-MoCv9AFhlXlOFHbPvetcyNDzTFOJ5rimK8PC8,2636
|
251
251
|
nucliadb/search/search/summarize.py,sha256=ksmYPubEQvAQgfPdZHfzB_rR19B2ci4IYZ6jLdHxZo8,4996
|
@@ -260,16 +260,16 @@ nucliadb/search/search/query_parser/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyv
|
|
260
260
|
nucliadb/search/search/query_parser/exceptions.py,sha256=szAOXUZ27oNY-OSa9t2hQ5HHkQQC0EX1FZz_LluJHJE,1224
|
261
261
|
nucliadb/search/search/query_parser/fetcher.py,sha256=SkvBRDfSKmuz-QygNKLAU4AhZhhDo1dnOZmt1zA28RA,16851
|
262
262
|
nucliadb/search/search/query_parser/filter_expression.py,sha256=fZI8qFRF3h2sa01gwPmDlA5c16mq7ShMOBk-rDaA_fE,6575
|
263
|
-
nucliadb/search/search/query_parser/models.py,sha256=
|
263
|
+
nucliadb/search/search/query_parser/models.py,sha256=k9cCjTpndP9ynr8A9J8MBmDYmjLBKL1UM4L0GXVuJw0,5031
|
264
264
|
nucliadb/search/search/query_parser/old_filters.py,sha256=0NKjRdzAn2bH6veG0M-xM9BNKEYwa4U6WXtZzJAWRvo,9068
|
265
265
|
nucliadb/search/search/query_parser/parsers/__init__.py,sha256=ySCNSdbesLXGZyR88919njulA6UE10_3PhqMG_Yj1o4,1034
|
266
266
|
nucliadb/search/search/query_parser/parsers/ask.py,sha256=eTz8wS-EJHuAagR384h6TT64itymFZRpfZJGX8r6aZM,2771
|
267
267
|
nucliadb/search/search/query_parser/parsers/catalog.py,sha256=XdBiTweGTQkj8m_V_i2xbwp7P5pPO8K1Tud692XKhMw,7149
|
268
268
|
nucliadb/search/search/query_parser/parsers/common.py,sha256=o3028wUnK78lOmFK0jtmpvx2Y1Jh_atBYBoO5VD-qJ4,6359
|
269
|
-
nucliadb/search/search/query_parser/parsers/find.py,sha256=
|
270
|
-
nucliadb/search/search/query_parser/parsers/graph.py,sha256=
|
269
|
+
nucliadb/search/search/query_parser/parsers/find.py,sha256=Fo4lXOnCbP0AKEc1mKLNINJBv63B4DPlix0vlhyesck,12717
|
270
|
+
nucliadb/search/search/query_parser/parsers/graph.py,sha256=lDRJO_JvOe7yytNgXZyMogyPMgB5xc8obNY2kqz3yGU,9405
|
271
271
|
nucliadb/search/search/query_parser/parsers/search.py,sha256=yEebeMOXJza7HMK3TdIPO6UGQbe79maSDg-GgohQIMk,10517
|
272
|
-
nucliadb/search/search/query_parser/parsers/unit_retrieval.py,sha256=
|
272
|
+
nucliadb/search/search/query_parser/parsers/unit_retrieval.py,sha256=bcSvF2mW6IHFAs7_yA6TePw0zVtk9CmEA3j6xkhkDO8,11328
|
273
273
|
nucliadb/standalone/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
|
274
274
|
nucliadb/standalone/api_router.py,sha256=hgq9FXpihzgjHkwcVGfGCSwyXy67fqXTfLFHuINzIi0,5567
|
275
275
|
nucliadb/standalone/app.py,sha256=mAApNK_iVsQgJyd-mtwCeZq5csSimwnXmlQGH9a70pE,5586
|
@@ -353,7 +353,7 @@ nucliadb/writer/api/v1/upload.py,sha256=fwWXA5BuLPuGKhOcuyf0CdutWJITjJ6fAvDzV_X9
|
|
353
353
|
nucliadb/writer/api/v1/vectorsets.py,sha256=F3iMViL5G95_Tns4aO2SOA0DwAzxK2_P8MXxtd_XLRE,6973
|
354
354
|
nucliadb/writer/resource/__init__.py,sha256=cp15ZcFnHvpcu_5-aK2A4uUyvuZVV_MJn4bIXMa20ks,835
|
355
355
|
nucliadb/writer/resource/audit.py,sha256=FvxMZPzrNHtd31HgpZEvxzwAkbxJTZRhPLqRYYJi3tA,1426
|
356
|
-
nucliadb/writer/resource/basic.py,sha256=
|
356
|
+
nucliadb/writer/resource/basic.py,sha256=44GK8M9EEVoAUfGiabdLrrpENqeFwNn7qwxF2AHhQGg,10504
|
357
357
|
nucliadb/writer/resource/field.py,sha256=MhDbcOEw6KbOGBAnBFAKA_yxL2WrC7Ky2JrjB3iWf9c,20384
|
358
358
|
nucliadb/writer/resource/origin.py,sha256=pvhUDdU0mlWPUcpoQi4LDUJaRtfjzVVrA8XcGVI_N8k,2021
|
359
359
|
nucliadb/writer/tus/__init__.py,sha256=huWpKnDnjsrKlBBJk30ta5vamlA-4x0TbPs_2Up8hyM,5443
|
@@ -365,8 +365,8 @@ nucliadb/writer/tus/local.py,sha256=7jYa_w9b-N90jWgN2sQKkNcomqn6JMVBOVeDOVYJHto,
|
|
365
365
|
nucliadb/writer/tus/s3.py,sha256=vF0NkFTXiXhXq3bCVXXVV-ED38ECVoUeeYViP8uMqcU,8357
|
366
366
|
nucliadb/writer/tus/storage.py,sha256=ToqwjoYnjI4oIcwzkhha_MPxi-k4Jk3Lt55zRwaC1SM,2903
|
367
367
|
nucliadb/writer/tus/utils.py,sha256=MSdVbRsRSZVdkaum69_0wku7X3p5wlZf4nr6E0GMKbw,2556
|
368
|
-
nucliadb-6.4.0.
|
369
|
-
nucliadb-6.4.0.
|
370
|
-
nucliadb-6.4.0.
|
371
|
-
nucliadb-6.4.0.
|
372
|
-
nucliadb-6.4.0.
|
368
|
+
nucliadb-6.4.0.post4161.dist-info/METADATA,sha256=xZYY6m0tHa_k-3X9XuzMbfSy9oofa64mPUaTaCpq9GM,4226
|
369
|
+
nucliadb-6.4.0.post4161.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
|
370
|
+
nucliadb-6.4.0.post4161.dist-info/entry_points.txt,sha256=XqGfgFDuY3zXQc8ewXM2TRVjTModIq851zOsgrmaXx4,1268
|
371
|
+
nucliadb-6.4.0.post4161.dist-info/top_level.txt,sha256=hwYhTVnX7jkQ9gJCkVrbqEG1M4lT2F_iPQND1fCzF80,20
|
372
|
+
nucliadb-6.4.0.post4161.dist-info/RECORD,,
|
File without changes
|
File without changes
|