Uma Boolean query recupera linhas de uma tabela de dados combinando múltiplas subconsultas. O Tablestore retorna apenas as linhas que atendem às condições combinadas. Uma subconsulta pode ser de qualquer tipo, incluindo outra Boolean query.
Pré-requisitos
Uma instância OTSClient foi inicializada. Para mais informações, consulte Initialize an OTSClient instance.
Uma tabela de dados foi criada e os dados foram gravados nela. Para mais informações, consulte Create a data table e Write data.
Um índice de pesquisa foi criado para a tabela de dados. Para mais informações, consulte Create a search index.
Parâmetros
|
Parâmetro |
Descrição |
|
table_name |
O nome da tabela de dados. |
|
index_name |
O nome do índice de pesquisa. |
|
must_queries |
O operador AND. O Tablestore retorna apenas as linhas que atendem a todas as condições das subconsultas. |
|
must_not_queries |
O operador NOT. O Tablestore retorna apenas as linhas que não atendem a nenhuma das condições das subconsultas. Quando múltiplas subconsultas são especificadas, este parâmetro equivale a NOT(A OR B): uma linha é excluída se atender a qualquer uma das subconsultas. |
|
filter_queries |
Um filtro aplicado com lógica AND. O Tablestore retorna apenas as linhas que atendem a todas as condições do filtro. Ao contrário de |
|
should_queries |
O operador OR. O Tablestore retorna as linhas que atendem ao número mínimo de condições das subconsultas. A pontuação de relevância de uma linha aumenta a cada condição adicional de Use |
|
minimum_should_match |
O número mínimo de condições de |
Exemplos
Os exemplos a seguir demonstram como usar cada cláusula de Boolean query. Todos os exemplos chamam $otsClient->search($request) com QueryTypeConst::BOOL_QUERY como tipo de consulta.
AND
Use must_queries para exigir que todas as condições sejam satisfeitas. O exemplo a seguir retorna as linhas em que o campo keyword é igual a "keyword" AND o campo long está no intervalo [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
Use should_queries com minimum_should_match para atender a qualquer condição. O exemplo a seguir retorna as linhas em que o campo keyword é igual a "keyword" OR o campo long está no intervalo [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
Use must_not_queries para excluir as linhas que atendem a qualquer uma das condições. O exemplo a seguir exclui as linhas em que o campo keyword é igual a "keyword" OR o campo long está no intervalo [100, 101) — ou seja, NOT(condição A OR condição B).
$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_queries
Use filter_queries quando precisar de lógica AND sem pontuação de relevância. O exemplo a seguir retorna as linhas que atendem a ambas as condições sem atribuir pontuação com base na quantidade de condições satisfeitas.
$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);
Combined queries
Aninhe Boolean queries para construir lógicas complexas. O exemplo a seguir retorna as linhas que satisfazem: (col2 < 4 OR col3 < 5) OR (col2 = 4 AND (col3 = 5 OR col3 = 6)).
$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' => [
// Final combination: (col2 < 4 or col3 < 5) or (col2 = 4 and (col3 = 5 or col3 = 6))
'should_queries' => [
[
'query_type' => QueryTypeConst::BOOL_QUERY,
'query' => [
// Combination 1: col2 < 4 or col3 < 5
'should_queries' => [
[
'query_type' => QueryTypeConst::RANGE_QUERY,
// Condition 1: col2 < 4
'query' => [
'field_name' => 'col2',
'range_to' => 4
]
],
[
'query_type' => QueryTypeConst::RANGE_QUERY,
// Condition 2: col3 < 5
'query' => [
'field_name' => 'col3',
'range_to' => 5
]
]
]
]
],
[
'query_type' => QueryTypeConst::BOOL_QUERY,
// Combination 2: (col2 = 4 and (col3 = 5 or col3 = 6))
'query' => [
'must_queries' => [
[
'query_type' => QueryTypeConst::TERM_QUERY,
// Condition 3: col2 = 4
'query' => [
'field_name' => 'col2',
'term' => 4
]
],
[
'query_type' => QueryTypeConst::BOOL_QUERY,
// Combination 3: (col3 = 5 or col3 = 6)
'query' => [
'should_queries' => [
[
'query_type' => QueryTypeConst::TERM_QUERY,
// Condition 4: col3 = 5
'query' => [
'field_name' => 'col3',
'term' => 5
]
],
[
'query_type' => QueryTypeConst::TERM_QUERY,
// Condition 5: col3 = 6
'query' => [
'field_name' => 'col3',
'term' => 6
]
]
],
'minimum_should_match' => 1
]
]
]
]
]
],
'minimum_should_match' => 1
]
]
],
// You can configure the columns_to_get parameter to specify the columns to return or specify that all columns are returned. If you do not configure this parameter, only the primary key columns are returned.
'columns_to_get' => [
//'return_type' => ColumnReturnTypeConst::RETURN_ALL // Specify that all columns are returned.
// Specify that the specified columns are returned.
'return_type' => ColumnReturnTypeConst::RETURN_SPECIFIED,
'return_names' => array('col1', 'col2')
]
);
$response = $otsClient->search($request);
FAQ
Referências
-
Ao usar um índice de pesquisa para consultar dados, os seguintes métodos de consulta estão disponíveis: term query, terms query, match all query, match query, match phrase query, prefix query, range query, wildcard query, Boolean query, geo query, nested query e exists query. Utilize métodos diferentes para consultar dados em múltiplas dimensões de acordo com seus requisitos de negócio.
Para ordenar ou paginar as linhas que atendem às condições de consulta, utilize o recurso de ordenação e paginação. Para mais informações, consulte Sorting and paging.
Para recolher o conjunto de resultados com base em uma coluna específica, utilize o recurso de colapso (distinct). Dessa forma, os dados do tipo especificado aparecem apenas uma vez nos resultados da consulta. Para mais informações, consulte Collapse (distinct).
Para analisar dados em uma tabela de dados — como obter valores extremos, somas e o total de linhas — execute operações de agregação ou instruções SQL. Para mais informações, consulte Aggregation e SQL query.
Para obter rapidamente todas as linhas que atendem às condições de consulta sem a necessidade de ordená-las, chame as operações ParallelScan e ComputeSplits para usar o recurso de varredura paralela. Para mais informações, consulte Parallel scan.