Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
milvus
milvus
提交
22508f36
M
milvus
项目概览
milvus
/
milvus
11 个月 前同步成功
通知
261
Star
22476
Fork
2472
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
milvus
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
22508f36
编写于
7月 08, 2022
作者:
B
bigsheeper
提交者:
GitHub
7月 08, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Get search field id from search plan and log if loaded index when search segments (#18183)
Signed-off-by:
N
bigsheeper
<
yihao.dai@zilliz.com
>
上级
d70a2c87
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
105 addition
and
5 deletion
+105
-5
internal/core/src/query/Plan.cpp
internal/core/src/query/Plan.cpp
+5
-0
internal/core/src/query/Plan.h
internal/core/src/query/Plan.h
+3
-0
internal/core/src/segcore/plan_c.cpp
internal/core/src/segcore/plan_c.cpp
+12
-0
internal/core/src/segcore/plan_c.h
internal/core/src/segcore/plan_c.h
+3
-0
internal/core/unittest/test_c_api.cpp
internal/core/unittest/test_c_api.cpp
+41
-1
internal/querynode/plan.go
internal/querynode/plan.go
+9
-0
internal/querynode/plan_test.go
internal/querynode/plan_test.go
+21
-0
internal/querynode/segment.go
internal/querynode/segment.go
+11
-4
未找到文件。
internal/core/src/query/Plan.cpp
浏览文件 @
22508f36
...
...
@@ -78,6 +78,11 @@ GetTopK(const Plan* plan) {
return
plan
->
plan_node_
->
search_info_
.
topk_
;
}
int64_t
GetFieldID
(
const
Plan
*
plan
)
{
return
plan
->
plan_node_
->
search_info_
.
field_id_
.
get
();
}
int64_t
GetNumOfQueries
(
const
PlaceholderGroup
*
group
)
{
return
group
->
at
(
0
).
num_of_queries_
;
...
...
internal/core/src/query/Plan.h
浏览文件 @
22508f36
...
...
@@ -48,4 +48,7 @@ CreateRetrievePlanByExpr(const Schema& schema, const void* serialized_expr_plan,
int64_t
GetTopK
(
const
Plan
*
);
int64_t
GetFieldID
(
const
Plan
*
plan
);
}
// namespace milvus::query
internal/core/src/segcore/plan_c.cpp
浏览文件 @
22508f36
...
...
@@ -9,6 +9,7 @@
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
// or implied. See the License for the specific language governing permissions and limitations under the License
#include "common/CGoHelper.h"
#include "pb/segcore.pb.h"
#include "query/Plan.h"
#include "segcore/Collection.h"
...
...
@@ -109,6 +110,17 @@ GetTopK(CSearchPlan plan) {
return
res
;
}
CStatus
GetFieldID
(
CSearchPlan
plan
,
int64_t
*
field_id
)
{
try
{
auto
p
=
static_cast
<
const
milvus
::
query
::
Plan
*>
(
plan
);
*
field_id
=
milvus
::
query
::
GetFieldID
(
p
);
return
milvus
::
SuccessCStatus
();
}
catch
(
std
::
exception
&
e
)
{
return
milvus
::
FailureCStatus
(
UnexpectedError
,
strdup
(
e
.
what
()));
}
}
const
char
*
GetMetricType
(
CSearchPlan
plan
)
{
auto
search_plan
=
static_cast
<
milvus
::
query
::
Plan
*>
(
plan
);
...
...
internal/core/src/segcore/plan_c.h
浏览文件 @
22508f36
...
...
@@ -42,6 +42,9 @@ GetNumOfQueries(CPlaceholderGroup placeholder_group);
int64_t
GetTopK
(
CSearchPlan
plan
);
CStatus
GetFieldID
(
CSearchPlan
plan
,
int64_t
*
field_id
);
const
char
*
GetMetricType
(
CSearchPlan
plan
);
...
...
internal/core/unittest/test_c_api.cpp
浏览文件 @
22508f36
...
...
@@ -208,6 +208,46 @@ TEST(CApiTest, SegmentTest) {
DeleteSegment
(
segment
);
}
TEST
(
CApiTest
,
CPlan
)
{
std
::
string
schema_string
=
generate_collection_schema
(
"JACCARD"
,
DIM
,
true
);
auto
collection
=
NewCollection
(
schema_string
.
c_str
());
const
char
*
dsl_string
=
R"(
{
"bool": {
"vector": {
"fakevec": {
"metric_type": "L2",
"params": {
"nprobe": 10
},
"query": "$0",
"topk": 10,
"round_decimal": 3
}
}
}
})"
;
void
*
plan
=
nullptr
;
auto
status
=
CreateSearchPlan
(
collection
,
dsl_string
,
&
plan
);
assert
(
status
.
error_code
==
Success
);
int64_t
field_id
=
-
1
;
status
=
GetFieldID
(
plan
,
&
field_id
);
assert
(
status
.
error_code
==
Success
);
auto
col
=
static_cast
<
Collection
*>
(
collection
);
for
(
auto
&
[
target_field_id
,
field_meta
]
:
col
->
get_schema
()
->
get_fields
())
{
if
(
field_meta
.
is_vector
())
{
assert
(
field_id
==
target_field_id
.
get
());
}
}
assert
(
field_id
!=
-
1
);
DeleteSearchPlan
(
plan
);
}
template
<
typename
Message
>
std
::
vector
<
uint8_t
>
serialize
(
const
Message
*
msg
)
{
...
...
@@ -1104,7 +1144,7 @@ TEST(CApiTest, ReudceNullResult) {
status
=
ReduceSearchResultsAndFillData
(
&
cSearchResultData
,
plan
,
results
.
data
(),
results
.
size
(),
slice_nqs
.
data
(),
slice_topKs
.
data
(),
slice_nqs
.
size
());
assert
(
status
.
error_code
==
Success
);
auto
search_result
=
(
SearchResult
*
)
results
[
0
];
auto
size
=
search_result
->
result_offsets_
.
size
();
EXPECT_EQ
(
size
,
num_queries
/
2
);
...
...
internal/querynode/plan.go
浏览文件 @
22508f36
...
...
@@ -95,6 +95,7 @@ type searchRequest struct {
cPlaceholderGroup
C
.
CPlaceholderGroup
timestamp
Timestamp
msgID
UniqueID
searchFieldID
UniqueID
}
func
newSearchRequest
(
collection
*
Collection
,
req
*
querypb
.
SearchRequest
,
placeholderGrp
[]
byte
)
(
*
searchRequest
,
error
)
{
...
...
@@ -129,11 +130,19 @@ func newSearchRequest(collection *Collection, req *querypb.SearchRequest, placeh
return
nil
,
err
}
var
fieldID
C
.
int64_t
status
=
C
.
GetFieldID
(
plan
.
cSearchPlan
,
&
fieldID
)
if
err
=
HandleCStatus
(
&
status
,
"get fieldID from plan failed"
);
err
!=
nil
{
plan
.
delete
()
return
nil
,
err
}
ret
:=
&
searchRequest
{
plan
:
plan
,
cPlaceholderGroup
:
cPlaceholderGroup
,
timestamp
:
req
.
Req
.
GetTravelTimestamp
(),
msgID
:
req
.
GetReq
()
.
GetBase
()
.
GetMsgID
(),
searchFieldID
:
int64
(
fieldID
),
}
return
ret
,
nil
...
...
internal/querynode/plan_test.go
浏览文件 @
22508f36
...
...
@@ -27,6 +27,7 @@ import (
"github.com/milvus-io/milvus/internal/common"
"github.com/milvus-io/milvus/internal/proto/commonpb"
"github.com/milvus-io/milvus/internal/proto/planpb"
"github.com/milvus-io/milvus/internal/proto/querypb"
)
func
TestPlan_Plan
(
t
*
testing
.
T
)
{
...
...
@@ -124,3 +125,23 @@ func TestPlan_PlaceholderGroup(t *testing.T) {
holder
.
delete
()
deleteCollection
(
collection
)
}
func
TestPlan_newSearchRequest
(
t
*
testing
.
T
)
{
iReq
,
_
:=
genSearchRequest
(
defaultNQ
,
IndexHNSW
,
genTestCollectionSchema
())
collection
:=
newCollection
(
defaultCollectionID
,
genTestCollectionSchema
())
req
:=
&
querypb
.
SearchRequest
{
Req
:
iReq
,
DmlChannels
:
[]
string
{
defaultDMLChannel
},
SegmentIDs
:
[]
UniqueID
{
defaultSegmentID
},
FromShardLeader
:
true
,
Scope
:
querypb
.
DataScope_Historical
,
}
searchReq
,
err
:=
newSearchRequest
(
collection
,
req
,
req
.
Req
.
GetPlaceholderGroup
())
assert
.
NoError
(
t
,
err
)
assert
.
Equal
(
t
,
simpleFloatVecField
.
id
,
searchReq
.
searchFieldID
)
assert
.
EqualValues
(
t
,
defaultNQ
,
searchReq
.
getNumOfQuery
())
searchReq
.
delete
()
deleteCollection
(
collection
)
}
internal/querynode/segment.go
浏览文件 @
22508f36
...
...
@@ -279,9 +279,13 @@ func (s *Segment) search(searchReq *searchRequest) (*SearchResult, error) {
return
nil
,
fmt
.
Errorf
(
"nil search plan"
)
}
loadIndex
:=
s
.
hasLoadIndexForIndexedField
(
searchReq
.
searchFieldID
)
var
searchResult
SearchResult
log
.
Debug
(
"start do search on segment"
,
zap
.
Int64
(
"msgID"
,
searchReq
.
msgID
),
zap
.
Int64
(
"segmentID"
,
s
.
segmentID
),
zap
.
String
(
"segmentType"
,
s
.
segmentType
.
String
()))
log
.
Debug
(
"start do search on segment"
,
zap
.
Int64
(
"msgID"
,
searchReq
.
msgID
),
zap
.
Int64
(
"segmentID"
,
s
.
segmentID
),
zap
.
String
(
"segmentType"
,
s
.
segmentType
.
String
()),
zap
.
Bool
(
"loadIndex"
,
loadIndex
))
tr
:=
timerecord
.
NewTimeRecorder
(
"cgoSearch"
)
status
:=
C
.
Search
(
s
.
segmentPtr
,
searchReq
.
plan
.
cSearchPlan
,
searchReq
.
cPlaceholderGroup
,
C
.
uint64_t
(
searchReq
.
timestamp
),
&
searchResult
.
cSearchResult
,
C
.
int64_t
(
s
.
segmentID
))
...
...
@@ -289,8 +293,11 @@ func (s *Segment) search(searchReq *searchRequest) (*SearchResult, error) {
if
err
:=
HandleCStatus
(
&
status
,
"Search failed"
);
err
!=
nil
{
return
nil
,
err
}
log
.
Debug
(
"do search on segment done"
,
zap
.
Int64
(
"msgID"
,
searchReq
.
msgID
),
zap
.
Int64
(
"segmentID"
,
s
.
segmentID
),
zap
.
String
(
"segmentType"
,
s
.
segmentType
.
String
()))
log
.
Debug
(
"do search on segment done"
,
zap
.
Int64
(
"msgID"
,
searchReq
.
msgID
),
zap
.
Int64
(
"segmentID"
,
s
.
segmentID
),
zap
.
String
(
"segmentType"
,
s
.
segmentType
.
String
()),
zap
.
Bool
(
"loadIndex"
,
loadIndex
))
return
&
searchResult
,
nil
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录