Una consulta booleana recupera filas de una tabla de datos al combinar varias subconsultas. Tablestore devuelve únicamente las filas que coinciden con las condiciones combinadas. Cada subconsulta puede ser de cualquier tipo, incluida otra consulta booleana.
Requisitos previos
Se inicializó una instancia de OTSClient. Para obtener más información, consulte Initialize an OTSClient instance.
Se creó una tabla de datos y se escribieron datos en ella. Para obtener más información, consulte Create a data table y Write data.
Se creó un índice de búsqueda para la tabla de datos. Para obtener más información, consulte Create a search index.
Parámetros
|
Parámetro |
Descripción |
|
table_name |
El nombre de la tabla de datos. |
|
index_name |
El nombre del índice de búsqueda. |
|
must_queries |
Operador AND. Tablestore devuelve solo las filas que cumplen todas las condiciones de las subconsultas. |
|
must_not_queries |
Operador NOT. Tablestore devuelve solo las filas que no cumplen ninguna de las condiciones de las subconsultas. Cuando se especifican varias subconsultas, este parámetro equivale a NOT(A OR B): se excluye una fila si coincide con cualquiera de las subconsultas. |
|
filter_queries |
Filtro que aplica lógica AND. Tablestore devuelve solo las filas que cumplen todas las condiciones del filtro. A diferencia de |
|
should_queries |
Operador OR. Tablestore devuelve las filas que cumplen como mínimo el número mínimo de condiciones de las subconsultas. La puntuación de relevancia de una fila aumenta por cada condición adicional de Utilice |
|
minimum_should_match |
Número mínimo de condiciones de |
Ejemplos
A continuación se muestra cómo usar cada cláusula de una consulta booleana. Todos los ejemplos llaman a $otsClient->search($request) con QueryTypeConst::BOOL_QUERY como tipo de consulta.
AND
Utilice must_queries para exigir que se cumplan todas las condiciones. El siguiente ejemplo devuelve las filas donde el campo keyword es igual a "keyword" Y el campo long está en el rango [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
Utilice should_queries junto con minimum_should_match para coincidir con cualquier condición. El siguiente ejemplo devuelve las filas donde el campo keyword es igual a "keyword" O el campo long está en el rango [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
Utilice must_not_queries para excluir las filas que coincidan con alguna de las condiciones. El siguiente ejemplo excluye las filas donde el campo keyword es igual a "keyword" O el campo long está en el rango [100, 101), es decir, NOT(condición A OR condición 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
Utilice filter_queries cuando necesite lógica AND sin calcular la puntuación de relevancia. El siguiente ejemplo devuelve las filas que cumplen ambas condiciones, pero no las puntúa según la cantidad de condiciones satisfechas.
$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);
Consultas combinadas
Anide consultas booleanas para construir lógicas complejas. El siguiente ejemplo coincide con las filas que satisfacen: (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);
Preguntas frecuentes
Referencias
-
Cuando utiliza un índice de búsqueda para consultar datos, puede emplear los siguientes métodos de consulta: term query, terms query, match all query, match query, match phrase query, prefix query, range query, wildcard query, Boolean query, geo query, nested query y exists query. Según sus necesidades de negocio, estos métodos le permiten consultar datos desde múltiples dimensiones.
Si necesita ordenar o paginar las filas que cumplen las condiciones de la consulta, utilice la función de ordenamiento y paginación. Para obtener más información, consulte Sorting and paging.
Si desea agrupar el conjunto de resultados con base en una columna específica, utilice la función collapse (distinct). De esta manera, los datos del tipo especificado aparecen una sola vez en los resultados de la consulta. Para obtener más información, consulte Collapse (distinct).
Para analizar los datos de una tabla, como obtener los valores extremos, la suma y el número total de filas, ejecute operaciones de agregación o sentencias SQL. Para obtener más información, consulte Aggregation y SQL query.
Si requiere obtener rápidamente todas las filas que cumplen las condiciones de la consulta sin necesidad de ordenarlas, llame a las operaciones ParallelScan y ComputeSplits para usar la función de escaneo paralelo. Para obtener más información, consulte Parallel scan.