前提条件
已初始化OTSClient。具体操作,请参见初始化Tablestore Client。
已在数据表上创建多元索引。具体操作,请参见创建多元索引。
参数
|
参数 |
说明 |
|
table_name |
数据表名称。 |
|
index_name |
多元索引名称。 |
|
must_queries |
AND 条件,等价于逻辑运算符 AND。只返回满足所有子查询条件的行。 |
|
must_not_queries |
NOT 条件,等价于逻辑运算符 NOT。只返回不满足任一子查询条件的行。指定多个子查询时,等价于 NOT(A OR B)——某行只要满足其中任意一个子查询,就会被排除。 |
|
filter_queries |
过滤条件,以 AND 逻辑执行。只返回满足所有过滤条件的行。与 |
|
should_queries |
OR 条件,等价于逻辑运算符 OR。返回满足至少 满足的子查询条件越多,该行的相关性得分越高。 通过 |
|
minimum_should_match |
|
示例
以下示例展示各类条件组合的用法,均通过 $otsClient->search($request) 调用,查询类型为 QueryTypeConst::BOOL_QUERY。
And条件查询
用 must_queries 实现 AND 逻辑:返回同时满足条件 A 和条件 B 的行。以下示例返回 keyword 字段等于 "keyword" 且 long 字段在 [100, 101) 范围内的行。
$request = array(
'table_name' => 'php_sdk_test',
'index_name' => 'php_sdk_test_search_index',
'search_query' => array(
'offset' => 0,
'limit' => 2,
'get_total_count' => true,
'query' => array(
'query_type' => QueryTypeConst::BOOL_QUERY,
'query' => array(
'must_queries' => array(
array(
'query_type' => QueryTypeConst::TERM_QUERY,
'query' => array(
'field_name' => 'keyword',
'term' => 'keyword'
)
),
array(
'query_type' => QueryTypeConst::RANGE_QUERY,
'query' => array(
'field_name' => 'long',
'range_from' => 100,
'include_lower' => true,
'range_to' => 101,
'include_upper' => false
)
)
),
)
),
'sort' => array(
array(
'field_sort' => array(
'field_name' => 'keyword',
'order' => SortOrderConst::SORT_ORDER_ASC
)
),
)
),
'columns_to_get' => array(
'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
'return_names' => array('keyword', 'long')
)
);
$response = $otsClient->search($request);
Or条件查询
用 should_queries 配合 minimum_should_match 实现 OR 逻辑:返回满足条件 A 或条件 B 中至少一个的行。以下示例返回 keyword 字段等于 "keyword" 或 long 字段在 [100, 101) 范围内的行。
$request = array(
'table_name' => 'php_sdk_test',
'index_name' => 'php_sdk_test_search_index',
'search_query' => array(
'offset' => 0,
'limit' => 2,
'get_total_count' => true,
'query' => array(
'query_type' => QueryTypeConst::BOOL_QUERY,
'query' => array(
'should_queries' => array(
array(
'query_type' => QueryTypeConst::TERM_QUERY,
'query' => array(
'field_name' => 'keyword',
'term' => 'keyword'
)
),
array(
'query_type' => QueryTypeConst::RANGE_QUERY,
'query' => array(
'field_name' => 'long',
'range_from' => 100,
'include_lower' => true,
'range_to' => 101,
'include_upper' => false
)
)
),
'minimum_should_match' => 1
)
),
'sort' => array(
array(
'field_sort' => array(
'field_name' => 'keyword',
'order' => SortOrderConst::SORT_ORDER_ASC
)
),
)
),
'columns_to_get' => array(
'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
'return_names' => array('keyword', 'long')
)
);
$response = $otsClient->search($request);
Not条件查询
用 must_not_queries 排除满足任一条件的行,等价于 NOT(A OR B):返回既不满足条件 A、也不满足条件 B 的行。以下示例排除 keyword 字段等于 "keyword" 或 long 字段在 [100, 101) 范围内的行。
$request = array(
'table_name' => 'php_sdk_test',
'index_name' => 'php_sdk_test_search_index',
'search_query' => array(
'offset' => 0,
'limit' => 2,
'get_total_count' => true,
'query' => array(
'query_type' => QueryTypeConst::BOOL_QUERY,
'query' => array(
'must_not_queries' => array(
array(
'query_type' => QueryTypeConst::TERM_QUERY,
'query' => array(
'field_name' => 'keyword',
'term' => 'keyword'
)
),
array(
'query_type' => QueryTypeConst::RANGE_QUERY,
'query' => array(
'field_name' => 'long',
'range_from' => 100,
'include_lower' => true,
'range_to' => 101,
'include_upper' => false
)
)
),
)
),
'sort' => array(
array(
'field_sort' => array(
'field_name' => 'keyword',
'order' => SortOrderConst::SORT_ORDER_ASC
)
),
)
),
'columns_to_get' => array(
'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
'return_names' => array('keyword', 'long')
)
);
$response = $otsClient->search($request);
Filter条件查询
用 filter_queries 实现不计算相关性得分的 AND 过滤:只过滤数据,不影响相关性排序。以下示例返回同时满足两个条件的行,行数据不会因满足条件个数的多少而产生相关性得分差异。
$request = array(
'table_name' => 'php_sdk_test',
'index_name' => 'php_sdk_test_search_index',
'search_query' => array(
'offset' => 0,
'limit' => 2,
'get_total_count' => true,
'query' => array(
'query_type' => QueryTypeConst::BOOL_QUERY,
'query' => array(
'filter_queries' => array(
array(
'query_type' => QueryTypeConst::TERM_QUERY,
'query' => array(
'field_name' => 'keyword',
'term' => 'keyword'
)
),
array(
'query_type' => QueryTypeConst::RANGE_QUERY,
'query' => array(
'field_name' => 'long',
'range_from' => 100,
'include_lower' => true,
'range_to' => 101,
'include_upper' => false
)
)
),
)
),
'sort' => array(
array(
'field_sort' => array(
'field_name' => 'keyword',
'order' => SortOrderConst::SORT_ORDER_ASC
)
),
)
),
'columns_to_get' => array(
'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
'return_names' => array('keyword', 'long')
)
);
$response = $otsClient->search($request);
组合查询
嵌套多个 BoolQuery 可构造任意复杂的逻辑组合。以下示例实现逻辑表达式 (col2 < 4 OR col3 < 5) OR (col2 = 4 AND (col3 = 5 OR col3 = 6)),其中每个 AND 或 OR 对应一个 BoolQuery。
$request = array(
'table_name' => 'php_sdk_test',
'index_name' => 'php_sdk_test_index',
'search_query' => [
'offset' => 0,
'limit' => 10,
'get_total_count' => false,
'query' => [
'query_type' => QueryTypeConst::BOOL_QUERY,
'query' => [
//总组合查询条件为(col2<4 or col3<5) or (col2 = 4 and (col3 = 5 or col3 =6))。
'should_queries' => [
[
'query_type' => QueryTypeConst::BOOL_QUERY,
'query' => [
//组合条件1为(col2<4 or col3<5)。
'should_queries' => [
[
'query_type' => QueryTypeConst::RANGE_QUERY,
//查询条件1为col2<4。
'query' => [
'field_name' => 'col2',
'range_to' => 4
]
],
[
'query_type' => QueryTypeConst::RANGE_QUERY,
//查询条件2为col3<5。
'query' => [
'field_name' => 'col3',
'range_to' => 5
]
]
]
]
],
[
'query_type' => QueryTypeConst::BOOL_QUERY,
//组合条件2为(col2 = 4 and (col3 = 5 or col3 =6))。
'query' => [
'must_queries' => [
[
'query_type' => QueryTypeConst::TERM_QUERY,
//查询条件3为col2=4。
'query' => [
'field_name' => 'col2',
'term' => 4
]
],
[
'query_type' => QueryTypeConst::BOOL_QUERY,
//组合条件3为(col3 = 5 or col3 =6))。
'query' => [
'should_queries' => [
[
'query_type' => QueryTypeConst::TERM_QUERY,
//查询条件4为col3=5。
'query' => [
'field_name' => 'col3',
'term' => 5
]
],
[
'query_type' => QueryTypeConst::TERM_QUERY,
//查询条件5为col3=6。
'query' => [
'field_name' => 'col3',
'term' => 6
]
]
],
'minimum_should_match' => 1
]
]
]
]
]
],
'minimum_should_match' => 1
]
]
],
//通过设置columns_to_get参数可以指定返回的列或返回所有列,如果不设置此参数,则默认只返回主键列。
'columns_to_get' => [
//'return_type' => ColumnReturnTypeConst::RETURN_ALL //设置为返回所有列。
//设置为返回指定列。
'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
'return_names' => array('col1', 'col2')
]
);
$response = $otsClient->search($request);
常见问题
相关文档
多元索引查询类型包括精确查询、多词精确查询、全匹配查询、匹配查询、短语匹配查询、前缀查询、范围查询、通配符查询、多条件组合查询、地理位置查询、嵌套类型查询和列存在性查询,您可以选择合适的查询类型进行多维度数据查询。
如果要对结果集进行排序或者翻页,您可以使用排序和翻页功能来实现。具体操作,请参见排序和翻页。
如果要按照某一列对结果集做折叠,使对应类型的数据在结果展示中只出现一次,您可以使用折叠(去重)功能来实现。具体操作,请参见折叠(去重)。
如果要进行数据分析,例如求最值、求和、统计行数等,您可以使用Search接口的统计聚合功能或者SQL查询来实现。具体操作,请参见统计聚合和SQL查询。
如果要快速导出数据,而不关心整个结果集的顺序时,您可以使用ParallelScan接口和ComputeSplits接口实现多并发导出数据。具体操作,请参见并发导出数据。